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.