Comment spécifier «le mot sous le curseur» sur la ligne de commande de VIM?

86

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 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 alors 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 le fasse?

:s/\(*whatever is under the commandline*\)/\1\1
Nathan Fellman
la source

Réponses:

74

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

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

Vous pouvez y mapper une commande, 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 <control-r>0<enter>ce qui collera dans votre commande le contenu du 0-ème registre.

Vous pouvez également créer une commande pour cela comme:

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

Ce qui mappera en frappant '\' et 'w' en même temps pour remplacer votre ligne de commande par

:s/\(<currentword>\)/
hazzen
la source
17
J'apprécie la bonne réponse, mais je suggérerais probablement la yiwfin bywuniquement à cause de la mémoire musculaire. Dans le scénario où votre curseur se trouve déjà sur le premier caractère du mot, vous devez omettre le bet tapez simplement ywvs vous pouvez omettre le iin yiw. Des accidents peuvent survenir, et réparer une erreur est certainement plus de pressions sur les touches :)
Jacob Swartwood
130

En mode ligne de commande, CTRL+ R CTRL+ Winsérera le mot sous le curseur.

Consultez l'aide de c_CTRL-Rpour une liste de tous les autres registres spéciaux:

:help c_CTRL-R
César Alforde
la source
28
yiwP

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

P: Coller avant le curseur.

Vous pouvez ensuite mapper le eg: < ALT > - Dà cette commande:

:nmap < ALT >-D yiwP
utilisateur11211
la source
4
La question portait spécifiquement sur la spécification du "mot sous le curseur" à partir de la ligne de commande de Vim, et non du mode commande
Nathan Fellman
12

Un autre moyen simple de le faire est d'utiliser la *commande.

En mode normal, sur un mot, saisissez

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

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

:s//effectue une substitution en utilisant le modèle de recherche actuel, et \0dans la section de remplacement se trouve la chaîne correspondante.

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

*@:

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

Vous pouvez également enregistrer une macro rapide pour ce faire en utilisant la qcommande

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

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

@d

quand sur un mot vous voulez doubler. Comme ce n'est 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 doublage de mots, ce qui changerait le comportement@:

rampion
la source
1

Vous devez échapper les contre-obliques 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>

la source
1
ywPx

fera ce que vous décrivez.

ywPxw

fera également avancer le curseur jusqu'au mot suivant.

bmb
la source
La question portait spécifiquement sur la spécification du "mot sous le curseur" à partir de la ligne de commande de Vim, et non du mode commande
Nathan Fellman
Veuillez décrire des réponses comme ça, chaque lettre de la commande.
Vitaly Zdanevich
0

@ user11211 a le moyen le plus simple de dupliquer le mot sous le curseur:

yiwP

yank mot interne (déplace le curseur au début du mot), collez (avant le curseur).

par exemple. droit [t] avant ----> simple [d] simple

[] est le curseur

Élaborer...

Vous souhaitez probablement que le curseur suive votre mot dupliqué:

yiwPea

droit [t] avant ----> simple droit avant []

REMARQUE:

yiw

est un mot intérieur extravagant (sans espace)

yaw

est de retirer tous les mots (y compris les espaces de fin).

yawPea

est donc un mot en double comprenant les espaces et le curseur de position.

droit [t] avant ----> simple simple []

BBW avant Windows
la source
La question était spécifiquement de spécifier "le mot sous le curseur" à partir de la ligne de commande de Vim , pas du mode commande.
Nathan Fellman
1
Vous pouvez utiliser n'importe laquelle des commandes normales (mode commande) ci-dessus dans le mode commande, en les précédant simplement de: normal ... par exemple,: normal yiwP fera la même chose que yiwP en mode normal. C'est bien sûr la manière la plus lente de faire ce que vous demandiez.
BBW avant Windows
-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>
SergioAraujo
la source
pouvez-vous commenter ce que cela fait?
Nathan Fellman
1
Cela utilise l' nindicateur de la :substitutecommande pour afficher le nombre de fois où le mot sous le curseur apparaît dans le tampon actuel. Très intelligent, mais pas vraiment une réponse à cette question.
Jacob