Wenden Sie den normalen Modusbefehl auf Regex-Übereinstimmungen an

10

Ich verwende den folgenden regulären Ausdruck, um eine Dokumentationszeichenfolge unter einer Clojure-Funktionsdefinition abzugleichen:

\vdefn.*\n\s*\zs"([^"]|\n)*"

Gibt es eine Möglichkeit, den gqBefehl für den normalen Modus (Zeilen formatieren) für alle Übereinstimmungen dieses Musters in einer bestimmten Datei auszuführen ?


quelle

Antworten:

10

Macht von g:

:g/\vdefn.*\n\s*\zs"([^"]|\n)*"/normal gngq

Der Teil zwischen den /s ist ziemlich selbsterklärend, da es sich um den regulären Ausdruck Ihrer ursprünglichen Frage handelt.

normal gngqam Ende ist etwas interessant. gnwählt die nächste Übereinstimmung des regulären Ausdrucks aus und gqformatiert diese Auswahl natürlich (wie Sie in Ihrer Frage erwähnt haben).

:gist der wirklich tolle Teil. Dies ist meiner Meinung nach eine der nützlichsten Funktionen von Vim. Der gBefehl ex verwendet einen regulären Ausdruck und einen Ex-Befehl und führt den Befehl in jeder Zeile aus, mit der der reguläre Ausdruck übereinstimmt. Wenn Sie noch nichts davon gelernt haben :g, empfehle ich dies dringend, da dies Ihre Produktivität erheblich steigern wird. Einige Ressourcen sind Vims eigene :help :goder Power of g im Vim-Wiki.

Türknauf
quelle
Das gnStück wählt aus der Zeile Vaus, in der das nächste (nicht in derselben Zeile) Auftreten des Musters ausgelöst wird. In der Dokumentation von Vim heißt es, dass bei aktivem visuellen Modus die Auswahl von der aktuellen Zeile bis zum nächsten Muster erweitert wird. Dies führt zu unerwünschtem Verhalten.
@merb Whoops, habe das nicht bemerkt. Bearbeitet.
Türknauf
Die Auswahl erfolgt weiterhin von der Zeile des Spiels bis zum nächsten Spiel. Das manuelle Durchlaufen der Befehle für den normalen Modus zeigt, dass //s<cr>ich am Anfang des Spiels in der aktuellen Zeile, aber //e<cr>am Ende des nächsten Spiels und nicht am aktuellen Spiel bin.
1
Das Problem scheint mit zu sein //s<cr>V. Wenn ich laufe, :normal Vgehe ich wie erwartet in den visuellen Linienmodus. Wenn ich :normal //s<cr>den Cursor starte, landet er "erwartungsgemäß am ersten Tag des Spiels. Wenn ich laufe :normal //s<cr>V, bekomme ich keine visuelle Auswahl.
1
Ich habe es gelöst. Der Befehl muss sein normal gngq. Vorschlagen einer Bearbeitung.