Comment spécifier « le mot sous le curseur » sur la ligne de commande de VIM ?
-
09-06-2019 - |
Question
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 alors taper :
:s/\(abc\)/\1\1/
Mais j'aimerais ensuite 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
La solution
<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 modèle, vous pouvez appuyer sur <control-r>0<enter>
qui collera dans votre commande le contenu du 0-ème registre.
Vous pouvez également faire une commande pour cela comme :
:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/
Ce qui permettra d'appuyer sur '\' et 'w' en même temps pour remplacer votre ligne de commande par
:s/\(<currentword>\)/
Autres conseils
En mode ligne de commande, CTRL+R. CTRL+W insérera le mot sous le curseur.
Voir l'aide pour c_CTRL-R
pour une liste de tous les autres registres spéciaux :
:help c_CTRL-R
yiwP
yiw
:Tirez le mot intérieur (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 l'exemple : < ALT > - D
à cette commande :
:nmap < ALT >-D yiwP
Un autre moyen simple de procéder consiste à utiliser le *
commande.
En mode normal, lorsque vous êtes sur un mot, tapez
*:s//\0\0<Enter>
*
fait du modèle de recherche le mot actuel (par ex.\<abc\>).
:s//
effectue une substitution en utilisant le modèle de recherche actuel, et \0
Dans la section de remplacement se trouve la chaîne correspondante.
Vous pouvez ensuite répéter ce comportement, par exemple sur 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'un <Entrée>, dans ce cas la substitution.
Vous pouvez également enregistrer une macro rapide pour ce faire en utilisant le q
commande
qd*:s//\0\0<Enter>q
Ensuite, répétez-le autant que vous le souhaitez en tapant
@d
quand sur un mot vous voulez doubler.Comme il ne s'agit que d'un caractère de moins que la solution précédente, cela n'en vaut peut-être pas la peine pour vous - à moins que vous n'exécutiez d'autres ex-commandes entre le doublement de mots, ce qui modifierait le comportement de @:
Vous devez échapper aux barres obliques inverses 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>
ywPx
fera ce que vous décrivez.
ywPxw
fera également avancer le curseur vers le mot suivant.
@utilisateur11211 a la manière la plus simple pour dupliquer le mot sous le curseur :
yiwP
tirez le mot intérieur (déplace le curseur au début du mot), collez (avant le curseur).
par exemple.simple[t]avant ----> simpleguerre[d]simple
[] est le curseur
Élaborer...
Vous souhaitez probablement que le curseur suive votre mot dupliqué :
yiwPea
direct[t]forward ----> directstraightforward[]
NOTE:
yiw
est le mot intérieur de Yank (sans espace)
yaw
c'est tirer tous les mots (y compris les espaces de fin).
yawPea
est donc un mot en double comprenant des espaces et la position du curseur.
tout droit[t]avant ----> simple simple[]
" count word (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>