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

1114

Quelle est la différence entre les remap, noremap, nnoremapet les vnoremapcommandes de cartographie dans Vim?

Chétan
la source
1
Attention, vnoremapet vmaptravaillez en mode Visual AND Select. Pour avoir un mappage uniquement en mode visuel, utilisez xmapet xnoremap.
Benoit

Réponses:

1628

remapest une option qui permet aux mappages de fonctionner récursivement. Par défaut, il est activé et je vous recommande de le laisser de cette façon. Les autres sont des commandes de mappage , décrites ci-dessous:

:mapet :noremapsont des versions récursives et non récursives des différentes commandes de mappage. Cela signifie que si vous le faites:

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

jsera mappé gg. Qsera également mappé gg, car jsera étendu pour le mappage récursif. Wsera mappé sur j(et non sur gg) car jne sera pas développé pour le mappage non récursif.

Souvenez-vous maintenant que Vim est un éditeur modal . Il a un mode normal , visuel mode 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 ( :mapet :noremap), un qui fonctionne en mode normal ( :nmapet :nnoremap), un en mode visuel ( :vmapet :vnoremap) et ainsi de suite.

Pour plus d'informations à ce sujet, voir:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
DrAl
la source
8
Merci pour votre réponse! Aussi, quand est-ce que récursif est utilisé et quand est-il non récursif?
Chetan
14
@Chetan: Cela dépend de ce que vous voulez réaliser. J'ai tendance à utiliser non récursif plus souvent, mais si vous avez défini un mappage relativement compliqué à l'aide de non récursif et ce qu'un autre mappage fait tout le premier mappage et plus, il peut être plus facile d'utiliser un mappage récursif qui inclut le l'original plutôt que de retaper l'intégralité de l'original non récursif (en particulier si vous devez ensuite modifier l'original).
DrAl
10
Je devais noremapêtre un opposé map. Je veux dire quelque chose qui supprime un mappage. Merci d'avoir répondu. Cela m'a clarifié
Pavan Manjunath
4
Ce n'est pas si important pour la majorité des cas d'utilisation, mais il convient de noter que :map, etc. ne fonctionnent pas dans tous les modes, exactement, juste tous les modes communs (en particulier, le mode normal, le mode visuel, le mode de sélection et en attente de l'opérateur). Si vous voulez qu'un mappage fonctionne en mode insertion, ligne de commande ou lang-arg, vous devez utiliser :map!, etc. (Source: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
Ken Bellows
3
@whytheq noremap = cartographie non récursive
Dan Bechard
281

Je pense que la documentation de Vim aurait dû expliquer la signification du nom de ces commandes. Le simple fait de vous dire ce qu'ils font ne vous aide pas à vous souvenir des noms.

mapest la "racine" de toutes les commandes de mappage récursives. La forme racine s'applique aux modes "normal", "visuel + sélection" et "en attente de l'opérateur". (J'utilise le terme "racine" comme en linguistique .)

noremapest la "racine" de toutes les commandes de mappage non récursives. La forme racine s'applique aux mêmes modes que map. (Pensez au norepréfixe pour signifier "non récursif".)

(Notez qu'il existe également des !modes commemap! celui-ci qui s'appliquent à l'insertion et à la ligne de commande.)

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

Faire précéder une lettre de mode comme nmodifier 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 d'autres modes qui mapne s'appliqueraient pas (par exemple "insérer").

Utilisation help map-modes vous montrera quelques tableaux qui expliquent comment contrôler les modes auxquels le mappage s'applique.

Lettres de mode:

  • n: normal seulement
  • v: visuel et sélectionnez
  • o: en attente de l'opérateur
  • x: visuel uniquement
  • s: sélectionner uniquement
  • i: insérer
  • c: ligne de commande
  • l: insert, ligne de commande, regexp-search (et autres. Appelé collectivement 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, etc.

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

  1. le résultat n'est plus mappé à autre chose.
  2. un mappage non récursif a été appliqué (c'est-à-dire que le "noremap" [ou l'un de ses semblables] est l'expansion finale).

À 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 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 Kune expansion vers H, puis Hune expansion vers Get un arrêt. Il s'arrête à cause de la nnoremap, qui se développe et s'arrête immédiatement. Le sens deG sera exécutée (c'est-à-dire "sauter à 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à ggs'applique uniquement si vous appuyez sur G, mais pas si vous appuyez sur K. Ce mappage n'affecte pas la pression, Kqu'il ait Gété mappé récursivement ou non, car c'est la ligne 2 qui provoque l'arrêt de l'expansion de K, donc la ligne 3 ne serait pas utilisée.

Kelvin
la source
4
Une chose: maps'applique uniquement aux modes normal, visuel, sélection et en attente de l'opérateur, pas à tous les modes.
Brian McCutchon
1
devrait être acceptée réponse.
Tycholiz
c'est une bien meilleure réponse que l'acceptation.
MilMike
19

Une différence est que:

  • :map fait nvo== normal + (visuel + sélection) + opérateur en attente
  • :map!fait ic == insérer + mode ligne de commande

comme indiqué sur les help map-modestableaux.

Donc: mapne correspond pas à tous les modes .

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

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
5
Prudent !! command modeest un autre nom historique pour normal modesavoir. chapitre 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). L'abréviation «c» signifie «ligne de commande». En d'autres termes, par défaut: mappe map! lhs rhs récursivement lhs à rhs pour les modes insert + command-LINE . C'est à moins que l' remapoption par défaut ne soit explicitement désactivée avec set noremap[!]dans ~ / .vimrc. Dans ce cas, la cartographie ne serait pas récursive (déconseillée).
Cbhihe du