Kann ich ein interaktives: ersetzen (Suchen & Ersetzen)?


16

Manchmal verwende ich :seine komplizierte reguläre Ausdrucksweise, die möglicherweise nicht korrekt ist oder nicht sicher ist, ob ich alle Übereinstimmungen ersetzen möchte .

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

Antworten:


18

Zusätzlich zu dem, was Carpetsmoker gesagt hat:

Die &incsearch( set incsearch) Einstellung in Vim ist wirklich nützlich. Sie können es zusammen mit einem nützlichen und wenig bekannten Trick verwenden.

Der Trick besteht darin, Ihren komplexen regulären Ausdruck mit dem Befehl /oder zu ?testen. Vim verwendet diese &incsearchEinstellung, um Übereinstimmungen interaktiv anzuzeigen. Sobald Sie mit dem regulären Ausdruck zufrieden sind, können Sie :%s//replacementvim die vorherige Suche verwenden lassen.

Beachten Sie, dass der Teil in //leer ist (hier setzen Sie den zu suchenden Text ein). Wenn Sie dieses Feld leer lassen, weisen Sie Vim an, den vorherigen regulären Suchtext zu verwenden. Mit diesem Befehl können Sie einen komplexen regulären Ausdruck mit /und mit allen Vorteilen von eingeben set incsearchund dann den %s//replacementBefehl verwenden, um das Suchen und Ersetzen tatsächlich auszuführen.

Wenn Sie nach :sBefehlen suchen möchten , sehen Sie sich vim-over an . Ich bevorzuge jedoch die native Vim-Methode.


Früher habe ich eine Variante davon verwendet: Benutze einfach :%s/pattern/replace/und drücke dann uzum Rückgängigmachen. Du kannst die Teile sehen, die Vim geändert hat, wenn du sie hlsearchaktiviert hast . Und Sie können diesen Text wieder durch ersetzen ^R.
Martin Tournoij

17

Ja! Verwenden Sie die cFlagge 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 Beispielnutzung ist einfach:

%s/old/new/c

Dies ist sehr nützlich, wusste es aber erst vor 2 Wochen :-) Und es ist sogar in der alten Version erhältlich :-)

Bonus-Tipp: Möglicherweise möchten Sie auch verwenden :set nowrapscan; Dies verhindert, dass Vim nach oben umgebrochen wird, wenn es auf den Boden trifft. Ich habe festgestellt, dass dies besonders nützlich ist, wenn die cFlagge verwendet wird.


7

Meine bevorzugte interaktive Substitution ist die Suche mit /und das Durchlaufen der Übereinstimmungen mit n.

Wählen Sie dann Übereinstimmung mit gnund aus, sum den Text durch einen beliebigen Text zu ersetzen .

Und wiederholt , indem zum nächsten Spiel zu bewegen und drücken.


Dies ist ein sehr netter Trick, denn es ist: (1) interaktiv, (2) Sie können zum vorherigen Spiel gehen, wenn Sie es versehentlich übersprungen haben (etwas, das Sie nicht verwenden können :s/old/new/gc).
Ayrat

3

In Neovim gibt es auch die 'inccommand'Option, mit der Sie eine Vorschau des :sBefehlsergebnisses anzeigen können, während Sie es eingeben .


1

incsearchWurde in vim8 zum Wohle aller aktualisiert und zeigt jetzt auch die Vorschau, während Sie das Muster eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.