A volte uso :s
con unespressione regolare complicata che può essere corretta o meno, oppure “non lo sono” sicuro di voler sostituire tutte le corrispondenze.
Cè un modo per dire a Vim di confermare ogni corrispondenza che trova prima che sostituisca effettivamente il testo?
Risposta
Sì! Utilizza il flag c
per :substitute
. Da :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}
Lutilizzo di esempio è semplice come una torta:
%s/old/new/gc
Questo è molto utile, ma non lo sapevo fino a 2 settimane fa 🙂 Ed è anche disponibile nel vecchio “vi 🙂
Suggerimento bonus: potresti anche voler utilizzare :set nowrapscan
; questo impedisce a Vim di spostarsi in alto quando colpisce il fondo. “Ho trovato questo particolarmente utile quando si utilizza il flag c
.
Commenti
- Vorrei anche aggiungere che se vuoi sostituire tutte le istanze di
old
nella stessa riga (non solo la prima occorrenza) dovresti aggiungereg
alla fine del comando, quindi in totale avrai%s/old/new/gc
- Oh, sì; ho
set gdefault
quindi tendo a dimenticarmi di aggiungerlo negli esempi @ e271p314 😅
Answer
Oltre a ciò che ha detto Carpetsmoker:
Limpostazione &incsearch
(set incsearch
) in Vim è davvero utile. Puoi usalo insieme a un trucco utile e poco conosciuto.
Il trucco è provare la tua complessa regex semplicemente usando /
o ?
. Vim userà limpostazione &incsearch
per mostrare le corrispondenze in modo interattivo. Onc Se sei soddisfatto dellespressione regolare, puoi utilizzare :%s//replacement
per fare in modo che vim utilizzi la ricerca precedente.
Nota come la parte in //
è vuoto (qui è dove metti il testo da cercare). Se lo lasci vuoto, stai dicendo a Vim di usare la precedente regex di ricerca. Con questo, puoi digitare unespressione regolare complessa con /
e avere tutti i vantaggi di set incsearch
, quindi utilizzare %s//replacement
per eseguire effettivamente la ricerca e la sostituzione.
Se vuoi qualcosa di simile a incsearch per i comandi :s
, controlla vim-over , ma preferisco semplicemente usare il modo nativo di Vim.
Commenti
Risposta
La mia sostituzione interattiva preferita è cercare utilizzando / e scorrere le corrispondenze utilizzando n .
Quindi seleziona corrispondenza utilizzando g n e poi s per sostituire il testo con quello che mi piace .
E ripeti passando alla corrispondenza successiva e premendo .
Commenti
- Questo è un trucco molto carino, perché è: (1) interattivo, (2) puoi andare alla partita precedente se lhai saltata accidentalmente it (qualcosa che non puoi fare utilizzando
:s/old/new/gc
).
Rispondi
che consente di visualizzare in anteprima il risultato del comando :s
durante la digitazione.
Risposta
A vantaggio di tutti, incsearch
è stato aggiornato in vim8 per mostrare anche lanteprima durante la digitazione del pattern
:%s/pattern/replace/
e poi premiu
per annullare, puoi vedere le parti che Vim ha cambiato se haihlsearch
abilitato. Puoi sostituire di nuovo questo testo con^R
.