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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Буквы режима:

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

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

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

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

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

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

Пример:

  nmap KH nnoremap HG nnoremap G gg 

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

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

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

Одно из отличий заключается в том, что:

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

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

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

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

Давайте будем гением компьютера.