Bir sözcüğün her örneğine bir dizi tuş vuruşunu nasıl uygularım?


13

Ben her kelimeyi silmek istiyorsanız, bu kolay, çünkü böyle bir şey yapmak istiyorum:

:s%/WORD//g

Peki ya xyz"WORD" kelimesinin her geçtiği yerde yapmak istersem ? Örneğin, "WORD" içeren her satırı silmek istediğimi varsayalım. Bunu yapmanın birkaç yolunu düşünebilirim, ancak hiçbiri ideal görünmüyor.

1)

/WORD

ve daha ddnddnddnddn...fazla olay kalmayana kadar manuel olarak düğmesine basın . Ancak bunu yapmak için birçok satır varsa bu zaman alıcıdır.

2)

qd/WORD<enter>ddq

ve sonra WORD'ün kaç kez meydana geldiğini tahmin edin ve sonra örneğin:

500@d 

Ancak bu ya A) bir grup satırı kaçırır ya da B) bir sürü ekstra satırı siler.

Bunu yapmanın daha iyi bir yolu var mı?


3
Bildiğiniz gibi, 500@dtarif ettiğiniz gibi aslında güvenlidir. Arama terimi bulunamadığında makro oynatımı durur. Böylece, onu içeren tüm satırlar silindikten sonra "Kalıp bulunamadı: WORD" hatası göreceksiniz.
Wildcard

@Wildcard Teşekkür ederim, bunu bilmek gerçekten çok iyi!
James

Yanıtlar:


17

Bunun için :globalve :normalkomutlarını kullanabilirsiniz . :globalKomut sözdizimi aşağıdaki gibidir:

:global/{pattern}/{command}

Bu "pattern" in her oluşumunda "command" komutunu çalıştırır. Daha sonra, :normalkomutunu kullanarak bir sözcüğün her örneğinde bir dizi tuş vuruşu çalıştırmak için kullanabilirsiniz :global. Şöyle ki:

:g/WORD/normal {keystrokes}

Bu tuş vuruşları aşağıdaki gibi özel tuşlar içeriyorsa <Ctrl>, aşağıdaki :executekomutla birleştirebilirsiniz :

:g/WORD/exe "normal {keystrokes}"

Özel anahtarların her oluşumundan önce ters eğik çizgi koymanız gerektiğini unutmayın.

Bu komutlar hakkında daha fazla bilgi için bkz. :help :normalVe :help :global.


Beni dövün; Sanırım çok yavaş yazıyordum. :)
Wildcard

3

Sadece şeyiyle siz yapabilirsiniz kullanmak :substituteeşleşmesi durumunda, - sizin örnekte (WORD sahip bütün çizgi silme) - Tüm çizgiyi WORD içeren, örneğin:

:%s/^.*\<WORD\>.*\n

Bu, örtük bir "eşleşmeyi hiçbir şeyle değiştir" özelliğine sahiptir, yani:

:%s/^.*\<WORD\>.*\n//

İle birlikte \zs, \ze, \(- \), ve (gruplama) \=ile (yedek kısmen) submatch(), :substituteçok güçlü olabilir.


2

Görünüşe göre :global.

:g/WORD/d_

Alt çizgi ne yapar?
Wildcard

Bu çalışıyor, ancak bildiğim komutların hiçbiri çalışmıyor. "Bir editör komutu değil" almaya devam ediyorum.
James

1
@Wildcard: Alt çizgi kesilenleri atar. Yürütülen komut aslında :deleteve normal mod işlemi değil d.
Luc Hermitte

@DJMcMayhem: diğer normal işlemler için ihtiyacınız olacak :normal. Ve özel anahtarlara ihtiyacınız varsa, :exe-> `` exe "normal aFooFar \ <esc>"
Luc
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.