Kann ich ein interaktives: Ersetzen durchführen (Suche & ersetzen)?

Manchmal verwende ich :s mit einem komplizierten regulären Ausdruck, der möglicherweise korrekt ist oder nicht, oder ich bin es nicht Sicher, wenn ich alle Übereinstimmungen ersetzen möchte.

Kann ich Vim auf irgendeine Weise anweisen, jede gefundene Übereinstimmung zu bestätigen, bevor der Text tatsächlich ersetzt wird?

Antwort

Ja! Verwenden Sie das Flag c für :substitute. Von :help substitute:

[c] Confirm each substitution. Vim highlights the matching string (with hl-IncSearch). You can type: :s_c "y" to substitute this match "l" to substitute this match and then quit ("last") "n" to skip this match <Esc> to quit substituting "a" to substitute this and all remaining matches {not in Vi} "q" to quit substituting {not in Vi} CTRL-E to scroll the screen up {not in Vi, not available when compiled without the +insert_expand feature} CTRL-Y to scroll the screen down {not in Vi, not available when compiled without the +insert_expand feature} 

Die Verwendung eines Beispiels ist ganz einfach:

%s/old/new/gc 

Dies ist sehr nützlich, wusste aber erst vor 2 Wochen davon 🙂 Und es ist sogar in ol „vi 🙂

verfügbar Bonus-Tipp: Möglicherweise möchten Sie auch :set nowrapscan verwenden. Dies verhindert, dass Vim nach oben gewickelt wird, wenn es nach unten trifft. Ich habe festgestellt, dass dies besonders nützlich ist, wenn das Flag c verwendet wird.

Kommentare

  • Ich möchte auch hinzufügen, dass Sie iv id =“ hinzufügen sollten, wenn Sie alle Instanzen von old in derselben Zeile (nicht nur das erste Vorkommen) ersetzen möchten. 6fc16ce372 „>

am Ende des Befehls, sodass Sie insgesamt %s/old/new/gc

  • Oh, ja, ich habe set gdefault daher vergesse ich häufig, es in den Beispielen @ e271p314 hinzuzufügen.
  • Antwort

    Zusätzlich zu den Aussagen von Carpetsmoker:

    Die Einstellung &incsearch (set incsearch) in Vim ist sehr nützlich Verwenden Sie es zusammen mit einem nützlichen und wenig bekannten Trick.

    Der Trick besteht darin, Ihren komplexen regulären Ausdruck auszuprobieren, indem Sie einfach / oder . Vim verwendet die Einstellung &incsearch, um Übereinstimmungen interaktiv anzuzeigen. Onc Wenn Sie mit dem regulären Ausdruck zufrieden sind, können Sie :%s//replacement verwenden, damit vim die vorherige Suche verwendet.

    Beachten Sie, wie der Teil in // ist leer (hier setzen Sie den zu durchsuchenden Text ein). Wenn Sie das Feld leer lassen, weisen Sie Vim an, den vorherigen Suchausdruck zu verwenden. Mit dieser Funktion können Sie einen komplexen regulären Ausdruck mit / eingeben und alle Vorteile von set incsearch nutzen und dann die %s//replacement, um das Suchen und Ersetzen tatsächlich auszuführen.

    Wenn Sie etwas Ähnliches wie incsearch für :s -Befehle wünschen, lesen Sie vim-over , aber ich bevorzuge nur die native Vim-Methode.

    Kommentare

    • Früher habe ich eine Variante davon verwendet: Verwenden Sie einfach :%s/pattern/replace/ und drücken Sie dann u, um rückgängig zu machen. Sie können die Teile sehen, die Vim geändert hat Wenn Sie hlsearch aktiviert haben. Und Sie können diesen Text erneut durch ^R ersetzen.

    Antwort

    Meine bevorzugte interaktive Ersetzung besteht darin, mit / zu suchen und die Übereinstimmungen mit n .

    Wählen Sie dann match mit g n und dann s bis ersetzen Sie den Text durch einen beliebigen Text .

    Und wiederholen , indem Sie zum nächsten Spiel wechseln und drücken.

    Kommentare

    • Dies ist ein sehr schöner Trick, da er: (1) interaktiv ist, (2) Sie können das vorherige Spiel spielen, wenn Sie versehentlich übersprungen haben es (etwas, das Sie mit :s/old/new/gc nicht tun können).

    Antwort

    In Neovim gibt es auch die

    Option, mit der Sie eine Vorschau des Ergebnisses des Befehls :s anzeigen können, während Sie ihn eingeben.

    Antwort

    Zum Nutzen aller wurde incsearch in vim8 aktualisiert, um auch die Vorschau anzuzeigen, während Sie das Muster eingeben

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.