Posso fare un interattivo: substitute (search & replace)?

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 aggiungere g 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

  • Usavo una variante di questo: usa :%s/pattern/replace/ e poi premi u per annullare, puoi vedere le parti che Vim ha cambiato se hai hlsearch abilitato. Puoi sostituire di nuovo questo testo con ^R.

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

In Neovim cè anche il

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *