Vim: aynı karakterleri birden çok satıra ekle


306

Bazen birden çok satırda belirli bir görsel metin bloğunu düzenlemek istiyorum.

Örneğin, şöyle bir metin alırdım:

name
comment
phone
email

Ve böyle görünmesini sağlayın

vendor_name
vendor_comment
vendor_phone
vendor_email

Şu anda bunu yapmamın yolu ...

  1. VVe ardından jdört kez tuşuna basarak bir bloğun 4 satır satırının tümünü seçin .
  2. Girinti >.
  3. İle bir harf geri git h.
  4. İle görsel moda engelle Ctrlv.
  5. jDört kez basarak dört satırı seçin . Bu noktada 4x1 görsel boşluk (dört satır ve bir sütun) seçtiniz.
  6. Düğmesine basın C. Bu hemen hemen bir sütun sola girintili olduğuna dikkat edin.
  7. Bir dışarı yazın " vendor_"alıntı olmadan. Geri koymak zorunda ekstra alan dikkat edin.
  8. Düğmesine basın Esc. Bu, Escekleme modundan çıkmak için kullandığım birkaç kez biridir. Ctrlcyalnızca ilk satırı düzenler.
  9. 1. adımı tekrarlayın.
  10. İle diğer yolu girintileyin <.

Kelimelerin önünde en az bir boşluk olup olmadığını girintilememe gerek yok. Görsel bloğu temizlemek zorunda kalmazsam boşluklara ihtiyacım olmazdı c.

Ama eğer temizlemem gerekirse, o zaman girintili boşlukları girinti ile yaratmadan yapmanın bir yolu var mı?

Ayrıca neden aynı anda birden çok satırı düzenlemek, ekleme modundan çıkarak Escbitti Ctrlc?


İşte daha karmaşık bir örnek:

name    = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone   = models.CharField( max_length = 135, blank = True )
email   = models.EmailField( blank = True )

için

name    = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone   = models.whatever.CharField( max_length = 135, blank = True )
email   = models.whatever.EmailField( blank = True )

Bu örnekte, dikey görsel bloğu üzerine .yerleştiririm ve daha sonra ekleme modu, yani yazım sırasında yeniden yerleştiririm .whatever.. Umarım şimdi bu yöntemin dezavantajını görebilirsiniz. Yalnızca dikey konumda aynı olan bir metin sütunu seçmeyle sınırlıyım .


9
Daha iyi bir yol: ":% s / ^ / vendor_ /"
Paul

1
Yanıt için teşekkürler. Sadece her satıra bir kelime eklemek istersem işe yarar. Ancak kullandığım yöntem herhangi bir pozisyonda yapılabilir. Daha karmaşık bir örnekle başka bir örneğimi ekleyeyim.
hobbes3

3
Sonra shift-V ile değiştirmek istediğiniz satırları vurgulayın ve uygun bir arama ve değiştirme komutu yazın - ikinci örnekte,:s/models\./\0whatever./
Paul Tomblin

Yukarıdakilere ulaşmanın birçok yolu. Soru 1 sonra regex veya görsel mod tam olarak cevaplamak için esc çalışır cevaplarda sunulan güzel düzenlemek (GVIM görsel seçim tercih). Bölüm 2) için makro, Brian Neal tarafından sunulan en kolay yöntemdir. Tüm bu "nasıl yapılır" için bildiğim en iyi kaynak Drew Neil'in Pratik Vim'i. Bir formülü unutduğunuzda mükemmel hızlı okuma ve hafif referans. Umarım bu öneri birine yardımcı olur, birçok vim kullanıcısı için çabaya değer olacaktır.
arcseldon

@ Paul: Ve sen eğer sayma tuş vuruşlarını , değiştirmek olabilir \0ile &.
icktoofay

Yanıtlar:


912
  1. İmleci nin name.
  2. Görsel blok moduna girin ( Ctrlv).
  3. jÜç kez (veya 3j) tuşuna basın .
  4. I(Büyük harf i) tuşuna basın .
  5. Yazın vendor_. Not: Sadece ilk satırdaki ekranı güncelleyecektir - Escbasılana kadar (6.), bu noktada tüm satırlar güncellenecektir.
  6. Düğmesine basın Esc.

yöntemi gösteren mini screencast

IKüçük harf yerine büyük harf kullanılmalıdır i, çünkü küçük harf i, kendi başına oldukça yararlı olan bir metin nesnesinin başlangıcı olarak yorumlanır , örneğin bir etiket bloğunun ( it) içinden seçim yapmak için :

'it' metin nesnesinin kullanışlılığını gösteren mini ekran görüntüsü


12
Windows'ta çalışmak için bulamadım (CTRL + V pano yapıştırması için eşlendiğinden). Ancak Vim, bunu Windows sürümü için Ctrl + Q ile eşleştirdi .
Arnestig

2
@Ven: Vim o sırada gerçekten meşgul değil - sadece başka bir tuşa basmanızı bekliyor ve sonunda zaman aşımına uğradı. Sizin için iki deneme: ilk olarak, escape tuşuna basın ve sonra hemen jveya gibi başka bir tuşa basmayı deneyin ^L. Sonuçta Vim'in meşgul olmadığını görmelisiniz; sadece bekliyordu. İkinci olarak, (varsayılandan ziyade ) 'timeout'gibi daha düşük bir değere geçmeyi deneyin ve daha hızlı zaman aşımına uğradığını gözlemleyin. 801000
icktoofay

1
@icktoofay Ayarlamak istediğiniz değişkenin timeoutlenolmadığı anlaşılıyor timeout.
jez

4
@ANjaNA: Eklemek istediğiniz yerin tümü aynı sütundaysa (örneğin, sayıların tümü aynı uzunluktaysa), daha önce değil, seçilen bloktan sonra eklenecek olan basmak Ayerine aynı tekniği kullanabilirsiniz I. Çizgileriniz farklı uzunluklarda ise, bu işe yaramaz; Bunun için her satırın sonuna uygun bir ikame kullanmayı seviyorum, örneğin bazı satırları seçme ve kullanma :s/$/inserted/.
icktoofay

3
Bunu işe almak için esc tuşuna bastıktan sonra aşağı bastırmak zorunda kaldım
GeoSword

69

Başka bir yaklaşım da .( dot) komutunu ile birlikte kullanmaktır I.

  1. İmleci başlatmak istediğiniz yere taşıyın
  2. Basın I
  3. İstediğiniz öneki yazın (ör. vendor_)
  4. Düğmesine basın esc.
  5. jSatır aşağı gitmek için basın
  6. Ön .düzenlemeyi otomatik olarak tekrar ekleyerek son düzenlemeyi tekrarlamak için yazın
  7. jVe arasında hızlı bir şekilde geçiş yapın.

Bu tekniğin, az sayıda eklemeler için genellikle görsel blok modundan daha hızlı olduğunu ve bir aralıktaki her bir satıra metin eklemeniz gerekmiyorsa, ekstra j'lara basarak kolayca atlayabileceğiniz avantajına sahip olduğunu düşünüyorum. .

Çok sayıda bitişik ekleme için, blok yaklaşımının veya makronun muhtemelen daha üstün olacağını unutmayın.


Başka bir yaklaşım görmek güzel.
İbn Saeed

Bunu sadece birkaç satır için tercih ederim. IMO yürütmek çok daha kolay.
Dan Bechard

İstediğiniz öneki yazdıktan sonra escape tuşuna basmanız gerekmez mi?
iamnotsam

41
  1. Düğmesini kullanarak değiştirmek istediğiniz satırları seçin CtrlV.
  2. Basın:

    • I: Seçilenlerden önce ekleyin.
    • A: Seçilenlerden sonra ekleyin.
    • c: Seçilenleri değiştirin.
  3. Yeni metni yazın.

  4. EscDeğişiklikleri seçilen tüm satırlara uygulamak için basın .

4
Mükemmel! Benim Escgibi VIM noobs için son adımı vurgulamak istiyorum - değişikliklerin "daha sonra" yayıldığını anlamak biraz zaman aldı!
Bugs Bunny

1
Güzel, "A" ve "C" seçenekleri hakkında da bilmiyordum.
hobbes3

Bu neden işe yaramıyor v? Bunu yapabilirim Ctrl+V --> A, ancak vmetni seçmek için işe yaramaz - Asadece bu satıra eklenir. İkisi de seçim değil mi? Ayrıca, çok garip - Aeğer görsel bloğu satırın sonuna uzatırsam sadece satırın sonuna eklenir; aksi takdirde her satır için görsel bloğun bittiği yere eklenir. Sanki ave arasındaki farkı tanımıyor gibi A.
Alex G

1
Bunun cyerine kullanmak gerekiyordu C, ama mükemmel çalıştı. Teşekkür ederim
Tarol

29

Yaptığım eylemleri kaydetmek için bir makro kullanırdım ve sonra tekrar ederdim.

  1. İmlecinizi adın ilk harfine getirin .
  2. hit qqQ arabelleğine kaydetmeye başlamak için tuşuna .
  3. Hit iekleme modunda, tip geçmeye vector_ ve sonra vurmakEsc moduna insert bırakmak.
  4. Şimdi vur 0 satırın başına dönmek için basın.
  5. Şimdi vur j aşağı gitmek için .
  6. Şimdi qkaydı durdurmak için tekrar basın.

Artık güzel bir makronuz var.

Tip 3@qhatlarının gerisini için makro üç kez yürütmek.


"Q" özel mi ("hızlı makro" için)?
Peter Mortensen

Makro nasıl kalıcı hale getirilebilir (birkaç oturumda çalışarak)?
Peter Mortensen

@PeterMortensen Vim, aradığınız arabellekleri (ve diğer birçok şeyi) devam ettirecek oturumlar adı verilen bir özelliğe sahiptir.
Brian Neal

27
:%s/^/vendor_/

yoksa bir şey mi kaçırıyorum?


vender_Önekin istenmeyen diğer birçok satırı içeren bir dosyada muhtemelen bir alt metin olduğu gerçeğini kaçırıyorsunuz .
Dan Bechard

9
@dan Yalnızca bir alt metin gerekiyorsa, aramayı bir satır numarası kümesiyle sınırlandırabilirsiniz, örneğin1,4s/^/vendor_/
Brad Koch

1
@BradKoch İlginç. Satır numarası kısıtlamalarının farkında değildim, bunun için teşekkürler.
Dan Bechard

8
ilginç, ancak daha pratik olan, seçimi Vve türü ile görsel olarak engellemektir :. Bu, :'<,'>:'<,'>s/^/vendor_/
ed'in

12

Güncellendi Ocak 2016

Kabul edilen cevap harika bir çözüm olmakla birlikte, bu aslında biraz daha az tuş vuruşu ve prensipte kabul edilen cevaba dayanarak daha iyi ölçeklendirilir.

  1. İmleci nin name.
  2. Görsel blok moduna girin ( ctrlv).
  3. Basın 3j
  4. Düğmesine basın I.
  5. Yazın vendor_.
  6. Düğmesine basın esc.

görsel illüstrasyon

Bunun, verilen cevaptan daha az tuş vuruşuna sahip olduğuna dikkat edin (3. Adımı karşılaştırın). Sadece gerçekleştirilecek j eylem sayısını sayıyoruz.

Etkinleştirilmiş satır numaralarınız varsa (yukarıda gösterildiği gibi) ve taşımak istediğiniz satır numarasını biliyorsanız, 3. adım # ile değiştirilebilirG burada # istenen satır numarasıdır.

Yukarıdaki örneğimizde bu olurdu 4G. Ancak, sadece birkaç satır numarası ile uğraşırken açık bir sayı iyi çalışır.


7

Ben sadece vi (hayır nano) vardı bir sunucuda bazı yapılandırma dosyasında bir sürü satır yorum yapmak istedim , bu yüzden görsel yöntem de hantal oldu İşte nasıl bunu.

  1. Açık dosya vi file
  2. Satır numaralarını göster :set number! veya:set number
  3. Ardından, satır başlangıcını satır başlangıcını "#" ile değiştirmek için nasıl?

:35,77s/^/#/

Not: sayılar dahil, 35 ila 77 arasındaki satırlar, her ikisi de dahil edilecektir.

Bunu açmak / geri almak için şunu kullanın: :35,77s/^#//

Her kod satırından sonra yorum olarak bir metin kelimesi eklemek isterseniz, şunları da kullanabilirsiniz:

:35,77s/$/#test/ (Python gibi diller için)

:35,77s/;$/;\/\/test/ (Java gibi diller için)

Kredi / referanslar:

  1. /unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim

  2. /unix/120615/how-to-comment-multiple-lines-at-once


Bu benim için mükemmel bir çözümdü, çünkü genellikle sadece vim-tiny kullanıyorum.
JSON C11

7

Ayrıca bir metin bloğunu silmek ve değiştirmek istediğiniz bir kullanım durumunuz olabilir.

Bunun gibi

Hello World

Hello World

için

Hello Cool

Hello Cool

Her iki satırda da sadece görsel blok seçimi "Dünya" yapabilirsiniz.

Tip cdeğişikliği için - şimdi ekleme modunda olacaktır.

İstediğiniz şeyleri ekleyin ve kaçış tuşuna basın.

Her ikisi de dikey olarak yansıtılır. Bloğu eklemek yerine yeni metinle değiştirmesi dışında, tıpkı 'I' gibi çalışır.


6

Diyelim ki bu dosyanız var:

something

name
comment
phone
email

something else
and more ...

Dosyada nerede göründüklerine bakılmaksızın, "ad", "yorum", "telefon" ve "e-posta" önüne "vendor_" eklemek istiyorsunuz .

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc

cBayrak onay isteyecektir. İstemi istemiyorsanız bunu bırakabilirsiniz.


5

Daha esnek olabilen bir alternatif:

Örnek: Satırın başına XYZ metnini girmek için

:%norm IXYZ

Burada neler oluyor?

  • % == Her satırda çalıştır
  • norm == Normal modda aşağıdaki tuşları yürütün
  • I == Satırın başına ekle
  • XYZ == Girmek istediğiniz metin

Sonra vurdun Enter vurursunuz ve yürütür.

İsteğinize özel:

:%norm Ivendor_

Belirli bir aralık da seçebilirsiniz:

:2,4norm Ivendor_

Veya seçilen bir görsel aralıkta çalıştırın:

:'<,'>norm Ivendor_

1
daha ilginç şeyler yapmak için ekleme modundayken (Eabc <ESC> normu) <Esc> gibi tuş dizileri göndermek mümkün müdür?
batbrat

1
@batbrat Bunu anladım! ctrl-v ctrl-[Normal komutunuz için sizi "normal moda" geri çeken bir "çıkış Esc" eklemek için vurabilirsiniz . Ben sadece bunu , kaçan Esc '<,'>norm Iaa^[ysiw"nerede ile test ettim ^[.
Aubrey Lavigne

4
Use Ctrl+V to enter visual block mode
Move Up/Down to select the columns of text in the lines you want to comment.
Then hit Shift+i and type the text you want to insert.
Then hit Esc, wait 1 second and the inserted text will appear on every line

Bu yöntem vim'in tüm sürümlerinde çalışır mı veya vim eklentileri gerektirir mi? neden sormak b / c bazen bazı makinelerde çalışır, ancak bazen çalışmıyor. farkı anlayamıyorum. Windows üzerinde git ile birlikte gelen vim - i çalışamıyor. bazı ubuntu ve centos linux makinelerinde, çalışamıyorum. Birkaç nadir vakada başarı elde ettim, ancak başarıyı tekrarlayamadım. Bu bir gizem. ESC'ye bastıktan sonra hiçbir şey olmuyor gibi görünüyor.
davidj411

garip bir şekilde, şimdi benim için çalışıyor. hiçbir şey Sorunumla çözüm arayan, ben bu sayfada bulmak şey yaptığını ise o vim içinde için bakmak için bir şey söz olsa :) belki yıldızlı hariç değişti vim.wikia.com/wiki/Inserting_text_in_multiple_lines Vim sen olduğuna göre, çek : version komutunu girerek blockwise-operatörler özelliği (I, A ve daha fazlası). Çıktı + visualextra içermelidir.
davidj411

Cevabınıza değil, genel olarak bir yorum eklemek istedim. Bu cevapların çoğu aynı şeyi söylüyor ama farklı kelimeler kullanıyor. Benimkinde farklı bir teklif vardı ve bir link vardı.
davidj411

2
  1. Ctrl + v görsel blok moduna gitmek için
  2. Yukarı ve aşağı oku kullanarak satırları seçin
  3. Küçük harf girin 3i( küçük harfle basın I üç kez )
  4. I (basın sermayesi I . Bu, ekleme moduna geçmenizi sağlar.)
  5. Eklemek istediğiniz metni yazın
  6. Esc
  7. Aşağı oka basın
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.