В чем разница между командами сопоставления remap, noremap, nnoremap и vnoremap в vim?

в чем разница между командами remap, noremap, nnoremap и vnoremap mapping в vim?

4 ответов


remap это опции это заставляет сопоставления работать рекурсивно. По умолчанию он включен и я бы рекомендовал вам оставить все как есть. Остальные команды отображения, описано ниже:

:map и :noremap are рекурсивные и нерекурсивный версии различных команд отображения. Это означает, что если вы это сделаете:

:map j gg
:map Q j
:noremap W j

j будет соответствовать gg. Q будет и сопоставить с gg, потому что j будет расширен для рекурсивного отображения. W будет соответствовать j (а не gg), поскольку j не будет расширен для нерекурсивного отображения.

теперь помните, что Vim-это модальный редактор. У него есть нормальный режим визуальный режим и другие режимы.

для каждого из этих наборов отображений, есть картография что работает в обычном, визуальном, select и operator режимах (:map и :noremap), который работает в обычном режиме (:nmap и :nnoremap), в визуальном режиме (:vmap и :vnoremap) и так далее.

дополнительные указания см. В разделе:

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

я думаю, что документация vim должна была объяснить значение именования этих команд. Просто рассказывая вам, что они делают, вы не можете вспомнить имена.

map является "корнем" всех рекурсивных команд отображения. Корневая форма применяется к режимам" normal"," visual+select "и" operator-pending". (Я использую термин "root", как в Лингвистика.)

noremap является "корнем" всех нерекурсивных команд отображения. Корневая форма применяется к тем же режимам, что и map. (Подумайте о nore префикс означает "нерекурсивный".)

(обратите внимание, что есть также ! режимами, такими как map! которые применяются к insert & command-line.)

см. ниже, что означает "рекурсивный" в этом контексте.

добавление буквы режима, как n изменение режимов работы отображения. Он может выбрать подмножество списка применимых режимов (например, только "визуальный") или выбрать другие режимы, которые map не будет применяться (например, "вставить").

использовать help map-modes покажет вам несколько таблиц, которые объясняют, как управлять режимами отображения применяется.

режим письма:

  • n: нормально только
  • v: visual и выберите
  • o: оператор-до
  • x: только визуальный
  • s: выберите только
  • i вставить
  • c: командная строка
  • l: insert, command-line, regexp-search (и другие. Коллективно называемый" Lang-Arg " псевдо-режим)

"рекурсивные " означает, что отображение расширяется до результата, затем результат расширяется до другого результата и так далее.

расширение останавливается, когда одно из них истинно:

  1. результат больше не отображается ни на что другое.
  2. нерекурсивное отображение было применяется (т. е. "noremap" [или один из его подобных] является окончательным расширением).

в этот момент применяется/выполняется значение по умолчанию vim конечного результата.

"нерекурсивный " означает, что отображение расширяется только один раз, и этот результат применяется/выполняется.

пример:

 nmap K H
 nnoremap H G
 nnoremap G gg

вышеуказанные причины K расширить до H, потом H расширить до G и прекратить. Он останавливается из-за nnoremap, которая расширяется и немедленно останавливается. Смысл G будет выполнен (т. е. "перейти к последней строке"). Самое большее, одно нерекурсивное отображение будет когда-либо применено в цепочке расширения (это будет последнее расширение).

карт G to gg применяется только при нажатии G, но не, если вы нажмете K. Это отображение не влияет на нажатие K независимо от того, является ли G был сопоставлен рекурсивно или нет, так как это строка 2, которая вызывает расширение K остановить, поэтому строка 3 не будет использоваться.


осторожностью vnoremap и vmap работа в визуальном и выберите режим. Чтобы иметь отображение только в визуальном режиме, используйте xmap и xnoremap.


одно отличие в том, что:

  • :map тут nvo == normal + (visual + select) + оператор в ожидании
  • :map! тут ic = = insert + режим командной строки

как заявил help map-modes таблицы.

так: map не сопоставляется со всеми режимами.

чтобы сопоставить все режимы, вам нужны оба :map и :map!.