Quelles sont les différences entre les commandes map, noremap, abbrev et noreabbrev?

19

Ces commandes transforment un ensemble de touches en un autre d'une certaine manière, mais je suis quelque peu flou sur lequel est le plus approprié pour une situation. De plus, il en existe également des !variantes. Pour le moment, je les utilise au hasard, alors pourrais-je savoir quels sont les pièges associés à chacun? En particulier, des notes sur les différentes versions de mode pourraient être utiles, car j'ai appris de Peter Rincker dans un commentaire qui cmappeut s'étendre à peu près n'importe où sur la ligne et pas seulement lorsque j'utilise des :commandes. Quelles précautions puis-je prendre contre les pièges potentiels?

muru
la source
La partie suivante est un peu méta: quel formulaire utiliser pour répondre sur ce site? - dois-je poser cette question sur Meta, ou l'ajouter à la question?
muru
Je dirais que ça dépend. J'utiliserais toujours la version noremap si je fais la démonstration d'une cartographie. De cette façon, les gens ont l'habitude d'utiliser les mappages non récursifs sur les versions récursives. Sauf bien sûr, il y a une raison d'utiliser spécifiquement map, par exemple, dans un mapping <Plug>.
akshay

Réponses:

21

Premièrement, mapet noremapsont similaires en ce que chacun crée simultanément des mappages pour les modes normal, visuel, sélection et opérateur . Vim le détaille dans :help map-overview:

Overview of which map command works in which mode.  More details below.
     COMMANDS                    MODES ~
:map   :noremap  :unmap     Normal, Visual, Select, Operator-pending
:nmap  :nnoremap :nunmap    Normal
:vmap  :vnoremap :vunmap    Visual and Select
:smap  :snoremap :sunmap    Select
:xmap  :xnoremap :xunmap    Visual
:omap  :onoremap :ounmap    Operator-pending
:map!  :noremap! :unmap!    Insert and Command-line
:imap  :inoremap :iunmap    Insert
:lmap  :lnoremap :lunmap    Insert, Command-line, Lang-Arg
:cmap  :cnoremap :cunmap    Command-line

Selon l'aide ci-dessus, si vous souhaitez restreindre le mappage à un mode spécifique, vous devez ajouter:

'n' (pour normal), 'v' (pour visuel et select), 'c' (pour commande), 'x' (pour mode visuel), 's' (pour select), 'o' (pour opérateur en attente) ).

Par exemple,

nmap n nzz

créera un mode normal, un mappage récursif de n.

Maintenant, noremapc'est juste une version non récursive de map.

Qu'est-ce que la cartographie non récursive? Vim a la réponse à cela aussi, avec :help map-recursive:

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times.  The
only problem is that the only way to stop this is by causing an error.  The
macros to solve a maze uses this, look there for an example.  There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
   :map ab abcd
will execute the "a" command and insert "bcd" in the text.  The "ab" in the
{rhs} will not be mapped again.

Un exemple de cela est le mappage des éléments suivants:

:imap j k

:imap k j

Maintenant, vim remplacera j par k et k par j nombre infini de fois, et vous montrera donc une erreur indiquant que vous avez créé un mappage récursif.

C'est pourquoi il est généralement recommandé d'utiliser presque toujours (sauf lorsque vous avez des <Plug>mappages ou similaires) des mappages non récursifs. Cela empêche Vim de se bloquer lorsque vous créez par inadvertance des mappages récursifs. Le mappage non récursif est donc un moyen plus sûr de mapper des commandes dans Vim.

Avec les informations ci-dessus à portée de main, nous pouvons voir que ce :noreabbrevn'est qu'une version non récursive de la :abbrevcommande.

Vous ne pouvez l'utiliser :abbrevqu'en modes d'insertion, de remplacement et de commande. :abbrevest utilisé pour créer des abréviations, (aussi appelés raccourcis que Vim peut développer). La courte explication consiste à utiliser :map/ :noremappour créer des mappages, :abbrev/ :noreabbrevpour créer des abréviations, ou chaque fois que vous souhaitez que Vim développe votre saisie.

akshay
la source
1
Éviter les blocages n'est pas la seule raison d'utiliser les noreformes de la commande map. Une autre raison (et à mon avis, plus importante) de les utiliser est qu'ils rendent vos mappages fiables / prévisibles. Si vous utilisez le formulaire brut et que rhscontient une clé qui se trouve être mappée à autre chose, votre mappage peut avoir un comportement entièrement différent de celui souhaité.
Rich