Diciamo che abbiamo un testo e che entri in modalità visuale e seleziono del testo. Come faccio a cercare rapidamente il testo evidenziato e lo sostituisco con qualcos'altro?
Diciamo che abbiamo un testo e che entri in modalità visuale e seleziono del testo. Come faccio a cercare rapidamente il testo evidenziato e lo sostituisco con qualcos'altro?
Risposte:
Prova a eseguire quanto segue o inseriscilo nel tuo file .vimrc
vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
Premendo ctrl+ rin modalità visuale, ti verrà chiesto di inserire il testo da sostituire con. Premere entere quindi confermare ogni modifica che si accetta yo con cui si rifiuta n.
Questo comando sovrascriverà il tuo registro in hmodo che tu possa sceglierne un altro (cambiando hnel comando sopra con un'altra lettera minuscola) che non usi.
vmap * y:let @/ = @"<CR>selezionato è evidenziato.
<left><left><left>?
cda gc, dovrai anche rimuovere uno dei <left>alla fine della riga.
Questa mappatura rapida e semplice ricerca il testo evidenziato visivamente (senza sovrascrivere il registro h) e senza utilizzare il registro + dipendente dal terminale:
" search for visually hightlighted text
vnoremap <c-f> y<ESC>/<c-r>"<CR>
Se non ti piace il ctrl-f modificalo in base alle tue preferenze
Una volta che il testo è evidenziato puoi sempre fare una ssostituzione semplicemente digitando:
%s//<your-replacement-string>
... perché una ricerca vuota sul scomando utilizza l'ultima stringa cercata.
control+fseleziona sempre il personaggio successivo oltre a quello che ho selezionato visivamente. Qualche idea?
%s//<your-replacement-string>non sembra funzionare per evidenziare qualcosa di simile /tmp/file. diventa solo<your-replacement-string>/tmp/file
Anche questo funziona (almeno per le selezioni in una singola riga / selezioni che non contengono caratteri speciali)
y:s/<C-r>0/0 è il registro degli strattoni.
Come altre persone hanno detto, ci sono modi più veloci per farlo, ma se hai appena iniziato a imparare Vim (come me), questo è uno dei modi "generici".
// modifica: mi sono appena reso conto che l'approccio 'register' fallirà se ci sono caratteri come tabulazioni o newline o /caratteri nella selezione (dovrei elaborare manualmente quei caratteri in qualche modo affinché il :scomando funzioni):

La risposta accettata funziona alla grande a meno che tu non abbia caratteri speciali nella tua selezione visiva. Ho hackerato insieme due script (quello di Jeremy Cantrell pubblicato qui e quello di Peter Odding ) per creare un comando che ti permetta di selezionare visivamente una stringa che vuoi trovare anche se contiene caratteri speciali regex.
" 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>/
L'ho incluso nel mio vimrc se è più utile per chiunque.
vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>(che sostituisce solo tutto nel file)
Da Vim 7.4, puoi usare il gnmovimento che seleziona regioni di testo che corrispondono allo schema di ricerca corrente.
Dopo aver utilizzato cgnper modificare il testo nella corrispondenza attualmente selezionata (o dgnper eliminare), in modalità normale, è possibile utilizzare .per ripetere il comando e operare sulla corrispondenza successiva.
C'è un episodio di Vimcast che mostra questa funzione.
Mykola Golubyev, grazie per il suggerimento! Di seguito utilizza il registro "+" che (a seconda del terminale) contiene già il testo evidenziato, salvo utilizzando il registro "h".
vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>
Da http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection :
Quando il testo è selezionato visivamente, premere: per immettere un comando. La riga di comando entrerà automaticamente nell'intervallo:
:'<,'>
È possibile immettere un comando come s / red / green / g per sostituire ogni rosso con verde in tutte le righe dell'ultima selezione visiva. Il comando apparirà come:
:'<,'>s/red/green/g
Per ripetere un comando Ex su un blocco selezionato in precedenza, utilizzare: history. Cioè, premere: quindi, quindi modificare un comando precedente.
Ho questo nel mio 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>/
Questo afferrerà la selezione visiva e avvierà un comando di sostituzione con essa.
EDIT: vorrei sottolineare che questo non funziona con selezioni visive multilinea. Sebbene GetVisual () non abbia problemi a restituirlo, non sono sicuro di come inserirlo correttamente nella riga di comando. Se qualcuno ha dei suggerimenti su come potrei farlo, per favore commenta.
Non credo che tu possa farlo fuori dagli schemi. Ma a molte persone piace questa funzione, quindi ci sono tonnellate di macro e simili (l'ho aggiunto io stesso). Eccone uno che puoi aggiungere, ad esempio; basta premere *per cercare la corrispondenza successiva sul testo selezionato visivamente.
Altre risposte sono buone ma non sfuggono ai caratteri speciali. La risposta di @brian kennedy mostra un metodo per fuggire ma richiede molto codice. Nel caso di un URL, ad esempio, l'escape è obbligatorio o la ricerca si fermerà su ":".
Come scritto in vim.fandom.com/wiki/Search_for_visually_selected_text , puoi fare un oneliner per cercare ed eseguire l'escape di alcuni caratteri. Puoi sfuggire ai personaggi che vuoi, ho scelto di scappare /\: :
vnoremap // y/\V<C-R>=escape(@",'/\:')<CR><CR>
Con questa mappa, devo premere //in modalità visuale per cercare il testo attualmente selezionato sull'intero buffer.
La mia versione breve preferita di questo è
vnoremap s / y: s / "/
Quindi puoi evidenziare una selezione e premere semplicemente s / per avviare un comando di sostituzione per essa.
"come un letterale. <c-r>"ha funzionato però
Non ho il rappresentante per commentare, quindi aggiungo un'altra risposta ...
vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>
@dmd e @dotancohen: questo ha funzionato per me senza utilizzare up "h(usa esplicitamente 0, che è comunque l'ultima posizione di strappo) e funziona con putty ssh -> mint (lmde); non so di cent. Utilizza anche i commenti @Niloct e @Nathan Friend per rimuovere la conferma.
Esempio 1. Cita la selezione con le stelle, mantieni il cursore all'inizio della selezione.
:%s,\%#\%V\_.*\%V/,**&**,c
Esempio 2. Metti in pipe il testo selezionato con base64:
:%s!\%#\%V\_.*\%V!\=system("base64 -w 0",@")!c
Spiegazione LHS:
\%# matches cursor
\%V matches inside the selection only
\_. matches any character.
\_.* matches beginning to end of selection.
Spiegazione RHS:
\=expr() Replace match with result of expr() for each substitution.
Speravo ci fosse un modo integrato in Vim per sostituire una parola, senza dover riscrivere la parola in primo luogo. C'è, sebbene funzionerà solo per il testo fino a un carattere di confine di parola.
Dopo aver posizionato il mouse sulla parola, premere *o #per evidenziare la parola e passare alla posizione successiva / precedente di essa (se non si desidera modificare la posizione nel file, premere il tasto opposto per tornare alla posizione eri solo a).
Quindi digita semplicemente:
%s//<your-replacement-string>
Come accennato nella risposta di un'altra persona, se %sriceve una voce vuota tra le barre, utilizza la parola cercata in precedenza. Premendo *o #, stai cercando la parola sotto il cursore che la rende la parola cercata più di recente.
Alla fine sono solo sei o sette sequenze di tasti + lunghezza della parola sostitutiva per eseguire questa operazione e non richiede macro o modifica del tuo .vimrc.
cingc, la sostituzione viene eseguita immediatamente nell'intero buffer. Se hai commesso un errore e desideri ripristinarlo, digita semplicementeuin modalità di comando. Mi piace questo approccio di più rispetto alla conferma di ciascuna delle sostituzioni (che accade con ilcmodificatore).