Rendre les commandes de type ligne de commande <Esc> et Ctrl


11

Imaginez que vous vouliez citer le mot ci-dessous. Si |c'est la position du curseur, vous pouvez facilement citer le mot à cw""<Esc>Ppartir du mode Normal.

|below

Je souhaite obtenir le même comportement en mode ligne de commande. Ma question est de savoir comment puis-je dire au mode ligne de commande que je veux taper un <Esc>. J'ai essayé :norm cw""<Esc>Pet quelques autres variantes mais j'obtiens juste ""<Esc>Pau lieu de "below".

Toujours lié à cela, je voudrais savoir comment puis-je faire des commandes Ctrl de type ligne de commande. Par exemple, je pourrais citer le mot susmentionné à la cw"<C-r>""<Esc>place. Mais alors j'aurais besoin de la ligne de commande pour taper <C-r>pour moi. Comment puis-je faire ceci?


1
Tout comme il y a <C-x><C-e>dans readline pour éditer la ligne de commande $EDITOR, vous avez <C-f>dans Vim pour ouvrir la fenêtre de ligne de commande. Tu vois :help cmdline-window.
romainl

Réponses:


11

<C-v>est ce que vous recherchez. Il vous permet de saisir des caractères littéraux (par exemple, un littéral Escau lieu de la chaîne "Esc") sans vous obliger à rien échapper.

:norm cw""<C-v><Esc>P

s'affiche comme:

:norm cw""^[P

et fera ce que vous voulez (c.-à-d., citez le mot). Vous pouvez également l'utiliser avec d'autres <C-?>mappages. Par exemple, votre deuxième demande:

:norm cw"<C-v><C-r>""

s'affiche comme:

:norm cw"^R""

Et se traduira par la même chose que ci-dessus. Il n'est pas nécessaire d'inclure le supplément Escà la fin.


10

En effet, les touches spéciales comme <Esc>ne sont pas traduites dans les normalcommandes et sont traitées comme si vous aviez appuyé <Esc>. Pour y remédier, vous pouvez utiliser une execcommande. Ainsi:

:exec "norm cw\"\"\<Esc>P"

Notez que vous devez mettre une barre oblique inverse avant les guillemets et le <Esc>, et l'utilisation de guillemets simples au lieu de guillemets doubles ne fonctionnera pas.


Est-ce que cela fonctionne aussi pour les commandes Ctrl? Comment dois-je les écrire dans la commande?
Gonçalo Ribeiro

Oui, ça devrait marcher. Vous pouvez les écrire comme ceci:"\<C-{insert key}>"
EvergreenTree

2

Le mode de ligne de commande est différent; vous ne pouvez pas y utiliser les mêmes commandes d'édition (mode normal). Vous pouvez trouver une liste de commandes sur :help c_CTRL-V.

Maintenant, il y a la fenêtre de ligne de commande ( :help command-line-window), qui peut être entrée via le mode q:normal et le <C-F>mode ligne de commande. Dans cette fenêtre, vous pouvez utiliser toutes les commandes et mappages normaux, ce serait donc l'option 1.

L'option 2 est des mappages spéciaux pour le mode ligne de commande. Comme je l'ai dit, vous ne pouvez pas utiliser l'approche via :normalet al. La clé pour les définir est le :help c_CTRL-\_emappage, qui "évalue [s] {expr} et remplace [s] toute la ligne de commande par le résultat". Voici un exemple simple qui ne fonctionne correctement qu'à la fin de la ligne de commande:

:cnoremap <F1> <C-\>esubstitute(getcmdline(), '\w\+$', '"&"', '')<CR>

1
Je ne pense pas que l'OP soit destiné à créer un mappage pour la ligne de commande, mais à exécuter un mappage à partir de la ligne de commande.
EvergreenTree
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.