Quelle est la différence entre les commandes de mappage remap, noremap, nnoremap et vnoremap dans Vim?
remap
est une option qui permet aux mappages de fonctionner de manière récursive. Par défaut, il est activé et je vous recommande de le laisser de cette façon. Les autres tâches sont des commandes de mappage , décrites ci-dessous:
:map
et :noremap
sont récursifs et non récursifs versions des différentes commandes de mapping. Cela signifie que si vous le faites:
:map j gg
:map Q j
:noremap W j
j
sera associé à gg
. Q
sera également mappé sur gg
, car j
sera développé pour le mappage récursif. W
sera associé à j
(et non à gg
) car j
ne sera pas développé pour le mappage non récursif.
Rappelons maintenant que Vim est un éditeur modal . Il a un mode normal , visuel et d'autres modes.
Pour chacun de ces ensembles de mappages, il existe un mappage qui fonctionne en modes normal, visuel, sélection et opérateur (:map
et :noremap
), un autre qui fonctionne en mode normal. (:nmap
et :nnoremap
), un en mode visuel (:vmap
et :vnoremap
), etc.
Pour plus de conseils à ce sujet, voir:
:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
Je pense que la documentation de 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", "visuel + sélection" et "en attente d'opérateur". (J'utilise le terme "racine" comme dans linguistique .)
noremap
est la "racine" de toutes les commandes de mappage non récursives. La forme racine s'applique aux mêmes modes que map
. (Pensez que le préfixe nore
signifie "non-récursif".)
(Notez qu'il existe également les modes !
comme map!
qui s'appliquent à l'insertion et à la ligne de commande.)
Voir ci-dessous ce que "récursif" signifie dans ce contexte.
Le fait de préfixer une lettre de mode comme n
modifie les modes dans lesquels le mappage fonctionne. Il peut choisir un sous-ensemble de la liste des modes applicables (par exemple, uniquement "visuel") ou choisir un autre mode que map
ne le permettrait pas. s'applique à (par exemple "insérer").
Utilisez help map-modes
vous montrera quelques tableaux expliquant comment contrôler les modes auxquels le mappage s'applique.
Lettres de mode:
n
: normal uniquementv
: visuel et sélectionnezo
: en attente d'opérateurx
: visuel uniquements
: sélection uniquementi
: insèrec
: ligne de commandel
: insertion, ligne de commande, recherche rationnelle (et autres. Collectivement appelé pseudo-mode "Lang-Arg")" récursif " signifie que le mappage est développé en résultat, puis que le résultat est développé en un autre résultat, et ainsi de suite.
L'expansion s'arrête quand l'une de ces choses est vraie:
À ce stade, la "signification" par défaut du résultat final de Vim est appliquée/exécutée.
" Non récursif " signifie que le mappage n'est développé qu'une seule fois et que le résultat est appliqué/exécuté.
Exemple:
nmap K H
nnoremap H G
nnoremap G gg
Ce qui précède provoque le développement de K
en H
, puis de H
en G
et de s’arrêter. Il s’arrête à cause de la nnoremap
, qui s’agrandit et s’arrête immédiatement. La signification de G
sera exécutée (c'est-à-dire "saute à la dernière ligne"). Au plus un mappage non récursif sera jamais appliqué dans une chaîne d'expansion (ce serait la dernière expansion à se produire).
Le mappage de G
à 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
ait été mappé de manière récursive ou non, car c'est la ligne 2 qui arrête le développement de K
, donc la ligne 3 ne serait pas utilisé.
Attention, vnoremap
et vmap
fonctionnent en mode Visual AND Select. Pour avoir un mappage uniquement en mode visuel, utilisez xmap
et xnoremap
.
Une différence est que:
:map
fait nvo
== normal + (visuel + sélection) + opérateur en attente:map!
fait ic
== insère + mode ligne de commandecomme indiqué sur les tables help map-modes
.
Donc: map
ne mappe pas tous les modes.
Pour mapper à tous les modes, vous avez besoin à la fois de :map
et de :map!
.