Pregunta ¿Cuál es la diferencia entre los comandos de reasignación, noremap, nnoremap y vnoremap mapping en vim?


¿Cuál es la diferencia entre los comandos de reasignación, noremap, nnoremap y vnoremap mapping en vim?


901
2017-09-23 07:13


origen


Respuestas:


remap es un opción eso hace que las asignaciones funcionen recursivamente. Por defecto está activado y te recomendaría que lo dejes así. El resto son mapeo, descrito abajo:

:map y :noremap son recursivo y no recursivo versiones 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 mapeará a gg. Q será además ser mapeado a gg, porque j se expandirá para el mapeo recursivo. W se mapeará a j (y no a gg) porque j no se expandirá para el mapeo no recursivo.

Ahora recuerda que Vim es un editor modal. Tiene un normal modo, visual modo y otros modos.

Para cada uno de estos conjuntos de mapeos, hay un cartografía que funciona en los modos normal, visual, de selección y de operador (:map y :noremap), uno que funciona en modo normal (:nmap y :nnoremap), uno en modo visual (:vmap y :vnoremap) y así.

Para obtener más orientación sobre esto, ver:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes

1324
2017-09-23 07:24



Creo que la documentación 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 lingüística.)

noremap es la "raíz" de todos los comandos de mapeo no recursivos. La forma raíz se aplica a los mismos modos que map. (Pensar en nore prefijo para significar "no recursivo").

(Tenga en cuenta que también están los ! modos como map! que se aplica a insertar y línea de comando.)

Vea a continuación lo que significa "recursivo" en este contexto.

Anteponiendo 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 que map no se aplicaría a (por ejemplo, "insertar").

Utilizar help map-modes le mostrará algunas tablas que explican cómo controlar a qué modos se aplica la asignación.

Letras de modo:

  • n: solo normal
  • v: visual y select
  • o: pendiente de operador
  • x: solo visual
  • s: seleccionar solo
  • i: insertar
  • c: línea de comando
  • l: insert, línea de comando, regexp-search (y otros. Colectivamente llamado pseudo-modo "Lang-Arg")

"Recursivo"significa que el mapeo 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:

  1. el resultado ya no está asignado a ninguna otra cosa.
  2. se ha aplicado un mapeo no recursivo (es decir, el "noremap" [o uno de su tipo] es la expansión final).

En ese punto, se aplica / ejecuta el "significado" predeterminado 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

Las causas anteriores K expandirse a H, entonces H expandirse a G y pare. Se detiene debido a la nnoremap, que se expande y se detiene de inmediato. El significado de G se ejecutará (es decir, "salta a la última línea"). A lo sumo se aplicará un mapeo no recursivo en una cadena de expansión (sería la última expansión que suceda).

El mapeo de G a gg solo se aplica si presiona G, pero no si presionas K. Este mapeo no afecta presionar K independientemente de si G fue mapeado recursivamente o no, ya que es la línea 2 la que causa la expansión de K parar, entonces la línea 3 no se usaría.


210
2017-07-26 19:00



Precaución, vnoremap y vmap trabajar en modo Visual Y Seleccionar. Para tener una asignación solo en modo Visual, use xmap y xnoremap.


69
2017-09-24 13:58



Una diferencia es que:

  • :map  hace nvo == normal + (visual + seleccionar) + operador pendiente
  • :map! hace ic  == insert + modo de línea de comandos

como se indica en help map-modes mesas.

Asi que: map no se asigna a todos los modos.

Para asignar a todos los modos, necesita ambos :map y :map!.


17
2018-01-22 12:03