Wie wende ich eine Reihe von Tastenanschlägen auf jedes Vorkommen eines Wortes an?

13

Wenn ich jedes Wort löschen möchte, ist das einfach, denn ich würde so etwas tun:

:s%/WORD//g

Aber was ist, wenn ich xyzmit jedem Vorkommen von "WORD" verfahren möchte ? Angenommen, ich möchte jede Zeile löschen, die "WORD" enthält. Ich kann mir ein paar Möglichkeiten vorstellen, aber keine davon scheint ideal zu sein.

1)

/WORD

und drücken Sie dann manuell, ddnddnddnddn...bis keine Vorkommen mehr vorhanden sind. Dies ist jedoch zeitaufwändig, wenn viele Leitungen vorhanden sind, um dies durchzuführen.

2)

qd/WORD<enter>ddq

und dann rate mal, wie oft WORD vorkommt, und dann zum Beispiel:

500@d 

Aber dies wird entweder A) ein paar Zeilen verpassen oder B) ein paar zusätzliche Zeilen löschen.

Gibt es einen besseren Weg, dies zu tun?

DJMcMayhem
quelle
3
Nur damit Sie wissen, 500@dwie Sie beschreiben, ist es eigentlich sicher. Die Makrowiedergabe stoppt, sobald der Suchbegriff nicht gefunden wird. Es wird also nur der Fehler "Muster nicht gefunden: WORT" angezeigt, nachdem alle Zeilen, die es enthalten, gelöscht wurden.
Wildcard
@Wildcard Danke, das ist wirklich gut zu wissen!
DJMcMayhem

Antworten:

17

Hierfür können Sie die Befehle :globalund verwenden :normal. Der :globalBefehl hat die folgende Syntax:

:global/{pattern}/{command}

Dies führt "Befehl" bei jedem Auftreten von "Muster" aus. Sie können dann den :normalBefehl verwenden, um bei jedem Auftreten eines Wortes mit eine Reihe von Tastenanschlägen auszuführen :global. Wie so:

:g/WORD/normal {keystrokes}

Wenn diese Tastenanschläge spezielle Tasten wie enthalten <Ctrl>, können Sie sie :executewie folgt mit dem Befehl kombinieren :

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

Beachten Sie, dass Sie vor jedem Auftreten eines Sonderschlüssels einen Backslash setzen müssen.

Weitere Informationen zu diesen Befehlen finden Sie unter :help :normalund :help :global.

Immergrüner Baum
quelle
Schlagen Sie mich dazu; Ich glaube, ich habe zu langsam getippt. :)
Wildcard
3

Der Vollständigkeit halber können Sie verwenden :substitute, wenn Sie - in Ihrem Beispiel (löschen Sie die gesamte Zeile mit WORD) - die gesamte Zeile mit WORD übereinstimmen, z.

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

Dies hat eine implizite "Übereinstimmung durch nichts ersetzen", dh es ist die kürzere Form von:

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

In Kombination mit \zs, \ze, \(- \)(Gruppierung) und \=(im Ersatzteil) mit submatch(), :substitutekann sehr mächtig sein.

VanLaser
quelle
2

Es scheint, dass Sie suchen :global.

:g/WORD/d_
Luc Hermitte
quelle
Was macht der Unterstrich?
Wildcard
Dies funktioniert, aber keiner der mir bekannten Befehle funktioniert. Ich bekomme immer "kein Editor-Kommando".
DJMcMayhem
1
@Wildcard: Der Unterstrich verwirft, was gerade geschnitten wird. Der ausgeführte Befehl ist tatsächlich :deleteund nicht der normale Betriebsmodus d.
Luc Hermitte
@DJMcMayhem: Für andere normale Vorgänge benötigen Sie :normal. Und wenn Sie spezielle Schlüssel benötigen, benötigen Sie möglicherweise sogar :exe-> `exe" normal aFooFar \ <esc> "
Luc Hermitte