Kelimeleri alıntılamak / tırnak işaretlerini kaldırmak için hangi Vim komutları kullanılabilir?


206

Nasıl olabilir hızla alıntı / unquote kelime ve değişim (örneğin alıntı 'için "Vim)? Surround.vim eklentisini biliyorum , ama sadece Vim kullanmak istiyorum.


Bir çözüm gerçekten bağlama bağlıdır. Bunu tek bir satırda mı yoksa tüm dosyada mı yoksa sadece tek bir alıntılanmış dize için mi yapmak istiyorsunuz?
Lucas Oman

Tek bir kelime veya bir satırdaki tüm kelimeler için. Örneğin, yapıştırılan kelimeleri dizgi değişmezlerine dönüştürürken.
Eugene Yarmash

Yanıtlar:


255

surround.vim en kolay cevabınız olacak. Gerçekten kullanmaya karşı ayarlıysanız, işte neler yapabileceğinize dair bazı örnekler. Mutlaka en verimli değil, ama bu yüzden surround.vim yazıldı.

  • Tek tırnak kullanarak bir kelime alıntılama
    ciw'Ctrl+r"'
    • ciw - İmlecin açık olduğu sözcüğü silin ve ekleme moduna getirin.
    • ' - ilk teklifi ekleyin.
    • Ctrl+r"- Kaydın içindekileri ", diğer adıyla son / sil komutunu ekleyin .
    • ' - kapanış teklifini ekleyin.

  • Tek tırnak içine alınmış bir kelimeyi ayırma
    di'hPl2x
    • di' - Tek tırnak içine alınmış kelimeyi silin.
    • hP - İmleci bir satır sola hareket ettirin (açılış teklifinin üstünde) ve silinen metni alıntıdan önce getirin.
    • l - İmleci bir konum sağa götür (açılış teklifinin üstünde).
    • 2x - İki alıntıyı silin.

  • Tek tırnak işaretlerini çift tırnak olarak değiştirin
    va':s/\%V'\%V/"/g
    • va' - Alıntılanan kelimeyi ve tırnak işaretlerini görsel olarak seçin.
    • :s/ - Değiştirmeye başlayın.
    • \%V'\%V - Yalnızca görsel olarak seçilen bölgedeki tek tırnak işaretlerini eşleştirin.
    • /"/g - Hepsini çift tırnak işareti ile değiştirin.

1
Bunlar benim için iyi çalışıyor. Ekleme modunda yapıştırma işleminin Ctrl + op ile de mümkün olduğunu sadece googled.
Eugene Yarmash

1
Kayıt Modu (q) ile birlikte kullanıldığında, hızlı işler için cazibe gibi çalışır.
fil

Neden ciwve sadece cw? İlk kafa karıştırıcı ve ikinci işi iyi buluyorum.
Büyük McLargeHuge

18
@Koveras ciw, imlecinizin kelimede nerede olduğuna bakılmaksızın çalışır. cwyalnızca imleciniz kelimenin başlangıcındaysa çalışır. Bkz :help iw.
jamessan

10
Güzel bir hile vermek için en iyi cevabı kaçırmak: çift tırnak içine tek tırnak içine koymak için birkaç kelime varsa, @jamessan ilk çözüm .komut ile çalışmadığını fark edebilirsiniz . Çalıştırmak için kullanın ciw' Ctrl+r Ctrl+p". Daha sonra .aşağıdaki kelime için istediğiniz gibi davranacaktır: kaydın içeriğini hatırlamak yerine, şu anda kayıtta olanı istediğinizi hatırlayacaktır (açıklaması biraz zor, ama her ikisini de denerseniz, açık olacak) :-))
autra

183

Tek tırnak kullanarak bir kelime alıntılama

ciw'Ctrl+r"'

Bunu bu şekilde yapmak benim için daha kolaydı

ciw '' Esc P

8
Ne yazık ki, bu izin vermiyor gibi görünüyor. (tekrar et).
Wil Moore III

2
Ctrl + r genellikle ters geçmiş arama için zaten kullanıldığından, vim modlu terminallerde / repls'de kullanabileceğim için bunu tercih ederim.
krock

3
@wilmoore Yukarıdakileri makro olarak kaydedin ve tekrar oynatın.
Christopher

30

İşte size yardımcı olabilecek bazı eşlemeler:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

Eşleme değişkeni değişkenini değiştirmediyseniz, eşlemeyi \q" \q'veya ile etkinleştirin \qd. İmlecin altındaki kelimenin etrafına çift tırnak, imlecin altındaki kelimenin etrafına tek tırnak ekler, sırasıyla imlecin altındaki kelimenin etrafındaki tırnak işaretlerini silerler.


Harika fikir! Ben ekleyerek sona erdi map <Leader>' gewi'<Esc>A'<Esc>benim için .vimrcsatırın sonuna anki konumdan tek tırnak yorum eklemek için dosyanın; bazı MSDOS komut dosyalarını bash'e dönüştürürken bana yardımcı oldu.
ILMostro_7

@Geoff, tek tırnak için iyi çalışıyor. ama çift tırnak için kelime "in" "" "
insterts

@RameshVel Eşlemenin sağ tarafını etkileyen bazı makrolarınız olabilir. Eşleme komutunu diğer eşlemelerin genişletilmemesi için nnoremap olarak güncelledim. Eşlemeleri de geliştirdim. İmleç bir satırdaki ilk sözcüğün üzerindeyken öncekilerin sorunları vardı.
Geoff Reedy

Bu, bir seçimi tırnak işaretleri ile çevrelemek için görsel moda kolayca uyarlanabilir :vnoremap <leader>q c""<esc>P.
Dominik

27

Diğer komutlara ek olarak, bir satırdaki tüm kelimeleri çift tırnak içine alır (yorumunuza göre)

:s/\(\S\+\)/"\1"/

veya ters eğik çizgi sayısını azaltmak istiyorsanız \v, desenin başına (çok sihirli) bir değiştirici koyabilirsiniz

:s/\v(\S+)/"\1"/

Benim kopyalanan metin de virgül vardı, bu yüzden ben sadece bu değişti:s/\v([a-Z]+)/"\1"/g
tsukimi

22

Makro yollar!

  1. q kaydına kaydetmek için qve tuşlarına basın q("alıntıları" hatırlamak için kısayol olarak "q" kullanıyoruz).

  2. basın shift+ bakım kelimenin önüne hareket imleç

  3. basın itürü '(tek tırnak)

  4. tuşuna escbasın eve kelimenin sonuna gitmek için tuşuna basın

  5. basın aardından 'tırnak sözcüğü surround tekrar.

  6. Basın escnormal moda girmek.

  7. Son qolarak kayıt qdefterine kaydetmek için tuşuna basın .

Nasıl kullanılır

  1. İmleci istediğiniz kelimeye götürün.
  2. Basın @qBir kelimeyi tırnak işareti içine almak için .
  3. @@Başka bir kelimeye tekrarlamak istiyorsanız tuşuna basın .

İstediğiniz step 4herhangi bir şeyle {bir satır, bir karakter bulana kadar bir kelime vb.) Değiştirebilirsiniz.

Kayıtlı makroyu kalıcı yap

  1. açık .vimrc
  2. dosyanın sonuna git
  3. ekleme moduna geçin. kalıcı olması için bunu yazın:
@ q = ' ctrl+ r ctrl+ rq' olsun
  1. kaydet ve çık

  2. dosyalarınızı açın, bazı kelimelere gidin

  3. şimdi basın @q

doğru yaparsanız, kelimelerinizde sihirli şeyler görünmelidir.

Bu adımları sevdiğiniz diğer makrolar için de yapabilirsiniz.


3
Bu çözümü sevdiğimi söylemeliyim. Surround.vim gerekli değildir ve makroların kolayca çağrılması ve oluşturulması. Ayrıca ihtiyacınız olan her şey için kolayca kullanılabilir (benim için örneğin satırın sonuna kadar geçerli kelimeyi alıntılayın, ansible için mükemmel). Makroyu göstermek için: "qp. Kaydetmek için .vimrc adresine gidin ve şunu yapın: let @q = 'makro içeriği' (sadece tamlık için)
th3penguinwhisperer

Bunu çok beğendim. Bu makroları da iç içe yerleştirebilirsiniz. Böylece j kaydına kayıt yapabilir @q wve daha sonra nile tırnak kullanarak bir sonraki kelimeleri sarabilirsiniz n@j.
hidden-username

1
Makroyu kalıcı hale getirmek için bazı adımlar ekledim.
Brain90

1
Bilgiçlik, ama kelime ve WORD Vim'de farklıdır. Shift + b = B, bu nedenle 2. adım ideal olarak "... geçerli WORD'ün önüne" değiştirilmelidir. Ancak kelimenin başlangıcını kastediyorsanız, Shift kullanmanıza gerek yoktur.
Ambareesh

Puanınız için teşekkürler. WORD ile ilgilenmek için shift + b'yi bilerek kullanıyorum. Makro sözcük veya WORD [0] ile çalıştırılmalıdır. Aslında 3. adım da shift + e'ye değişmelidir. [0] stackoverflow.com/a/14390568/341959
Brain90

18

Tek tırnak içine almak (örneğin) ciw'<C-r>"'<esc>işe yarar, ancak tekrar işe yaramaz. Deneyin:

ciw'<C-r><C-o>"'<esc>

Bu, varsayılan kaydın içeriğini "tam anlamıyla" koyar. Şimdi .tırnak içine almak için herhangi bir kelimeye basabilirsiniz . Daha :h[elp] i_ctrl-rfazla bilgi edinmek için adresindeki metin nesneleri hakkında daha fazla bilgi edinin.:h text-objects

Kaynak: http://vimcasts.org/episodes/pasting-from-insert-mode/


2
Mükemmel ipucu! Birisi bundan bir harita yapmak isterse, uygun gösterim ciw'<C-R><C-O>"'<Esc>.
13'te

<Cr> "tam olarak ne yapar?
CodeCrack

@CodeCrack CTRL-R. CTRL-R, kaydın içeriğini imleçe ekler ve ekleme modunda kalır.
Erwin Rooijakkers

Bu, bahsettiğiniz gibi tekrarlanabilir, ancak bir makroda saklandığında, makroyu tekrarlamak .son gerçek aramanın içeriğini yeniden yazacaktır.
Sbu

7

VSCodeVim kullanıcıları için şunları yapabilirsiniz

vwS"

  • Değiştirebilirsiniz "Sarmak istediğiniz her şeyle .
  • wBaşka bir seçim operatörü ile değiştirebilirsiniz

2
Bu da MacVIM'de benim için iyi çalıştı, ancak viwS'kelimeyi tek tırnak içinde saran kullanmak zorunda kaldım . Şimdiye kadar en kolay.
Matt Grannary

bu yalnızca kelimenin başındaysanız çalışır. Eğer kelimenin içindeki herhangi bir yerden yapmak istiyorsanız, şunları yapabilirsiniz:viwS"
geoyws

6

Bunun için herhangi bir yerleşik vim komutu biliyorum ama kullanan yok r"f'r"' 've gelen değişikliğine r'f"r'' komutu "veya. Dan değişikliği' için 'işlerin ilk üzerine çıktığımda r', ne olursa olsun karakter cümledeki ile imlecin altında' ve f"sizi bir sonrakine taşır ".


1
Benim için en sezgisel "manuel" çözüm. Bunun yerine ikinci yedek komutunun (ve 'rve "r), sadece yazabilirsiniz .Ve daha tırnak değiştirmek istiyorsanız ;ve ,geçen tekrarlamak olarak önceki veya sonraki birine götürür f/F/t/Tsırasıyla aynı yönde veya zıt birinde arama.
Endre İkisi de

6

Teklif Ekleme

Bu hızlı ve kirli işlevi kullanmaya başladım .vimrc:

vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>

function! QuickWrap(wrapper)
  let l:w = a:wrapper
  let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
  normal `>
  execute "normal " . inside_or_around . escape(w, '\')
  normal `<
  execute "normal i" . escape(w, '\')
  normal `<
endfunction

Şimdi, istediğim her şeyi görsel olarak seçiyorum (tipik olarak viw- kelimenin içinden - görsel olarak iç kelimeyi seçerek ) ve Qçift ​​tırnak için tuşuna basıyorum veya qtek tırnak için basıyorum.

Teklifleri Kaldırma

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

Ben vim tırnak metin nesneleri olarak davranır vim-textobj-tırnak kullanın . Yapabileceğim Bu araçlar vaq(görsel seçmek tırnak çevresindeki Bu bulgular yakın tırnak. Ve görsel onları seçer. (Bu isteğe bağlıdır, sadece böyle bir şey yapabilirsiniz f"vww). Sonra basın siçin şerit seçimden tırnak.

Teklifleri Değiştirme

ÖPÜCÜK. Ben tırnak kaldırmak sonra tırnak ekleyin . 1. remove tek tırnak: Örneğin, çift tırnak ile tek tırnak yerine, ben adımlarını yapması gerekiyordu vaqs, 2. yeni tırnak işareti koyun: vwQ.



4

Vim eklentisini kullanıyorsanız https://github.com/tpope/vim-surround (veya önceden yüklenmiş vim-surround ile birlikte gelen VSCode Vim eklentisini) kullanıyorsanız, oldukça rahat!

Ekle

ysiw' // surround in word `'`

düşürmek

ds' // drop surround `'`

değişiklik

cs'" // change surround from `'` to `"`

Html etiketleri için bile çalışır!

cst<em> // change surround from current tag to `<em>`

daha iyi örnekler için github'daki benioku dosyasına bakın


2

Bir kelimeyi alıntılamak ve işaretini kaldırmak için kullanılabilecek bazı basit eşlemeler şunlardır:

" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>

1
Cevabınızı ayrıntılı olarak açıklayabilirseniz herkes için harika olurdu: eşlemeler nasıl eklenir, nasıl aranır vb. Teşekkürler.
Carles Alcolea

1
Bunu alıntı söylemek, çift tırnak ve yapmanız gereken unquote ediyorumqw qd wq
Nilon

bazı nedenlerden dolayı, çift tırnak sonunda "kelime" gibi ekstra teklif dönmek.
janicebaratheon

@ShuaiWang belki yüklü otobanlar veya benzer bir uzantı var mı? O hatayı kaldırmak benim için düzeltildi.
Nephilim

2

Vscode için VIM awsomely yapar. Vscode kullanmıyorsanız bir vim-surround tabanlı .

Bazı örnekler:

"test" imlecin içinde cs tipinde tırnak işareti "" ile sonuçlanır

"imleç ds tırnak işaretleri ile" test "ile bitirmek

"test" imlecin içinde cs tip tırnak işaretleri ile "t" ve <123> testi ile bitirmek için 123> girin

(test) ile bitirmek için kelime test tipi ysaw'da imleç ile test)


1

.Vimrc dosyamda nnoremap kullanıyorum

Bir kelimeyi tek tırnak içine almak için:

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

Tırnak işaretlerini kaldırmak için (çift tırnak işaretleri üzerinde de çalışır):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

Hatırlanması gereken kural: 'sq' = tek tırnak.


0

buna ne dersin?

 :%s/\'/"/g

2
Bu komut tüm dosya üzerinde çalışır. Sadece tek kelimeleri değiştirmem gerekiyor.
Eugene Yarmash

4
Olmadan, %tüm dosyayı seçmedikçe sadece mevcut satırda çalışır
Emily

0

Bunu yapan bir senaryo yazdım:

function! WrapSelect (front)
    "puts characters around the selected text.
    let l:front = a:front
    if (a:front == '[')
        let l:back = ']'
    elseif (a:front == '(')
        let l:back = ')'
    elseif (a:front == '{')
        let l:back = '}'
    elseif (a:front == '<')
        let l:back = '>'
    elseif (a:front =~ " ")
        let l:split = split(a:front)
        let l:back = l:split[1]
        let l:front = l:split[0]
    else
        let l:back = a:front
    endif
    "execute: concat all these strings. '.' means "concat without spaces"
    "norm means "run in normal mode and also be able to use \<C-x> characters"
    "gv means "get the previous visual selection back up"
    "c means "cut visual selection and go to insert mode"
    "\<C-R> means "insert the contents of a register. in this case, the
    "default register"
    execute 'norm! gvc' . l:front. "\<C-R>\""  . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>

Kullanmak için bir şeyi vurgulayın, l kontrolüne basın ve ardından bir karakter yazın. Eğer işlevin bildiği karakterlerden biriyse, doğru sonlandırma karakterini sağlayacaktır. Değilse, her iki tarafa eklemek için aynı karakteri kullanır.

Surround.vim bundan daha fazlasını yapabilir, ancak bu ihtiyaçlarım için yeterliydi.


-1

Seçilen bir metin bloğuna tek tırnak eklemek için görsel mod haritası örneği:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.