Si j'ai les éléments suivants:
function foo(bar) {
return bar + 1;
}
Et j'utilise cw
pour changer le premier bar
en 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 bar
la première fois, donc ça n
ne 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 bar
dans 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.
*
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*ciw
pour mettre l'ancien mot dans le registre de recherche et changer le mot. Ensuite, vous pouvez utilisern
et.
.n
ne marchera pas.Réponses:
Le texte que vous venez de modifier a
cw
été coupé dans le registre sans nom afin que vous puissiez le réutiliser avec:pour passer à la prochaine occurrence du texte couvert par votre dernière modification.
la source
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.
:'<,'>
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."
la source
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 suivantsdans votre
.vimrc
dossier. Notez qu'il^M
s'agit d'une capture de la touche retour, et non des caractères^
etM
. Vous l'obtenez en appuyant sur Ctrl+ Ven mode insertion suivi de Enter. Maintenant, avec cette définition, en appuyant sur<leader>a
fera la même chose quecw
, 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 faitescw
. C'estnmap <leader>a "/yciw
ce 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 le1
registre, puis de définir le/
registre égal à cela, puis de le fairecw
. Il en"1yiw
est de même de la partie qui tire le mot intérieur sous le curseur vers le registre1
. Si vous ne connaissez pas les mots intérieurs, vous pouvez vérifier:help iw
. Ensuite,:let @/=@1
une capture de Entermet le contenu du1
registre dans le/
. À ce stade netNfonctionne comme l'occurrence suivante et précédente du mot sous le curseur, puis aciw
est 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é
iw
au lieu dew
partout. Si ce n'est pas le cas, vous devez utiliserau 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çantiw
pariW
,ib
,is
ouip
ou quelque chose (bien que je ne sais pas pourquoi vous veulent cette fonctionnalité avec des phrases entières)la source