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

StackOverflow https://stackoverflow.com/questions/48642

  •  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
Était-ce utile?

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top