Jak zastosować zestaw kombinacji klawiszy do każdego wystąpienia słowa?

13

Jeśli chcę usunąć każde słowo, jest to łatwe, ponieważ zrobiłbym coś takiego:

:s%/WORD//g

Ale co jeśli chcę zrobić xyzz każdym wystąpieniem „WORD”? Na przykład, powiedzmy, że chcę usunąć każdą linię, która zawiera „WORD”. Mogę wymyślić kilka sposobów, aby to zrobić, ale żaden z nich nie wydaje się idealny.

1)

/WORD

a następnie naciśnij ręcznie, ddnddnddnddn...aż nie będzie więcej wystąpień. Ale jest to czasochłonne, jeśli jest wiele linii, aby to zrobić.

2)

qd/WORD<enter>ddq

a następnie zgadnij, ile razy WORD występuje, a następnie, na przykład:

500@d 

Ale to albo A) pominie kilka linii lub B) usunie kilka dodatkowych linii.

Czy jest na to lepszy sposób?

James
źródło
3
Po prostu wiesz, 500@djak opisujesz, jest w rzeczywistości bezpieczny. Odtwarzanie makra zatrzyma się, gdy wyszukiwany termin nie zostanie znaleziony. Więc zobaczysz błąd „Nie znaleziono wzoru: WORD” po usunięciu wszystkich zawierających go wierszy.
Wildcard
@Wildcard Dziękuję, to naprawdę dobrze wiedzieć!
James

Odpowiedzi:

17

Możesz użyć do tego poleceń :globali :normal. :globalKomenda ma następującą składnię:

:global/{pattern}/{command}

Spowoduje to uruchomienie „polecenia” przy każdym wystąpieniu „wzorca”. Następnie możesz użyć :normalpolecenia, aby uruchomić serię naciśnięć klawiszy przy każdym wystąpieniu słowa przy użyciu :global. Tak jak:

:g/WORD/normal {keystrokes}

Jeśli te naciśnięcia klawiszy obejmują specjalne klawisze, takie jak <Ctrl>, możesz połączyć je z następującą :executekomendą:

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

Pamiętaj, że musisz wstawić ukośnik odwrotny przed każdym wystąpieniem specjalnego klucza.

Aby uzyskać więcej informacji na temat tych poleceń, zobacz :help :normali :help :global.

Wiecznie zielone drzewo
źródło
Pobij mnie do tego; Chyba pisałem zbyt wolno. :)
Wildcard,
3

Dla kompletności możesz użyć :substitute, jeśli dopasujesz - w swoim przykładzie (usuń całą linię zawierającą WORD) - całą linię zawierającą WORD, np .:

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

Ma to domyślnie „zamień dopasowanie na nic”, tzn. Jest to krótsza forma:

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

W połączeniu z \zs, \ze, \(- \)(grupowanie) oraz \=(w części zamiennej) z submatch(), :substitutemogą być bardzo silne.

VanLaser
źródło
2

Wygląda na to, że szukasz :global.

:g/WORD/d_
Luc Hermitte
źródło
Co robi podkreślenie?
Wildcard
To działa, ale żadne z poleceń, które znam, nie działa. Ciągle otrzymuję komunikat „nie polecenie edytora”.
James
1
@Wildcard: Znak podkreślenia odrzuca to, co jest cięte. :deleteWykonywane polecenie jest w rzeczywistości, a nie normalnym trybem działania d.
Luc Hermitte
@DJMcMayhem: do innych normalnych operacji potrzebujesz :normal. A jeśli potrzebujesz specjalnych kluczy, możesz nawet potrzebować :exe-> exe „normal aFooFar \ <esc>”
Luc Hermitte