103 votes

Comment puis-je spécifier "le mot sous le curseur" sur la ligne de commande de VIM ?

Je veux écrire une commande qui spécifie "le mot sous le curseur" dans VIM. Par exemple, disons que j'ai le curseur sur un mot et que je le fais apparaître deux fois. Par exemple, si le mot est "abc" et que je veux "abcabc", je pourrais taper :

:s/\(abc\)/\1\1/

Mais ensuite, j'aimerais pouvoir déplacer le curseur sur "def" et utiliser la même commande pour le changer en "defdef" :

:s/\(def\)/\1\1/

Comment puis-je écrire la commande dans la ligne de commande pour qu'elle fasse cela ?

:s/\(*whatever is under the commandline*\)/\1\1

158voto

César Alforde Points 594

En mode ligne de commande, CTRL + R CTRL + W insère le mot sous le curseur.

Voir l'aide pour c_CTRL-R pour obtenir la liste de tous les autres registres spéciaux :

:help c_CTRL-R

80voto

hazzen Points 7315

<cword> est le mot qui se trouve sous le curseur (:help <cword> ).

Désolé, j'aurais dû être plus complet dans cette réponse.

Vous pouvez lui envoyer une commande par nmap, ou cette série de frappes pour les paresseux fonctionnera :

b #go to beginning of current word
yw #yank to register

Ensuite, lorsque vous tapez votre motif, vous pouvez appuyer sur la touche <control-r>0<enter> qui collera dans votre commande le contenu du 0ème registre.

Vous pouvez également créer une commande pour cela, par exemple :

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

Ce qui correspond à la frappe simultanée de '\' et 'w' pour remplacer votre ligne de commande par

:s/\(<currentword>\)/

34voto

user11211 Points 763
yiwP

yiw : Yank inner word (le mot sous le curseur). Cette commande déplace également le curseur au début du mot.

P : Coller avant le curseur.

Vous pouvez alors mettre en correspondance le par ex : < ALT > - D à cette commande :

:nmap < ALT >-D yiwP

15voto

rampion Points 38697

Une autre façon simple de procéder est d'utiliser la fonction * commandement.

En mode normal, au dessus d'un mot, tapez

*:s//\0\0<Enter>

* fait du motif de recherche le mot courant (par exemple : \<abc\>).

:s// effectue une substitution en utilisant le modèle de recherche actuel, et \0 dans le remplacement est la chaîne trouvée.

Vous pouvez ensuite répéter ce comportement, disons par-dessus le mot "def", soit en tapant à nouveau la même chose, soit en tapant

*@:

@: répète simplement la dernière commande ex, sans avoir besoin d'une <Entrée>, dans ce cas la substitution.

Vous pouvez également enregistrer une macro rapide pour effectuer cette opération à l'aide de la fonction q commande

qd*:s//\0\0<Enter>q

Puis répétez-le à votre guise en tapant

@d

lorsque vous passez sur un mot que vous voulez doubler. Comme cela ne représente qu'un caractère de moins que la solution précédente, cela ne vaut peut-être pas la peine pour vous - à moins que vous ne fassiez d'autres ex-commandes entre le doublement du mot, ce qui changerait le comportement de @:

1voto

Vous devez échapper les antislashs dans le mappage. Vous pouvez également inclure la chaîne de substitution dans le mappage.

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X