remove - ¿Cuál es la diferencia entre los comandos remap, noremap, nnoremap y vnoremap map en vim?
vim map (4)
¿Cuál es la diferencia entre los comandos remap, noremap, nnoremap y vnoremap map en vim?
Creo que la documentación de vim debería haber explicado el significado detrás de la denominación de estos comandos. Solo decirte lo que hacen no te ayuda a recordar los nombres.
map
es la "raíz" de todos los comandos de mapeo recursivo. La forma raíz se aplica a los modos "normal", "visual + select" y "pendiente de operador". (Estoy usando el término "raíz" como en linguistics ).
noremap
es la "raíz" de todos los comandos de mapeo no recursivo. La forma de la raíz se aplica a los mismos modos que el map
. (Piense en el prefijo nore
que significa "no recursivo".)
(Tenga en cuenta que también existen los modos !
Como map!
Que se aplican a insertar y línea de comandos).
Vea a continuación lo que significa "recursivo" en este contexto.
Antes de una letra de modo como n
modifique los modos en los que funciona la asignación. Puede elegir un subconjunto de la lista de modos aplicables (por ejemplo, solo "visual"), o elegir otros modos a los que no se aplicaría el map
(por ejemplo, "insertar") .
El uso de help map-modes
le mostrará algunas tablas que explican cómo controlar a qué modos se aplica el mapa.
Letras de modo:
-
n
: normal solamente -
v
: visual y select -
o
: operador pendiente -
x
: solo visual -
s
: seleccionar solo -
i
: insertar -
c
: linea de comando -
l
: insertar, línea de comando, regexp-search (y otros. Se llama colectivamente pseudo-modo "Lang-Arg")
" Recursivo " significa que la asignación se expande a un resultado, luego el resultado se expande a otro resultado, y así sucesivamente.
La expansión se detiene cuando uno de estos es verdadero:
- el resultado ya no se asigna a nada más.
- se ha aplicado un mapeo no recursivo (es decir, el "noremap" [o uno de sus nombres] es la expansión final).
En ese momento, se aplica / ejecuta el "significado" por defecto de vim del resultado final.
" No recursivo " significa que el mapeo solo se expande una vez, y ese resultado se aplica / ejecuta.
Ejemplo:
nmap K H
nnoremap H G
nnoremap G gg
Lo anterior hace que K
expanda a H
, luego H
expanda a G
y se detenga. Se detiene debido al nnoremap
, que se expande y se detiene de inmediato. Se ejecutará el significado de G
(es decir, "saltar a la última línea"). En la mayoría de los casos, se aplicará un mapeo no recursivo en una cadena de expansión (sería la última expansión que suceda).
La asignación de G
a gg
solo se aplica si presiona G
, pero no si presiona K
Esta asignación no afecta a presionar K
independientemente de si G
se asignó de forma recursiva o no, ya que es la línea 2 la que hace que la expansión de K
detenga, por lo que la línea 3 no se usaría.
Precaución, vnoremap
y vmap
funcionan en el modo Visual AND Select. Para tener una asignación solo en modo Visual, use xmap
y xnoremap
.
Una diferencia es que:
-
:map
doesnvo
== normal + (visual + select) + operador pendiente -
:map!
haceic
== insertar + modo de línea de comandos
como se indica en help map-modes
tablas de help map-modes
.
Entonces: el map
no se asigna a todos los modos .
Para mapear a todos los modos necesitas :map
y :map!
.
remap
es una opción que hace que las asignaciones funcionen de forma recursiva. Por defecto está activado y te recomiendo que lo dejes así. El resto son comandos de mapeo , que se describen a continuación:
:map
y :noremap
son :noremap
recursivas y no recursivas de los diversos comandos de mapeo. Lo que eso significa es que si lo haces:
:map j gg
:map Q j
:noremap W j
j
se asignará a gg
. Q
también se asignará a gg
, porque j
se expandirá para el mapeo recursivo. W
se asignará a j
(y no a gg
) porque j
no se expandirá para la asignación no recursiva.
Ahora recuerda que Vim es un editor modal . Tiene un modo normal , modo visual y otros modos.
Para cada uno de estos conjuntos de asignaciones, existe una mapping que funciona en los modos normal, visual, de selección y de operador ( :map
y :noremap
), que funciona en el modo normal ( :nmap
y :nnoremap
), uno en el modo visual ( :vmap
y :vnoremap
) y así sucesivamente.
Para más orientación sobre esto, vea:
:help :map
:help :noremap
:help recursive_mapping
:help :map-modes