Wie erhalte ich eine Vorschau für den Ersetzungsbefehl?

9

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 cFlagge 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?

Vitor Eiji
quelle
2
Das ist ein Whishlist-Element im Vim-Bug-Tracker (leider nicht gefunden)
Christian Brabandt
2
Für das, was es wert ist, verwende ich normalerweise die Substitution in der ersten Zeile, um sie ohne zu ersetzen %. Ü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 ...
statox
2
@ChristianBrabandt Gefunden . Es ist noch mit nicht klassifizierter Priorität ...
Vitor Eiji
2
@VitorEiji das war nicht der, an den ich dachte. Aber es spielt eigentlich keine Rolle, da es derzeit nicht möglich ist. Neovim bietet die Option "Befehl", die möglicherweise funktioniert (oder auch nicht, ich weiß es jetzt nicht wirklich)
Christian Brabandt
Das Böse zeigt eine Vorschau der Substitution an. Ich weiß allerdings nicht, wie es geht.
Geremia

Antworten:

2

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 nmit dem nächsten Bereich fertig sind.

Speziell für Ihren Fall:

  1. Suche nach Bereichen: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Starten Sie die Aufnahme eines Makros qq.
  3. Anwenden :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Beenden Sie die Aufnahme des Makros q
  5. Entweder rückgängig machen ( u) oder zum nächsten Suchergebnis gehen ( n).
  6. Makro anwenden @q.
  7. Wiederholen Sie die Schritte 5 und 6 nach Bedarf.

Offensichtlich nicht ganz das, wonach Sie gesucht haben, aber normalerweise mache ich das.

Tumbler41
quelle
Das ist cool! Ich habe nie bemerkt, dass sich eine Suche /damit auch als visuelle Auswahl verhält - schön.
the_velour_fog
@the_velour_fog " /... 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 using nzum nächsten Ereignis gelangen.
Tumbler41
1
Wenn Sie kein Muster dafür angeben :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.
Haegin
@ Tumbler41 ah, danke für die Klarstellung. Ja, ich mache auch diese grundlegende Suchtechnik , wende dann ein Makro an . Normalerweise fülle ich zuerst die Arglist aus und verwende :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/.../..../gcund fliegen Sie durch die Operation
the_velour_fog