Ersetzen Sie in Vim alle Vorkommen des aktuellen Terms unter dem Cursor

74

Wenn Sie *in Vim drücken , sucht der Editor in derselben Datei nach dem nächsten Vorkommen des Begriffs. Sie müssen den Begriff nicht mehr eingeben.

Gibt es eine schnelle Möglichkeit, den Begriff unter dem Cursor durch einen neuen zu ersetzen? Ein Zeichen, das den Befehl ausgibt und dann den neuen Begriff eingibt Enter.

Muchin
quelle
Sie können auch n für das nächste Spiel und b für das vorherige (vorherige) Spiel verwenden.
Orwellophile
@Orwellophile nfunktioniert nur bei mir bgeht auf Standard zurück (Wortanfang) #funktioniert bei mir wie erwartet, was auf den vorherigen Begriff zurückgeht.
JohnnyQ
@ JohnnyQ Entschuldigung Johnny, ich muss hoch auf Kleber gewesen sein. Es ist nfür das nächste und Nfür das vorherige. Es ist auf meiner Tastatur geschrieben, daher weiß ich nicht, wie ich es falsch verstanden habe.
Orwellophile

Antworten:

77

Sie können verwenden:

:%s/<c-r><c-w>/new value/g

Dabei <c-r><c-w>bedeutet, buchstäblich CTRL- rCTRL- weinzugeben, um das Wort unter den Cursor einzufügen.

skeept
quelle
116

Einfach benutzen *und dann:

:%s//new value/

Wenn Sie kein Muster angeben, verwendet der Ersatzbefehl das zuletzt gesuchte. Abhängig vom Wert gdefaultin Ihrer Konfiguration müssen Sie /gdiesem Befehl möglicherweise einen Modifikator hinzufügen .

Matteo Riva
quelle
3
Und wenn es new valueein &oder ein enthält /, entkommen Sie es einfach mit `\`.
Benoit
@sjas Was macht: se gd tun?
Yelsayed
:se gdoder :set gdefaultweist vim an, jedes Muster so zu behandeln, als hätte es am Ende einen / g-Modifikator (genauer gesagt, es kehrt die Bedeutung des / g-Flags um. Wenn Sie es also mit gdefaultaktiv verwenden, wird der Effekt deaktiviert)
Matteo Riva
Was wäre, wenn ich das gesuchte Wort in der Zeichenfolge verwenden müsste, durch die ich es ersetze? zB wenn das Wort unter meinem Cursor ist function_with_a_long_nameund ich alle seine Instanzen durch ersetzen muss self.function_with_a_long_name?
Parth Sharma
14

Zusätzlich zu den anderen Antworten können Sie weitere Tastenanschläge vermeiden, indem Sie Ihrer .vimrc-Datei das folgende Snippet hinzufügen, um eine globale Suche und Ersetzung durchzuführen.

" Search and replace word under cursor using F4
nnoremap <F4> :%s/<c-r><c-w>/<c-r><c-w>/gc<c-f>$F/i
Lieven Keersmaekers
quelle
1
Ich liebe es, beste Antwort im ganzen Internet für mich bisher;)
Andrzej Rehmann
1

Eine andere Option ist gn:

Suchen Sie nach dem zuletzt verwendeten Suchmuster wie mit nund starten Sie den visuellen Modus, um die Übereinstimmung auszuwählen.
Wenn sich der Cursor auf der Übereinstimmung befindet, wird er visuell ausgewählt.
Wenn ein Operator aussteht, wird das Match bearbeitet.
Beispielsweise löscht "dgn" den Text der nächsten Übereinstimmung.
Wenn der visuelle Modus aktiv ist, wird die Auswahl bis zum Ende des nächsten Spiels erweitert.
Hinweis: Im Gegensatz nzur Suchrichtung hängt dies nicht vom vorherigen Suchbefehl ab.

Wenn Sie also FOOden letzten Suchausdruck haben, können Sie die nächste Übereinstimmung durch BAREingabe ersetzen cgnBAR<Esc>und für die folgenden Übereinstimmungen mit wiederholen ..

Wenn Sie das Wort unter dem Cursor als Suchausdruck festlegen möchten, können Sie *N(oder *#) eingeben, um nach der nächsten Übereinstimmung zu suchen und zurückzukehren.

Wenn sich Ihr Cursor beispielsweise unter dem ersten FOOin dieser Zeile befindet:

<div class="FOO"><span id="FOO"><b>FOO:</b> FOO</span></div>

und wenn Sie tippen *NcgnBAR<Esc>..., erhalten Sie Folgendes:

<div class="BAR"><span id="BAR"><b>BAR:</b> BAR</span></div>
etuardu
quelle
0

Es ist eine Funktion, die ich mir auch gewünscht habe! Aber nicht nur für das Wort unter dem Cursor, sondern auch für eine visuelle Auswahl oder eine Bewegung.

Als Ergebnis (und aufbauend auf Ihren Antworten) habe ich dies zu meiner .vimrc hinzugefügt:

nnoremap <leader>g :set operatorfunc=SubstituteOperator<cr>g@
vnoremap <leader>g :<c-u>call SubstituteOperator(visualmode())<cr>

function! SubstituteOperator(type)
    if a:type ==# 'v'
        execute 'normal! `<v`>"my'
    elseif a:type ==# 'char'
        execute 'normal! `[v`]"my'
    else
        return
    endif

    let sub = input("substitute '".getreg("m")."' with ... : ")
    execute "%s/".getreg("m")."/".sub."/gc"
endfunction

Ich kann jetzt drücken Dinge wie \sw, \sf;oder \si(im normalen Modus oder \sim visuellen Modus und prompt gefragt werden , ob das, was ich mit meiner Auswahl ersetzen will.

(Bisher weiß ich nicht, ob ich die gleiche Eingabeaufforderung wie @Lieven möchte ...)

Marc Moreaux
quelle