¿Cuáles son las diferencias entre los comandos map, noremap, abbrev y noreabbrev?

19

Estos comandos transforman un conjunto de pulsaciones de teclas en otro de alguna manera, pero estoy algo confuso sobre cuál es el más apropiado para alguna situación. Además, también hay !variantes de ellos. Por el momento, mi uso de ellos es bastante casual, así que ¿podría saber cuáles son las trampas asociadas con cada uno? En particular, las notas sobre las diferentes versiones de modo podrían ser útiles, ya que aprendí de Peter Rincker en un comentario que cmappuede expandirse prácticamente en cualquier lugar de la línea y no solo cuando estoy usando :comandos. ¿Qué precauciones puedo tomar contra posibles dificultades?

muru
fuente
La siguiente parte es un poco meta: ¿Qué formulario debemos usar al responder en este sitio? ¿Debería hacer esto en Meta o agregarlo a la pregunta?
muru
Yo diría que depende. Siempre usaría la versión noremap si demostrara un mapeo. De esta manera, la gente tiene la costumbre de usar las asignaciones no recursivas sobre las versiones recursivas. A menos que, por supuesto, exista una razón para usar el mapa específicamente, por ejemplo, en un mapeo <Plug>.
akshay

Respuestas:

21

Primero, mapy noremapson similares en el sentido de que cada uno crea asignaciones para modos normales, visuales, selectivos y de operador pendiente simultáneamente . Vim detalla esto en :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

Según la ayuda anterior, si desea restringir la asignación a un modo específico, debe anteponer:

'n' (para normal), 'v' (para visual y select), 'c' (para comando), 'x' (para modo visual), 's' (para select), 'o' (para operador pendiente )

Por ejemplo,

nmap n nzz

creará un modo normal, mapeo recursivo de n.

Ahora, noremapes solo una versión no recursiva de map.

Entonces, ¿qué es el mapeo no recursivo? Vim tiene la respuesta a eso también, con :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 ejemplo de esto es mapear lo siguiente:

:imap j k

:imap k j

Ahora, vim reemplazará j con k y k con j un número infinito de veces y, por lo tanto, le mostrará un error de que ha creado una asignación recursiva.

Es por eso que generalmente se recomienda que casi siempre (excepto cuando tenga <Plug>asignaciones o similares) use asignaciones no recursivas. Esto evita que Vim se cuelgue cuando accidentalmente crea asignaciones recursivas. El mapeo no recursivo es, por lo tanto, una forma más segura de mapear comandos en Vim.

Con la información anterior a mano, podemos ver que :noreabbreves solo una versión no recursiva del :abbrevcomando.

Puede usar :abbrevsolo en los modos de inserción, reemplazo y comando. :abbrevse usa para crear abreviaturas (también conocidos como accesos directos que Vim puede expandir). La breve expansión es usar :map/ :noremappara crear mapeos, :abbrev/ :noreabbrevpara crear abreviaturas, o cuando quiera que Vim expanda su escritura.

akshay
fuente
1
Evitar bloqueos no es la única razón para usar los noreformularios del comando map. Otra razón (y en mi opinión, más importante) para usarlos es que hacen que sus asignaciones sean confiables / predecibles. Si usa la forma simple y rhscontiene una clave que se asigna a otra cosa, entonces su asignación podría tener un comportamiento completamente diferente al previsto.
Rico