Sehr oft muss ich eine Ersetzung durchführen, bei der Übereinstimmungen über eine große Datei verteilt und mit nicht trivialen Such- und Ersetzungsausdrücken versehen sind.
Angenommen, ich habe einige Funktionsaufrufe wie okFunction(arg1, arg2 arg3)
. Die Argumente unterscheiden sich natürlich bei jedem Funktionsaufruf. Sagen wir jetzt, ich habe eine bessere Funktion entdeckt, die nicht benötigt wird arg2
. Ich kann leicht die gesamte Datei mit anpassen
:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc
Obwohl konzeptionell einfach, bin ich mir nicht sicher, ob ich die Syntax in diesem ziemlich langen Muster richtig verstanden habe. Die c
Flagge hilft hier wirklich, aber das Problem ist, dass vim bei der Bitte um Bestätigung nicht anzeigt, durch was das Match ersetzt wird. Ich meine, es wird den Ersatzausdruck zeigen, aber nicht das ausgewertete Ergebnis. Wenn ich die Auswechslung mit bestätige y
, springt vim sofort zum nächsten Spiel und ich kann nicht sehen, ob ich Fehler gemacht habe.
Ich habe das vim-over- Plugin gefunden, das das Problem teilweise löst, aber nur, wenn beim Eingeben des Befehls alle Mathematikdaten auf dem Bildschirm angezeigt werden. Sobald Sie die Eingabetaste drücken, ist das Verhalten genau das gleiche, das ich oben beschrieben habe, und ich erhalte keine Vorschau.
Gibt es also eine Möglichkeit, vim dazu zu bringen, den Ersetzungsausdruck auszuwerten, wenn eine Bestätigung für Ersatzbefehle angefordert wird?
quelle
%
. Überprüfen Sie, ob das Ergebnis dem entspricht, was ich erwartet hatte, und verwenden Sie dann die Substitution mit%
(es sind nur ein paar Tastenanschläge :):<up><c-b>%
. Eine Vorschauoption wäre natürlich viel effizienter. Obwohl kein Patch verfügbar ist, könnte man die Ersetzung vielleicht mit dieser Option in eine Vimscript-Funktion einbinden, aber das klingt nach viel Arbeit ...Antworten:
Eine Problemumgehung sind Makros. Markieren Sie alle Problembereiche und ersetzen Sie sie jeweils in einer Zeile. Dann entscheiden Sie, ob Sie es wollen oder nicht. Sobald Sie
n
mit dem nächsten Bereich fertig sind.Speziell für Ihren Fall:
/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
qq
.:s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
q
u
) oder zum nächsten Suchergebnis gehen (n
).@q
.Offensichtlich nicht ganz das, wonach Sie gesucht haben, aber normalerweise mache ich das.
quelle
/
damit auch als visuelle Auswahl verhält - schön./
... verhält sich wie eine visuelle Auswahl." Eigentlich nicht. Der Grund, warum dies funktioniert, liegt darin, dass Sie:s//
auf die aktuelle Zeile reagieren und mit usingn
zum nächsten Ereignis gelangen.:s/pattern/replacement
, wird die letzte Suchzeichenfolge verwendet. In Schritt 3 können Sie also tatsächlich anwenden:s//betterFunction(\1, \3)/g
, um einige Eingaben zu speichern.:vimgrep /pattern/ ##
dann ein Makro . Wenn sich herausstellt, dass mein Muster tatsächlich konsistent übereinstimmt und das Makro zu langweilig ist, kann ich es dann schnell tun kehren Sie zurück:argdo %s/.../..../gc
und fliegen Sie durch die Operation