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?
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?
Antworten:
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, hsodass Sie ein anderes auswählen können (indem Sie hden obigen Befehl in einen anderen Kleinbuchstaben ändern ), das Sie nicht verwenden.
vmap * y:let @/ = @"<CR>ausgewählt ist hervorgehoben.
<left><left><left>?
cvon befolgen gc, 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:
" search for visually hightlighted text
vnoremap <c-f> y<ESC>/<c-r>"<CR>
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 sSubstitution durchführen, indem Sie einfach Folgendes eingeben:
%s//<your-replacement-string>
... weil eine leere Suche im sBefehl die zuletzt gesuchte Zeichenfolge verwendet.
control+fwä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 :sBefehl funktioniert):

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.
" Escape special characters in a string for exact matching.
" This is useful to copying strings from the file to the search tool
" Based on this - http://peterodding.com/code/vim/profile/autoload/xolox/escape.vim
function! EscapeString (string)
let string=a:string
" Escape regex characters
let string = escape(string, '^$.*\/~[]')
" Escape the line endings
let string = substitute(string, '\n', '\\n', 'g')
return string
endfunction
" Get the current visual block for search and replaces
" This function passed the visual block through a string escape function
" Based on this - /programming/676600/vim-replace-selected-text/677918#677918
function! GetVisual() range
" Save the current register and clipboard
let reg_save = getreg('"')
let regtype_save = getregtype('"')
let cb_save = &clipboard
set clipboard&
" Put the current visual selection in the " register
normal! ""gvy
let selection = getreg('"')
" Put the saved registers and clipboards back
call setreg('"', reg_save, regtype_save)
let &clipboard = cb_save
"Escape any special characters in the selection
let escaped_selection = EscapeString(selection)
return escaped_selection
endfunction
" Start the find and replace command across the entire file
vmap <leader>z <Esc>:%s/<c-r>=GetVisual()<cr>/
Ich habe dies in mein vimrc aufgenommen, wenn das für irgendjemanden nützlicher ist.
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 gnBewegung verwenden, mit der Textbereiche ausgewählt werden, die dem aktuellen Suchmuster entsprechen.
Nachdem Sie cgnden Text in der aktuell ausgewählten Übereinstimmung geändert (oder dgngelö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.
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.
vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>
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:
:'<,'>s/red/green/g
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.
Ich habe dies in meinem vimrc:
function! GetVisual() range
let reg_save = getreg('"')
let regtype_save = getregtype('"')
let cb_save = &clipboard
set clipboard&
normal! ""gvy
let selection = getreg('"')
call setreg('"', reg_save, regtype_save)
let &clipboard = cb_save
return selection
endfunction
vmap <leader>z :%s/<c-r>=GetVisual()<cr>/
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.
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.
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 /\: :
vnoremap // y/\V<C-R>=escape(@",'/\:')<CR><CR>
Bei dieser Karte muss ich //im visuellen Modus drücken , um den aktuell ausgewählten Text im gesamten Puffer zu durchsuchen.
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.
"buchstäblich behandelt . <c-r>"arbeitete aber
Ich 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.
Beispiel 1. Zitieren Sie die Auswahl mit Sternen und halten Sie den Cursor am Anfang der Auswahl.
:%s,\%#\%V\_.*\%V/,**&**,c
Beispiel 2. Pipe ausgewählten Text mit base64:
:%s!\%#\%V\_.*\%V!\=system("base64 -w 0",@")!c
Erklärung LHS:
\%# matches cursor
\%V matches inside the selection only
\_. matches any character.
\_.* matches beginning to end of selection.
Erklärung RHS:
\=expr() Replace match with result of expr() for each substitution.
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 %seiner 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.
cingcErsetzen wird auf getan einmal im gesamten Puffer. Wenn Sie einen Fehler gemacht haben und ihn zurücksetzen möchten, geben Sie einfach denuBefehlsmodus ein. Ich mag diesen Ansatz besser, als jeden der Ersetzungen zu bestätigen (das passiert mit demcModifikator).