В чем разница между командами отображения remap, noremap, nnoremap и vnoremap в Vim? - PullRequest
1007 голосов
/ 23 сентября 2010

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

Ответы [ 4 ]

1463 голосов
/ 23 сентября 2010

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

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

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

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

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

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

Подробнее об этом см .:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
237 голосов
/ 26 июля 2012

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

map является «корнем» всех команд рекурсивного отображения. Корневая форма применяется к режимам «нормальный», «визуальный + выбор» и «ожидание оператора». (Я использую термин "корень", как в лингвистика .)

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

(Обратите внимание, что существуют также режимы !, такие как map!, которые применяются для вставки и командной строки.)

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

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

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

Режим букв:

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

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

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

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

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

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

* * Пример тысяча семьдесят-одна: * * тысяча семьдесят-две
 nmap K H
 nnoremap H G
 nnoremap G gg

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

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

76 голосов
/ 24 сентября 2010

Внимание, vnoremap и vmap работают в режиме Visual AND Select.Для отображения только в визуальном режиме используйте xmap и xnoremap.

18 голосов

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

  • :map делает nvo == нормальный + (визуальный + выбор) + оператор ожидает
  • :map! делает ic == вставка + режим командной строки

, как указано в help map-modes таблицах.

Итак: map не отображается на все режимы .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...