Ricerca interattiva / sostituzione di regex in Vim?


265

Conosco la regex per fare un rimpiazzo globale,

     %s/old/new/g

Come si fa a fare una sostituzione interattiva della ricerca in Vim ?

Risposte:


463

Aggiungi il flag c (nel prompt dei comandi di vim):

:%s/old/new/gc

ti darà un prompt sì / no ad ogni occorrenza di "vecchio".

"vecchio" è evidenziato nel testo;  nella parte inferiore della finestra dice "sostituisci con nuovo (y / n / a / q / l / ^ E / ^ y)?)"

La guida integrata di Vim offre informazioni utili sulle opzioni disponibili una volta selezionata la sostituzione con conferma. Uso:

:h :s

Quindi scorrere fino alla sezione sulle opzioni di conferma. Schermata seguente:

Testo che dice "[C] Conferma ogni sostituzione. [...] CTRL-Y per scorrere lo schermo verso il basso"

Ad esempio, per sostituire questa e tutte le partite rimanenti, utilizzare a.


30
+1, ho imparato qualcosa di nuovo oggi! vim ha tanti segreti nascosti .. :)
Marc Novakowski,

10
Imparare i comandi di VIM è un po 'come giocare a Nethack. Non puoi mai sapere quali meraviglie avrà un singolo personaggio.
Mark Biek,

22
Immagino che la "c" sia per "conferma"
matpie

8
Sinceramente non sto cercando di sembrare snarky, ma tutto ciò sarebbe potuto essere trovato facendo ": help: s" che ti avrebbe portato direttamente a ": help: s_flags".
Jeremy Cantrell,

13
@jeremy: ciò richiede la conoscenza dell'esistenza del comando di aiuto e la necessità di digitare l'interruttore "due punti" per accedere al file di aiuto pertinente. Come o dove lo si potrebbe imparare?
Dennis,

79

Mark Biek ha sottolineato utilizzando:

%s/old/new/gc

per una ricerca globale sostituire con la conferma per ogni sostituzione. Ma mi piace anche verificare interattivamente che il vecchio testo corrisponda correttamente. Prima eseguo una ricerca con una regex, quindi riutilizzo quel modello:

/old.pattern.to.match
%s//replacement/gc

Il s//utilizzerà l'ultimo modello di ricerca.


9
Una delle cose più grandi sull'uso / apprendimento di vim è la profondità della tana del coniglio!
Ken,

2
Bene, stavo sempre facendo la ricerca, quindi usando <Cr> / per incollare l'ultima ricerca nel comando sostituto.
Atilla Filiz,

Esattamente quello che mi manca di Sublime Text!
Xenofex,

Questa risposta è particolarmente utile, poiché immagino molte volte che decidi di sostituire le istanze di una parola, è la parola che hai appena cercato.
M_M

20

Penso che tu stia cercando c, ad esempio s/abc/123/gc, questo farà sì che VIM confermi le sostituzioni. Vedi: aiuto: sostituire per ulteriori informazioni.


9

Di solito uso il comando find / substitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Quella find "old", substitute 3 characters for "new", find next, repeat substitute, e così via.

È una sofferenza per le sostituzioni di massa, ma ti consente di ignorare selettivamente alcune occorrenze di una volta (semplicemente premendo di nnuovo per trovare la successiva invece di .ripetere una sostituzione).


Uso anche questo, anche per testi simili. (3cW <texthere> <ESC> <sposta in nuova posizione>. <move>. <move>.)
strager

1
Non è un antipasto! È dolce. E puoi cercare nella direzione opposta usando N. Davvero buono se vedi una parola e vuoi cambiarla. * cwNewText <ESC> Nnn (salterà lontano dalla parola sotto il cursore, ma poi salterà indietro non appena avrai cambiato la prossima occorrenza.
PEZ

che cos'è <CR>?
Sother il

9

Se vuoi solo contare il numero di occorrenze di "abc", puoi farlo %s/abc//gn. Questo non sostituisce nulla ma riporta semplicemente il numero di occorrenze di "abc".


3

Se il testo sostitutivo deve cambiare per ogni occorrenza corrispondente (ovvero non semplicemente scegliendo Sì / No per applicare una sostituzione singolare) è possibile utilizzare un plug-in Vim che ho creato chiamato interattivo-sostituisci .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.