Comment changer sélectivement une chaîne en surbrillance?

11

En recherchant, j'ai mis en surbrillance la chaîne que je souhaite modifier. Maintenant, je veux remplacer uniquement le texte en surbrillance. J'utilise npour passer à l'instance suivante de la chaîne de recherche. Je pensais que je pouvais faire quelque chose comme ciwça, mais cela change tout le mot, pas seulement le texte en surbrillance.

Je connais bien, :%s/old/new/gmais je ne veux pas changer toutes les instances. Au lieu de cela, je veux avancer mon curseur sur chaque instance, puis décider de le modifier.

zundarz
la source

Réponses:

16

Utilisez la gnmotion pour modifier la correspondance de recherche actuelle. L'exemple suivant changera la correspondance actuelle en "FooBar":

cgnFooBar

La grande partie de cette technique est que vous pouvez répéter le changement via .. En supposant que le match suivant sera modifié de la même manière que vous pouvez simplement utiliser .pour répéter. Ou sautez quelques matchs via npuis utilisez ..

Vimcasts a un bel épisode à ce sujet: Fonctionnement sur les correspondances de recherche en utilisant gn

Pour plus d'aide, voir:

:h gn
Peter Rincker
la source
C'est certainement la voie à suivre lorsque vous avez différentes chaînes de remplacement que vous devez utiliser à différents endroits. Je ne suis pas sûr des nuances du mode visuel qui semblent être invoquées gn, alors voici une méthode similaire que je viens de découvrir:c//e<CR>FooBar<Esc>//<CR>
Jeff
Existe-t-il un moyen de modifier toutes les sélections / correspondances à la fois? Fondamentalement, pour refactoriser?
Geremia
@Geremia, oui, :%s/oldtext/newstuff/gchangera toutes les correspondances oldtexten newstuff.
zundarz
@zundarz Je ne veux pas faire d'expression rationnelle, mais remplacer uniquement les noms de variables. Au lieu de frapper .plusieurs fois, je peux utiliser :%norm .( source ).
Geremia
7

Si vous avez déjà recherché un mot avec /wordou ?word.

Vous pouvez utiliser :%s//newword/gcpour remplacer le mot que vous avez précédemment recherché par newword, en laissant le terme de recherche ( s//..) vide.

Le cdrapeau indique que chaque changement doit être confirmé, en appuyant ypour oui ou npour non.

Jetez un œil à :help :s_flagspour plus d'informations sur le drapeau de confirmation.

Raphael Ahrens
la source
1
Je sais que vous avez dit à regarder l'aide, mais vous pourriez aussi bien mentionner expressément vous pouvez également appuyer l, aet q(ou <Esc>) pour diverses façons de conclure le cycle de confirmation.
Jeff
2

Méthode n ° 1

Vous pouvez profiter des mappages gnet gNpour accomplir ce que vous voulez. gnrecherchera le dernier terme de recherche utilisé et sélectionnera visuellement la correspondance. gNfait exactement la même chose, sauf qu'il recherche en arrière. Lorsqu'il est combiné avec un opérateur tel que c, l'opérateur sera appliqué à la correspondance. Par exemple, si votre dernière chaîne de recherche est "foo" et que vous tapez cgn, il recherchera vers l'avant la prochaine instance de "foo", la supprimera et vous mettre en mode insertion pour saisir le texte de remplacement.

Pour plus d'informations à ce sujet, voir :help gnet :help gN.

Méthode n ° 2

Vous pouvez utiliser la :substitutecommande avec le cdrapeau. Cela vous demandera de confirmer chaque substitution. Par exemple, supposons que vous vouliez remplacer foo par bar dans tout le fichier, mais que vous vouliez confirmer chaque remplacement:

:%s/foo/bar/gc

Pour en savoir plus, consultez les rubriques d'aide: :help :s_flags, :help cmdline-rangeset :help :substitute.

Arbre à feuilles persistantes
la source