Sublimetext'teki gibi çok satırlı düzenleme Vim?


133

Gvim kullanmaya başladım ve çok satırlı düzenlemenin gvim'de nasıl çalıştığını tam olarak anlayamıyorum.

Örneğin:

Orjinal metin:

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

ctrl + q, jjjjjj, $ her şey seçildi, sonra çok satırlı ekleme yapmak için I tuşuna basıyorum.

Niyetim, ilk satırdaki gibi tırnak işaretleri eklemek ve ardından Esc tuşuna basmak:

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

Ne oldu? Sublimetext'e benzer bir davranış bekliyordum:

görüntü açıklamasını buraya girin

Bunun nasıl çalıştığını bilmiyorsanız, eylemleri her satır için tekrarlar. Bunu nasıl başarabilirim? Ve vim burada ne yapıyor?


İlk satırı değiştirmek için bir klavye makrosu kaydedin ve ardından diğer tüm satırlar için makroyu oynatın.
yüksek5

Yanıtlar:


215

Windows uyumluluk katmanını bırakarak kendinize bir iyilik yapın.

Görsel Blok moduna girmek için normal kısayol <C-v>.

Diğerleri makro kaydetmeyle ilgilenmiştir, işte birkaç başka fikir:

Yalnızca görsel blok modunu kullanma.

  1. İmleci ikinci kelimenin üzerine getirin:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Hit <C-v>girmek için görsel-blok modu ve dibe Seçiminizi genişletmek:

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. Elde I"<Esc>etmek için vurun :

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. İmleci üçüncü kelimenin son karakterine getirin:

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. Hit <C-v>girmek için görsel-blok modu ve dibe Seçiminizi genişletmek:

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. Elde A"<Esc>etmek için vurun :

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

İle görsel-blok modu ve Surround.vim .

  1. İmleci ikinci kelimenin üzerine getirin:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Hit <C-v>girmek için görsel-blok modu ve altta ve sağ doğru Seçiminizi genişletmek:

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    
  3. Hit S""ile seçiminizi çevrelemek için:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

İle görsel-hat moduna ve :normal.

  1. Hit Vbütün satırı seçmek ve alt kısmına doğru genişletmek için:

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    
  2. Şu komutu :'<,'>norm ^wi"<C-v><Esc>eea"<CR>elde etmek için şu komutu çalıştırın :

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
    • :norm[al]bir dizi satırda normal mod komutlarını çalıştırmanıza izin verir ( '<,'>parça, Vim tarafından otomatik olarak eklenir ve "seçilen alanda hareket et" anlamına gelir)

    • ^ imleci satırın ilk karakterine koyar

    • w sonraki kelimeye geçer

    • i""imleçten önce bir ekler

    • <C-v><Esc> Vim'in bu bağlamda bir kontrol karakteri girme yolu, işte burada <Esc> ekleme modundan çıkmak için kullanılır

    • ee sonraki kelimenin sonuna gider

    • a" ekler "imlecin arkasına

    • <CR> komutu yürütür

    Surround.vim kullanıldığında yukarıdaki komut şu hale gelir:

    :'<,'>norm ^wvees"<CR>
    

7
4. ve 5. adımlar gviçin, önceki görsel seçiminizi geri almak için tuşuna basmanızı ve ardından yatay olarak, belki de ile hareket etmenizi öneririm 2e. (Ne kadar çok satır, o kadar değerli gv!)
joeytwiddle

4
surround.vim snormal modda küçük ama Sgörsel modda büyük kullanır , bu nedenle surround.vim yönteminin 3. adımında tuş vuruşları şu olmalıdırS"
joeytwiddle

1
Görsel blok + Surround.vim'in 3. noktası S", olmamalıdırs"
zool

1
Görsel blok modu adım 5 ve 6 yerine imleci üçüncü kelimenin arkasına koyabilir ve tuşuna basabilirsiniz ..
Jonas

2
Bu harika, ancak bu yalnızca farklı satırlarda düzenlemek istediğiniz karakterlerin her satırda tam olarak aynı yatay konumda olduğu ve düzenlenen satırların birbiri ardına olduğu durumlarda işe yarar. Vim'de hangi satırda düzenleme moduna gireceğimizi seçemiyor muyuz?
Sublim'de

30

Bunlar, yukarıda verilen kullanıma hazır çözümlerden bazılarıdır, ancak Sublime gibi birden çok imleç sağlayan bazı eklentileri de deneyebiliriz.

Bence bu umut verici görünüyor:

Bir süredir terk edilmiş gibiydi, ancak 2014'te bazı katkıları oldu.

Akışa alışmam biraz zaman alsa da (oldukça Sublime benzeri ama yine de Vim gibi modal) oldukça güçlü.

Tecrübelerime göre, yüklü başka birçok eklentiniz varsa, bazı çatışmalarla karşılaşabilirsiniz!

Bu özellik için başka girişimler de var:

Bunlardan herhangi birinin iyileştirilmekte olduğunu fark ederseniz, lütfen çekinmeden düzenleme yapın.


Görünüşe göre github.com/osyo-manga/vim-over şu anda grubun en aktif olanı.
Wernight

Mükemmel, aradığım
buydu

1
Birçoğunu test ettikten sonra hlissner / vim- multiedit en iyi AFAIAC gibi görünüyor
Alexandre Bourlier


29

Vim'de bunu başarmanın birkaç yolu var. Yine de, Sublime Text'e en çok hangisinin benzediğini bilmiyorum.


İlki, çok satırlı ekleme modu aracılığıyla olacaktır . İmlecinizi ilk satırdaki ikinci "a" üzerine getirin, tuşuna basın Ctrl-V, tüm satırları seçin, ardından tuşuna basın Ive bir çift alıntı girin. Tuşuna basmak <esc>işlemi her satırda tekrarlayacaktır.


İkincisi, makrolar aracılığıyla. İmleci ilk karakterin üzerine getirin ve ile bir makro kaydetmeye başlayın qa. İle hakkınızı git llll, birlikte modunda insert girmek a, bir doublequote, mod eklemek çıkış indirdi ve ile satırın başına dönebilsem <home>(veya eşdeğeri). jBir satır aşağı gitmek için basın . İle kaydı durdurun q. Ve sonra makroyu ile yeniden oynatın @a. Birkaç defa.


Yukarıdaki yaklaşımlardan herhangi biri sizin için işe yarıyor mu?


15

"global" komutunu kullanırsanız, yapabileceklerinizi bir çevrimiçi ve herhangi bir sayıda satırda tekrarlayabilirsiniz.

:g/<search>/.<your ex command>

misal:

:g/foo/.s/bar/baz/g

Yukarıdaki komut foo içeren tüm satırları bulur ve bu satırdaki tüm bar oluşumlarını baz ile değiştirir.

:g/.*/

her satırda yapacak


1
Bu çok kullanışlı, bilmiyordum. Çok güçlü ve akıllı komut kombinasyonu gibi görünüyor.
0xc0de

Kolaylık sağlamak için, kelimeyi imlecin (veya görsel olarak seçilen kelimenin) altına alan, bir değiştirme talebinde bulunan ve :gburada açıklanan komutu çalıştıran küçük bir işlev yazdım . /gc"Onaylar" istemek için kullanmayı seviyorum, böylece her değişiklik için yya da vurabilirim ya nda ahepsini değiştirebilirim.
joeytwiddle

11
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)

3. adımda I, ekleme moduna giremiyorsunuz, bunun neden olduğunu biliyor musunuz?
Ninja

Hiçbir eklenti olmadan vim yüklemeyi vim -u NONEdeneyin : ve istenen eylemi tekrar gerçekleştirmeyi deneyin, bu, vim'inizin davranışını değiştiren bir harita veya eklenti olabilir.
SergioAraujo

6

Ne vimyaptığından emin değilim ama ilginç bir etki. Ne istediğinizi açıklama biçiminiz daha çok makroların nasıl çalıştığına benzer ( :help macro). Bunun gibi bir şey, makrolarla istediğinizi yapacaktır (normal moddan başlayarak):

  1. qa: Kaydedilecek makroyu kaydedin a.
  2. 0w: 0satırın başına git, wbir kelime atla.
  3. i"<Esc>: Ekleme moduna girin, a ekleyin "ve normal moda dönün.
  4. 2e: İkinci kelimenin sonuna atla.
  5. a"<Esc>: Ekle a ".
  6. jq Sonraki satıra geçin ve makro kaydını sonlandırın.

Birlikte alındıklarında: qa0wi"<Esc>2ea"<Esc>

Artık makroyu ile çalıştırabilir, @ason makroyu ile tekrarlayabilirsiniz @@. Dosyanın geri kalanına uygulamak için, 99@a99'dan fazla satıra sahip olmadığınızı varsayan bir şey yapın , makro yürütme dosyanın sonuna ulaştığında sona erecektir.

İstediğinizi nasıl elde edeceğiniz aşağıda açıklanmıştır visual-block-mode(normal moddan başlayarak):

  1. İlk alıntının olmasını istediğiniz yere gidin.
  2. Girin visual-block-mode, Gdosyanın altına gitmek için etkilemek istediğiniz satırları seçin .
  3. Hit I"<Esc>.
  4. Eklemek istediğiniz sonraki noktaya gidin ".
  5. Az önce yaptığınız şeyi tekrar etmek istiyorsunuz, böylece basit bir şey .yeterli olacaktır.

4
99 @ a'ya gerek yok. Bir dosyanın her satırında bir makro yürütmek istiyorsanız şunu deneyin:% norm! @a.
Kale

Noktalar olmadan (sadece cümlelerin
sonlarıdır

9999@açirkin olabilir, ancak yazmaktan çok daha kolaydır :%norm! @ave yeni düzenlediğiniz satırda yeniden çalışmaz. Yine de bilmek güzel. :)
joeytwiddle

0

Benim çözümüm şu 2 eşlemeyi kullanmak:

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

Onları nasıl kullanacaksınız:

  1. Çizgilerinizi seçin. Sonraki 12 satırı seçmek istersem sadeceV12j
  2. Basın <leader>n
  3. Satırda değişikliklerinizi yapın
  4. Normal modda olduğunuzdan emin olun ve ardından <leader>m

Başka bir düzenleme yapmak için seçimi tekrar yapmanız gerekmez. Sadece tuşuna basın <leader>n, düzenlemenizi yapın ve <leader>muygulamak için tuşuna basın .


Bu nasıl çalışır:

  • <Esc><Esc>0qq Görsel seçimden çıkın, satırın başına gidin ve bir makro kaydetmeye başlayın.

  • q Makroyu kaydetmeyi durdurun.

  • :'<,'>-1normal!@q<CR> Görsel seçimin başlangıcından sonundan önceki satıra kadar her satırda makroyu oynatın.

  • <Down> Son satıra geri dönün.


Aynı anahtarı yalnızca farklı modlar için de eşleyebilirsiniz:

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

Bu, başka bir düzenleme yapma yeteneğinizi bozsa da. Hatlarınızı yeniden seçmeniz gerekecek.

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.