Bir düzenlemeyi Vim'de birden çok satırda nasıl tekrar ederim?


122

Vim'de bir komutu genellikle önüne bir sayı ekleyerek tekrar edebileceğimin farkındayım. Örneğin, 5 satırı şu şekilde silebilirsiniz:

5dd

Örneğin, bir komutun uygulanacağı bir dizi satır belirtmek de genellikle mümkündür.

:10,20s:hello:goodbye:gc

Nasıl 'dikey düzenleme' yapabilirim? Örneğin, belirli bir simgeyi, belirli bir simgeyi, örneğin virgül gibi, belirli bir satırdaki her satırın başlangıcına (boşlukları atlayarak, yani komut modunda Shift-I'den sonra virgül yazarsanız elde edeceğiniz şeyi atlayarak) eklemek istiyorum. Aralık. Bu nasıl başarılabilir (aşağı-dönem-aşağı-dönem-aşağı-döneme başvurmadan)?

Yanıtlar:


107

:10,20s/^/,/

Veya bir makro kullanın, şununla kaydedin:

q a i , ESC j h q

La kullan:

@ a

Açıklama: q aBir makro kaydetmek için kaydetmeye başlar a, qbiter kayıt. Bunun aiçin zkullanılabilecek kayıtlar var .


Teşekkürler. Ya bir shift-i'nin eşdeğerini istersem? Yani, başlangıçtaki boşluğa atlamak mı?
— saffsd

2
Açıklama: ^\(\s*\)başlangıçtaki boşluğu yakalar ve daha sonra okuyabileceğiniz bir kayıt defterine kaydeder \1.
— Svante

136

Ctrl- vgörsel moda blok halinde girer. Daha sonra hareket edebilirsiniz ( hjklnormal olarak-yönünde) ve birden çok satıra bir şey eklemek istiyorsanız Shift- kullanın i.

Yani metin için:

abc123abc
def456def
ghi789ghi

Eğer vurursan Ctrl- vimlecinizle 1'in üzerinde, isabet jiki sütun inmek için iki kez, daha sonra Shift- i,ESCbu şekilde görünecektir metin:

abc,123abc
def,456def
ghi,789ghi

(çok satırlı kesici uçta biraz gecikme olur ve siz vurana kadar işlenmez ESC).


3
Güzel. Ctrl-V büyük harf anlamına gelir, bu arada Ctrl-Shift-v
— Svante

8
aslında, ya CTRL-v ya da CTRL-V'dir. Vim, CTRL kodları için büyük / küçük harfe duyarlı değildir (bkz: yardım CTRL- {karakter}).
— 37'de rampa

2
Bu yöntemin neden işe yaramadığını biraz araştırdıktan sonra, i yerine büyük I (shift-i) kullanmasıdır (ayrıca, ctrl-shift-v beni sona taşıdığından sadece ctrl-v idi)
— Willyfrog

4
Merak ediyorum. Neden ishift tuşu olmadan kullanmıyorlar ?
— off99555

1
i vardiyasız olarak mevcut konuma yerleştirilir. shift + i satırın başına
— Kevin P


44

Zaten "." Son komutu çok tekrarlamak, sonra buldum bu şimdiye kadar en uygun çözüm olarak. Son komutunuzu kullanarak görsel bir bloğun her satırında tekrarlamanıza olanak tanır.

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
Bu yararlıdır, ancak aynı zamanda .görsel modda çalışan hat açısından sınırlıdır . Bu durumda görsel modun bazen bir çizgi aralığı seçmek için uygun olabileceğini düşünüyorum. Ancak komutlar ve makrolar bu durumda daha esnek ve güçlüdür.
— Bohr

23

Bunu yapmanın en kolay yolunun

1) bir satır için bir makro kaydedin, buna 'a' deyin; bu durumda bir tür

qa I, ESC jq

2) makroyu uygulamak istediğiniz satır bloğunu seçin

3) bu satır bloğu üzerinde makro 'a' çalıştırmak için 'norm' işlevini kullanın, yani,

:'<,'>norm@a

17

Bence en kolayı bir makro kaydetmek ve ardından makroyu istediğiniz kadar tekrarlamak. Örneğin, her satırın başına virgül eklemek için şunu yazarsınız:

q a I , ESC j q

bunu 5 kez tekrarlamak için

5 @ a


2

Düzenlemeniz .operatöre kaydedilmiş haldeyken aşağıdakileri yapın:

  1. Görsel modu kullanarak operatörü uygulamak istediğiniz metni seçin
  2. Ardından komutu çalıştırın :norm .

1

Satır aralığına virgül eklemenin özel durumu için (örneğin, satır 10'dan 20'ye kadar), zaten yanıtlanmış olan makrolardan ayrı olarak, aşağıdaki gibi bir şey yapabilirsiniz:

:10,20s/\(.*\)/,\1

Yani \ (ve \) ile numaralandırılmış bir grup eşleşmesi oluşturabilir ve "eşleşmenin içeriğiyle değiştir" demek için yerine geçen dizede \ 1 kullanabilirsiniz.

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.