Quelle est la différence entre les commandes de mappage remap, noremap, nnoremap et vnoremap dans vim?

Quelle est la différence entre les commandes de mappage remap, noremap, nnoremap et vnoremap dans vim?

remap est une option qui fait fonctionner les mappages de manière récursive. Par défaut, il est activé et je vous recommande de le laisser comme ça. Les autres sont des commandes de mappage , décrites ci-dessous:

:map et :noremap sont des versions récursives et non récursives des différentes commandes de mappage. Ce que cela signifie, c’est que si vous faites:

 :map j gg :map Q j :noremap W j 

j sera mappé sur gg . Q sera également mappé sur gg , car j sera développé pour le mappage récursif. W sera mappé sur j (et non sur gg ) car j ne sera pas développé pour le mappage non récursif.

Rappelez-vous maintenant que Vim est un éditeur modal . Il a un mode normal , un mode visuel et d’autres modes.

Pour chacun de ces ensembles de mappages, il existe un mappage qui fonctionne dans les modes normal, visuel, select et operator ( :map et :noremap ), un qui fonctionne en mode normal ( :nmap et :nnoremap ), un en mode visuel ( :vmap et :vnoremap ) et ainsi de suite.

Pour plus de conseils à ce sujet, voir:

 :help :map :help :noremap :help recursive_mapping :help :map-modes 

Je pense que la documentation vim aurait dû expliquer la signification de la dénomination de ces commandes. Le simple fait de vous dire ce qu’ils font ne vous aide pas à vous souvenir des noms.

map est la “racine” de toutes les commandes de mappage récursives. La forme racine s’applique aux modes “normal”, “visual + select” et “en attente de l’opérateur”. (J’utilise le terme “racine” comme en linguistique .)

noremap est la “racine” de toutes les commandes de mappage non récursives. La forme racine s’applique aux mêmes modes que la map . (Pensez au préfixe nore pour signifier “non récursif”.)

(Notez qu’il y a aussi les modes ! Comme map! Qui s’appliquent à insert et à la ligne de commande.)

Voir ci-dessous ce que signifie “récursif” dans ce contexte.

Ajouter une lettre de mode comme n modifie les modes utilisés par le mappage. Il peut choisir un sous-ensemble de la liste des modes applicables (par exemple, uniquement “visuel”) ou choisir d’autres modes auxquels la map ne s’appliquerait pas (par exemple “insert”) .

Utilisez help map-modes pour afficher quelques tableaux expliquant comment contrôler les modes auxquels le mappage s’applique.

Lettres de mode:

  • n : normal seulement
  • v : visuel et select
  • o : en attente de l’opérateur
  • x : visuel seulement
  • s : sélectionnez uniquement
  • i : insérer
  • c : ligne de commande
  • l : insert, ligne de commande, regexp-search (et autres. Collectivement appelé pseudo-mode “Lang-Arg”)

Récursif ” signifie que le mappage est étendu à un résultat, puis le résultat est étendu à un autre résultat, et ainsi de suite.

L’expansion s’arrête lorsque l’une d’elles est vraie:

  1. le résultat n’est plus associé à rien d’autre.
  2. un mappage non récursif a été appliqué (c.-à-d. le “noremap” [ou l’un de ses éléments] est l’extension finale).

A ce stade, la “signification” par défaut de vim du résultat final est appliquée / exécutée.

Non récursif ” signifie que le mappage n’est développé qu’une fois et que ce résultat est appliqué / exécuté.

Exemple:

  nmap KH nnoremap HG nnoremap G gg 

Ce qui précède provoque l’expansion de K en H , puis H en G et l’arrêt. Il s’arrête à cause du nnoremap , qui se développe et s’arrête immédiatement. La signification de G sera exécutée (c.-à-d. “Sauter à la dernière ligne”). Au plus une cartographie non récursive sera jamais appliquée dans une chaîne d’expansion (ce serait la dernière extension à se produire).

Le mappage de G en gg ne s’applique que si vous appuyez sur G , mais pas si vous appuyez sur K Ce mappage n’affecte pas le fait d’appuyer sur K que G été mappé de manière récursive ou non, puisque c’est la ligne 2 qui provoque l’arrêt de K , donc la ligne 3 ne sera pas utilisée.

Attention, vnoremap et vmap fonctionnent en mode Visual AND Select. Pour avoir un mappage uniquement en mode Visual, utilisez xmap et xnoremap .

Une différence est que:

  • :map ne nvo == normal + (visuel + select) + opérateur en attente
  • :map! ic == insert + mode ligne de commande

comme indiqué sur help map-modes tables de help map-modes .

Donc: la map ne correspond pas à tous les modes .

Pour mapper à tous les modes, vous avez besoin des deux :map et :map! .