web-dev-qa-db-fra.com

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?

1019
Chetan

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
1479
DrAl

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 uniquement
  • v: visuel et sélectionnez
  • o: en attente d'opérateur
  • x: visuel uniquement
  • s: sélection uniquement
  • i: insère
  • c: ligne de commande
  • l: 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:

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

À 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é.

240
Kelvin

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

77
Benoit

Une différence est que:

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

comme 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!.