Angenommen, wir haben einen Text, und ich gehe in den visuellen Modus und wähle Text aus. Wie kann ich schnell nach dem markierten Text suchen und ihn durch etwas anderes ersetzen?
109
Versuchen Sie Folgendes auszuführen oder geben Sie es in Ihre ein .vimrc
vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
Durch Drücken von ctrl+ rim visuellen Modus werden Sie aufgefordert, Text einzugeben, durch den ersetzt werden soll. Drücken Sie enterund bestätigen Sie jede Änderung, mit der Sie einverstanden sind yoder die Sie ablehnen n.
Dieser Befehl überschreibt Ihr Register, h
sodass Sie ein anderes auswählen können (indem Sie h
den obigen Befehl in einen anderen Kleinbuchstaben ändern ), das Sie nicht verwenden.
c
ingc
Ersetzen wird auf getan einmal im gesamten Puffer. Wenn Sie einen Fehler gemacht haben und ihn zurücksetzen möchten, geben Sie einfach denu
Befehlsmodus ein. Ich mag diesen Ansatz besser, als jeden der Ersetzungen zu bestätigen (das passiert mit demc
Modifikator).vmap * y:let @/ = @"<CR>
ausgewählt ist hervorgehoben.<left><left><left>
?c
von befolgengc
, auch eines der<left>
am Ende der Zeile entfernen müssen .Diese schnelle und einfache Mapping-Suche nach visuell hervorgehobenem Text (ohne das h-Register zu überschreiben) und ohne Verwendung des terminalabhängigen + Registers:
Wenn Ihnen die Strg-F nicht gefällt, ändern Sie sie nach Ihren Wünschen
Sobald der Text markiert ist, können Sie jederzeit eine
s
Substitution durchführen, indem Sie einfach Folgendes eingeben:... weil eine leere Suche im
s
Befehl die zuletzt gesuchte Zeichenfolge verwendet.quelle
control+f
wählt ich immer das nächste Zeichen sowie das aus, was ich visuell ausgewählt habe. Irgendwelche Ideen?%s//<your-replacement-string>
scheint nicht zu funktionieren, um so etwas hervorzuheben/tmp/file
. es wird nur<your-replacement-string>/tmp/file
Dieser funktioniert auch (zumindest für Auswahlen in einer einzelnen Zeile / Auswahlen, die keine Sonderzeichen enthalten)
y
:s/<C-r>0/
0
ist das Ruckregister.Wie andere bereits erwähnt haben, gibt es schnellere Möglichkeiten, dies zu tun. Wenn Sie jedoch gerade erst mit dem Erlernen von Vim begonnen haben (wie ich), ist dies eine der „allgemeinen“ Möglichkeiten.
// edit: Ich habe gerade festgestellt, dass der 'Register'-Ansatz fehlschlägt, wenn
/
die Auswahl Zeichen wie Tabulatoren oder Zeilenumbrüche oder Zeichen enthält (ich müsste diese Zeichen irgendwie manuell verarbeiten, damit der:s
Befehl funktioniert):quelle
Die akzeptierte Antwort funktioniert hervorragend, es sei denn, Ihre visuelle Auswahl enthält Sonderzeichen. Ich habe zwei Skripte (die hier veröffentlichten von Jeremy Cantrell und die von Peter Odding ) zusammen gehackt , um einen Befehl zu erstellen , mit dem Sie eine Zeichenfolge visuell auswählen können, die Sie suchen möchten, auch wenn sie spezielle Regex-Zeichen enthält.
Ich habe dies in mein vimrc aufgenommen, wenn das für irgendjemanden nützlicher ist.
quelle
vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>
(die nur alle in der Datei ersetzt)Ab Vim 7.4 können Sie die
gn
Bewegung verwenden, mit der Textbereiche ausgewählt werden, die dem aktuellen Suchmuster entsprechen.Nachdem Sie
cgn
den Text in der aktuell ausgewählten Übereinstimmung geändert (oderdgn
gelöscht) haben, können Sie im normalen Modus.
den Befehl wiederholen und die nächste Übereinstimmung bearbeiten.Es gibt eine Episode von Vimcast, die diese Funktion zeigt.
quelle
Mykola Golubyev, Danke für den Tipp! Im Folgenden wird das Register "+" verwendet, das (abhängig von Ihrem Terminal) bereits den hervorgehobenen Text enthält, wodurch die Verwendung des Registers "h" vermieden wird.
quelle
Von http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection :
Wenn Text visuell ausgewählt ist, drücken Sie:, um einen Befehl einzugeben. Die Befehlszeile gibt automatisch den Bereich ein:
Sie können einen Befehl wie s / red / green / g eingeben, um jedes Rot in allen Zeilen der letzten visuellen Auswahl durch Grün zu ersetzen. Der Befehl wird wie folgt angezeigt:
Verwenden Sie den: history, um einen Ex-Befehl über einen zuvor ausgewählten Block zu wiederholen. Drücken Sie dann: und bearbeiten Sie einen vorherigen Befehl.
quelle
Ich habe dies in meinem vimrc:
Dadurch wird die visuelle Auswahl erfasst und ein Ersetzungsbefehl damit gestartet.
EDIT: Ich sollte darauf hinweisen, dass dies bei mehrzeiligen visuellen Auswahlen nicht funktioniert. GetVisual () hat zwar kein Problem damit, es zurückzugeben, aber ich bin mir nicht sicher, wie ich es richtig in die Befehlszeile einfügen soll. Wenn jemand Tipps dazu hat, kommentieren Sie dies bitte.
quelle
Ich glaube nicht, dass Sie dies sofort tun können. Aber viele Leute mögen diese Funktion, also gibt es jede Menge Makros und dergleichen (ich habe sie selbst hinzugefügt). Hier ist eine, die Sie zum Beispiel hinzufügen können; Drücken Sie einfach
*
, um nach der nächsten Übereinstimmung für den visuell ausgewählten Text zu suchen.quelle
Andere Antworten sind gut, aber sie entgehen keinen Sonderzeichen. Die Antwort von @brian kennedy zeigt eine Fluchtmethode, die jedoch viel Code erfordert. Im Fall einer URL ist beispielsweise ein Escapezeichen obligatorisch, oder die Suche wird mit ":" beendet.
Wie in vim.fandom.com/wiki/Search_for_visually_selected_text geschrieben , können Sie einen Oneliner erstellen, um einige Zeichen zu suchen und zu maskieren. Du kannst den Charakteren entkommen, die du willst. Ich habe mich entschieden zu entkommen
/\:
:Bei dieser Karte muss ich
//
im visuellen Modus drücken , um den aktuell ausgewählten Text im gesamten Puffer zu durchsuchen.quelle
Meine Lieblingskurzversion davon ist
vnoremap s / y: s / "/
Dann können Sie eine Auswahl markieren und einfach s / drücken, um einen Ersetzungsbefehl dafür zu starten.
quelle
"
buchstäblich behandelt .<c-r>"
arbeitete aberIch habe nicht den Repräsentanten, um einen Kommentar abzugeben, also füge ich noch eine weitere Antwort hinzu ...
vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>
@dmd und @dotancohen: Dies funktionierte bei mir ohne zu verbrauchen
"h
(verwendet explizit 0, was ohnehin die letzte Position ist) und funktioniert mit Kitt ssh -> mint (lmde); Ich weiß nichts über Cent. Verwendet auch Kommentare von @Niloct und @Nathan Friend, um die Bestätigung zu entfernen.quelle
Beispiel 1. Zitieren Sie die Auswahl mit Sternen und halten Sie den Cursor am Anfang der Auswahl.
Beispiel 2. Pipe ausgewählten Text mit base64:
Erklärung LHS:
Erklärung RHS:
quelle
Ich hatte gehofft, dass es in Vim einen eingebauten Weg gibt, um ein Wort zu ersetzen, ohne das Wort überhaupt neu eingeben zu müssen. Es gibt, obwohl es nur für Text bis zu einem Wortbegrenzungszeichen funktioniert.
Wenn Sie mit der Maus über das Wort gefahren sind, drücken Sie
*
oder#
, um das Wort hervorzuheben, und springen Sie zum nächsten / vorherigen Speicherort (wenn Sie den Speicherort in der Datei nicht ändern möchten, drücken Sie die entgegengesetzte Taste, um zum Speicherort zurückzukehren du warst gerade bei).Dann geben Sie einfach ein:
%s//<your-replacement-string>
Wie in der Antwort
%s
einer anderen Person erwähnt, wird bei Verwendung eines leeren Eintrags zwischen den Schrägstrichen das zuvor gesuchte Wort verwendet. Durch Drücken von*
oder#
suchen Sie unter dem Cursor nach dem Wort, wodurch es zum zuletzt gesuchten Wort wird.Am Ende sind es nur sechs oder sieben Tastenanschläge + Länge des Ersatzworts, um dies auszuführen, und es erfordert kein Makro oder eine Bearbeitung Ihres
.vimrc
.quelle