Aller à la prochaine occurrence du mot que je viens de changer

12

Si j'ai les éléments suivants:

function foo(bar) {
    return bar + 1;
}

Et j'utilise cwpour changer le premier baren baz, comment passer à la correspondance suivante bar, afin que je puisse utiliser .pour effectuer le même changement?

Je ne peux pas l'utiliser *, car cela recherche le mot actuel sous le curseur, et je n'ai pas bêtement cherché pour barla première fois, donc ça nne marchera pas.

Existe-t-il un moyen simple de rechercher l'occurrence suivante du mot tel qu'il était avant de le modifier?

Je ne veux pas faire de recherche et remplacer, car soit il y a d'autres occurrences de bardans mon fichier que je ne veux pas changer, soit parce qu'il n'y avait que deux instances de bar, et j'ai oublié :%s/bar/baz/avant de commencer et c'est aussi beaucoup d'efforts pour changer la seule instance restante.

Roger Lipscombe
la source
2
Cela ne suit pas totalement le flux de travail que vous avez décrit, mais vim-oblique améliore la *recherche. Surtout, il permet de *sélectionner visuellement le mot actuel sans déplacer votre curseur. Une fois qu'il est installé, vous pouvez faire *ciwpour mettre l'ancien mot dans le registre de recherche et changer le mot. Ensuite, vous pouvez utiliser net ..
statox
Appuyez sur n pour passer à l'occurrence suivante du dernier motif recherché. Pourquoi tu n'as pas essayé ça?
SibiCoder
... parce que je n'ai pas cherché pour arriver à la première occurrence, donc ça nne marchera pas.
Roger Lipscombe

Réponses:

14

Le texte que vous venez de modifier a cwété coupé dans le registre sans nom afin que vous puissiez le réutiliser avec:

/<C-r>"<CR>

pour passer à la prochaine occurrence du texte couvert par votre dernière modification.

romainl
la source
5

Pour étendre hors de romainl comme un workflow complet ...

Si vous préférez effectuer une modification de ce type et que vous réalisez que vous devez appliquer les mêmes modifications sur un paragraphe / une fonction, vous pouvez utiliser les registres "et ..

Dans votre exemple, vous pouvez effectuer la modification initiale de l'argument. Si vous entrez en mode visuel (j'utiliserais Visual Line pour vous assurer de tout sélectionner correctement), puis appliquer une recherche et un remplacement.

V]] - Visual Line, à la fin du paragraphe / fonction.

  • : - Puisque vous êtes en mode visuel, cela devient :'<,'>
  • s/ - Trouver
  • CTRL+ "- dernier élément de rappel / suppression (barre dans l'exemple)
  • / - et remplacer
  • CTRL+ .- dernier insert (baz dans l'exemple)

Ce modèle prend un peu de temps pour s'y habituer car vous devez l'utiliser. La plupart du temps, vous voudriez simplement appliquer la recherche et le remplacement à la fonction entière, y compris l'argument, mais c'est une bonne façon de ne pas exécuter l'anti-modèle " correctement."

jecxjo
la source
2

Si cela ne vous dérange pas d'appuyer sur une combinaison différente cw, je pense que vous pouvez obtenir ce que vous voulez facilement, en définissant un raccourci. Ce que vous pouvez faire est de placer les éléments suivants

nmap <leader>a "1yiw:let @/=@1^Mciw

dans votre .vimrcdossier. Notez qu'il ^M s'agit d'une capture de la touche retour, et non des caractères ^et M. Vous l'obtenez en appuyant sur Ctrl+ Ven mode insertion suivi de Enter. Maintenant, avec cette définition, en appuyant sur <leader>afera la même chose que cw, mais maintenant le mot (avant le changement) sera dans votre "dernier registre de recherche" (c'est-à-dire le /registre), donc en appuyant sur naprès avoir fait le changement et retourné en mode normal vous amènera à la prochaine occurrence. De même, appuyer sur Nvous ramènera à l'occurrence précédente.

Le raccourci Vous pouvez bien sûr choisir un raccourci différent de <leader>a, mais je trouve juste que c'est un raccourci très accessible. Personnellement, je me suis fixé <leader>pour ,que je doive juste appuyer sur ,suivi a, mais c'est parce que je n'utilise pas de clavier américain, de sorte que mon \est quelque peu caché (je crois que \c'est le défaut <leader>).

Explication L'idée est vraiment simple. Tirez le mot sous le curseur vers le registre de recherche /, puis faites cw. C'est nmap <leader>a "/yciwce que je visais, mais malheureusement je ne pense pas que vous puissiez tirer sur le registre de recherche, donc la solution de contournement est de tirer le mot sous le curseur sur le 1registre, puis de définir le /registre égal à cela, puis de le faire cw. Il en "1yiwest de même de la partie qui tire le mot intérieur sous le curseur vers le registre 1. Si vous ne connaissez pas les mots intérieurs, vous pouvez vérifier :help iw. Ensuite, :let @/=@1une capture de Entermet le contenu du 1registre dans le /. À ce stade netNfonctionne comme l'occurrence suivante et précédente du mot sous le curseur, puis a ciwest fait pour que le mot sous le curseur soit supprimé et que Vim soit mis en mode insertion.

mot contre mot intérieur Je viens de réaliser que je supposais que vous vouliez le mot entier sous le curseur, et pas seulement du point du curseur et ainsi de suite. C'est pourquoi j'ai utilisé iwau lieu de wpartout. Si ce n'est pas le cas, vous devez utiliser

nmap <leader>a "1yw:let @/=@1^Mcw

au lieu. Si le curseur se trouve sur la première lettre du mot, il n'y a aucune différence.

Avertissement Cette solution ne sera probablement pas fonctionner correctement si vous essayez d'utiliser quelque chose qui contient des choses différentes de lettres, par exemple en ayant la position du curseur sur un \ou en remplaçant iwpar iW, ib, isou ipou quelque chose (bien que je ne sais pas pourquoi vous veulent cette fonctionnalité avec des phrases entières)

Kristian
la source