Recherche interactive / remplacer l'expression régulière dans Vim?

266

Je connais le regex pour faire un remplacement global,

     %s/old/new/g

Comment procédez-vous pour effectuer une recherche-remplacement interactive dans Vim ?

Kal
la source

Réponses:

464

Ajoutez l'indicateur c (dans l'invite de commande vim):

:%s/old/new/gc

vous donnera un oui / non à chaque occurrence de «ancien».

"old" est mis en évidence dans le texte;  au bas de la fenêtre, il est écrit "remplacer par un nouveau (y / n / a / q / l / ^ E / ^ y)?)"

L'aide intégrée de Vim offre des informations utiles sur les options disponibles une fois la substitution avec confirmation sélectionnée. Utilisation:

:h :s

Faites ensuite défiler jusqu'à la section sur les options de confirmation. Capture d'écran ci-dessous:

Texte qui dit "[C] Confirmer chaque substitution. [...] CTRL-Y pour faire défiler l'écran vers le bas"

Par exemple, pour remplacer ceci et toutes les correspondances restantes, utilisez a.

Mark Biek
la source
30
+1, j'ai appris quelque chose de nouveau aujourd'hui! vim a tellement de secrets cachés .. :)
Marc Novakowski
10
Apprendre les commandes vim, c'est un peu comme jouer à Nethack. Vous ne savez jamais ce que le personnage va faire.
Mark Biek
22
J'imagine que le "c" est pour "confirmer"
matpie
8
Honnêtement, je n'essaie pas de paraître sarcastique, mais tout cela aurait pu être trouvé en faisant ": help: s" qui vous aurait conduit directement à ": help: s_flags".
Jeremy Cantrell
13
@jeremy: cela nécessite de savoir que la commande help existe, et de savoir qu'il faut taper le commutateur "deux points" pour accéder au fichier d'aide correspondant. Comment ou où apprendrait-on cela?
Dennis
79

Mark Biek a souligné en utilisant:

%s/old/new/gc

pour une recherche globale remplacer par confirmation pour chaque substitution. Mais, j'aime aussi vérifier de manière interactive que l'ancien texte correspondra correctement. Je fais d'abord une recherche avec une expression régulière, puis je réutilise ce modèle:

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

Le s//utilisera le dernier modèle de recherche.

Vincent Scheib
la source
9
L'une des plus grandes choses à propos de l'utilisation / de l'apprentissage de vim est la profondeur du trou du lapin!
ken
2
Bien, je faisais toujours la recherche, puis j'utilisais <Cr> / pour coller la dernière recherche dans la commande de substitution.
Atilla Filiz
Exactement ce qui me manque dans Sublime Text!
Xenofex
Cette réponse est particulièrement utile, car j'imagine souvent que vous décidez de remplacer des instances d'un mot, c'est le mot que vous venez de rechercher.
M_M
20

Je pense que vous recherchez c, par exemple s/abc/123/gc, cela entraînera VIM pour confirmer les remplacements. Voir: aide: remplacer pour plus d'informations.

Logan Capaldo
la source
9

J'utilise généralement la commande find / substitute / next / repeat :-)

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

C'est find "old", substitute 3 characters for "new", find next, repeat substituteet ainsi de suite.

C'est une douleur pour les substitutions massives, mais cela vous permet d'ignorer sélectivement certaines occurrences anciennes (en appuyant simplement à nnouveau pour trouver la suivante au lieu de .répéter une substitution).

paxdiablo
la source
Je l'utilise également, même pour des textes similaires. (3cW <texthere> <ESC> <déplacer vers un nouvel emplacement>. <move>. <move>.)
strager
1
Ce n'est pas un contre-modèle! C'est doux. Et vous pouvez rechercher dans la direction opposée en utilisant N. Vraiment bien si vous voyez un mot et que vous voulez le changer. * cwNewText <ESC> Nnn (Cela sautera loin du mot sous le curseur, mais sautera en arrière dès que vous aurez changé l'occurrence suivante.
PEZ
c'est quoi <CR>?
Sother
9

Si vous voulez simplement compter le nombre d'occurrences de «abc», vous pouvez le faire %s/abc//gn. Cela ne remplace rien mais signale simplement le nombre d'occurrences de 'abc'.

Amjith
la source
3

Si votre texte de remplacement doit changer pour chaque occurrence correspondante (c'est-à-dire ne pas simplement choisir Oui / Non pour appliquer un remplacement singulier), vous pouvez utiliser un plugin Vim que j'ai créé appelé interactif-replace .

hwrod
la source