Vim'de satırın ortasındaki metni birden çok satıra nasıl ekleyebilirim?


91

Diyelim ki on satırım var ve bu satırlarda geçen bir kelimenin başına metin eklemek istiyorum. Satırın başında olmak zorunda değildir.

Kimden:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

to:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

Bu sadece öne eklemek mümkün de mi bar(aslında Surround ancak foobirlikte bar(foo)?

Ayrıca //yorumları birden çok satıra eklemenin hızlı bir yolunu (C tarzı yorumlar) istiyorum.

Vim / GVim 7.2 kullanıyorum.


1
C stili yorumlar şunlardır: / * * / BCPL stili yorumlar //
William Pursell

Yanıtlar:


169

İlkine gidin foo, görsel blok moduna girmek için Ctrl- tuşuna basın vve ile tüm satırlar fooişaretlenene kadar aşağıya basın . Sonra (bloğun) başına eklemek için Shift- tuşuna basın i. Bitirdiğinizde ve tuşuna basınEsc , eklenen karakterler işaretli bloğun solundaki her satıra eklenecektir.

Sonuna eklemek için tekrar Ctrl- tuşuna basın v, etkilenen tüm satırları işaretlemek için yukarı / aşağı hareket ettirin ve ardından seçimi satırların sonuna kadar genişletmek için Endveya tuşuna basın $. Şimdi basabilirsiniz Shift- atıpkı daha önce birlikte tüm satırlarının sonunda eklenecek Shift- i.

Görsel seçim, normal hareket komutları ile de yapılabilir. C'deki tüm bir bloğu yorumlamak için, açılış ayracına geçebilir ve Ctrl- v % Shift- yazabilirsiniz i // Esc.


5
Sadece bir ek: Ctrl-V, Windows'taki Vim'de görsel blok modunu başlatmazsa, bunun yerine Ctrl-Q kullanılmalıdır.
Paul

3
Cevabın bir varyasyonu, görsel bloğu shift + V ile işaretlemek ve ardından bloğu ex modda değiştirmektir:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / sonix_text / Note, "'< ":" düğmesine bastığınızda, '> "vim tarafından otomatik olarak yazdırılır.
dimba

1
Açıklamaları kaldırmak için görsel blok kullanın (Ctrl + V ile işaretleyin). Yorum işareti "//" olan sütunlardan biri, yorumları kaldırmak için "d" tuşuna basın. C ++ yorumlarını da unutma (/ ** /) :)
dimba

9
Linux'ta önek tüm satırlara uygulanmadan önce Ekleme modundan çıkmak zorunda kaldım ve bu, Görsel moddan ekleme moduna geçmek için ihtiyacım olan bir büyük harfti - örneğin Shift + I, yazım öneki, Escape, Escape.
Joshua Enfield

6
Bu macun üzerinde işe yaramaz. Bastığımda ihiçbir şey olmuyor. Ben bastığınızda shift+iseçim kaybolur ama (imleç sadece burada geçerli yerde) metin eklemek mümkün.
Jürgen Paul

44

İlk sorunuzu cevaplamak için aşağıdaki

:%s/foo/bar(&)/g

fooeşleşen deseni arayacak ve ile çevreleyecektir bar(). Bunu /gbir satırda birden çok kez yapacak.

Sadece eşleştiğine göre foo, basit bir yapabilirsin :s/foo/bar(foo)/g. Bununla birlikte, basit bir kelime (örneğin f[a-z][a-z]) yerine normal bir ifadeyle eşleşmeye karar verirseniz, yukarıdakiler işe yarayacaktır . Yukarıdaki '&', neyi eşleştirdiğinizi temsil eder.


Makrolarla uzun ve uzun bir cevabım vardı. Bu çok daha kolay :-)
Brian Ramsay

Bunu birden çok hat için nasıl yaparsınız? Pratik bir durum, bu değişikliği gerektiren benzer satırlardan oluşan bir kod bloğuna sahip olduğunuz zamandır.

Tüm satırlarda çalışıyor gibi görünüyor ...% s ve / g'ye dikkat edin.
ojrac

ilginç olan şu:% s / foo / bar (&) / gc onaylamıyor - 'c'nin etkisi yok ... Ugh

1
Arasındaki metin :ve sbu hatlar onu belirleyen çalışır. Hiçbir şey sadece mevcut satır anlamına gelmez. 1,301 ile 30 arasındaki satırlar (dahil) anlamına gelir. '<,'>mevcut görsel seçimdeki çizgiler anlamına gelir.
rampion

17

Bir dizi satırın önekini almak için iki farklı yaklaşımdan birini kullanıyorum:

Bir yaklaşım, blok seçimidir (sth ile bahsedilir). Genel olarak, ctrl-Vardından imleç hareketi ile dikdörtgen bir bölge seçebilirsiniz . Bir dikdörtgeni vurguladıktan sonra, tuşuna basmak dikdörtgenin shift-Isol tarafına veya dikdörtgenin sağ tarafına karakter shift-Aekleyecektir. Bu tekniği, önek eklemek, vurmak shift-I, öneki yazın ve ardından kaçmak istediğiniz satırların en sol sütununu içeren bir dikdörtgen yapmak için kullanabilirsiniz .

Diğer yaklaşım, bir ikame kullanmaktır (Brian Agnew tarafından belirtildiği gibi). Brian'ın değiştirmesi tüm dosyayı etkileyecektir (komuttaki%, "tüm satırlar" anlamına gelir). Sadece birkaç satırı etkilemek için en kolay yaklaşım, shift-Vilk / son satırdayken vurmak (görsel çizgi modunu etkinleştirir) ve ardından son / ilk satıra gitmektir. Ardından şunu yazın:

:s/^/YOUR PREFIX/

^ Bir normal ifadedir (bu durumda satırın başlangıcıdır). Bunu görsel çizgi modunda yazarak, '<,'> 'nin e-postaların önüne otomatik olarak eklendiğini göreceksiniz. Bu, ikame aralığının görsel seçim olacağı anlamına gelir.

Ekstra ipucu: Önekiniz eğik çizgi içeriyorsa, bunlardan ters eğik çizgiyle kaçabilir veya komutta ayırıcı olarak farklı bir noktalama karakteri kullanabilirsiniz. Örneğin, C ++ satır açıklamaları eklemek için genellikle şunu yazarım:

:s:^:// :

Bir sonek eklemek için, tüm satırlarınız tamamen aynı uzunlukta olmadıkça, ikame yaklaşımı genellikle daha kolaydır. Desen için ^ yerine sadece $ kullanın ve dizeniz önceden bekletilmek yerine eklenecektir.

Aynı anda bir önek ve bir sonek eklemek istiyorsanız, bunun gibi bir şey yapabilirsiniz:

:s/.*/PREFIX & SUFFIX/

. * Tüm satırla eşleşir. Yerine gelen & işareti, eşleşen metni (tüm satırı) geri koyar, ancak şimdi önekiniz ve sonekiniz eklenecektir.

BTW: Kod hakkında yorum yaparken, muhtemelen daha sonra açıklamasını kaldırmak isteyeceksiniz. ctrl-VEğik çizgileri seçmek için visual-block ( ) kullanabilir ve ardından bunları silmek için d'ye basabilir veya shift-Vöndeki eğik çizgileri kaldırmak için bir ikame (muhtemelen görsel bir çizgi seçimi ile yapılmış ) kullanabilirsiniz:

:s:// ::

6

: kurtarmaya normal!

:%norm Wibar(

:%norm WEa)

: norm (al) komutları siz yazmışsınız gibi tekrar oynatır:

W - sonraki kelimeye gider

i - ekleme modunu başlatır

bar (- 'bar (' dizisini yazar

Veya tek satırda:

:%norm Wibar(ctrlvESCEa)

Windows çalıştırıyorsanız, ctrlqyerine yazın ctrlv.


3

Yine başka bir olasılık (muhtemelen test durumunuzda pek kullanışlı değil, ancak diğer durumlarda kullanışlıdır) değiştirmek istediğiniz alanı işaretlerle kordon altına almaktır.

  • İmleci en üst satırda herhangi bir yere getirin ve 'a
  • İmleci son satırda herhangi bir yere getirin ve 'b
  • Komutu verin :'a,'b s/foo/bar(&)/

Ekranda her şey görünüyorsa genellikle görsel blok modunu severim ve genellikle başlangıç ​​ve bitiş birçok ekranla ayrılmışsa işaretleri tercih ederim.


Yeni bir işaretçi ayarlamak myerine olmalıdır '. 'mevcut bir işaretleyicinin satırına atlamak içindir. `o işaretçinin satırına ve sütununa atlar.
tiktak


0

C tarzı yorumlar için Brian'ın regexp yanıtını kullanın ve satır sonuyla eşleştirin $ve ekleyin.

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.