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?

Gonçalo Ribeiro
la source
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.

Zach Ingbretsen
la source
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.

Arbre à feuilles persistantes
la source
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>
Ingo Karkat
la source
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