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

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

Ответы на вопрос(4)

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

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

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

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

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

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

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

Режим букв:

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

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

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

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

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

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

Пример:

 nmap K H
 nnoremap H G
 nnoremap G gg

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

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

 Brian McCutchon20 сент. 2014 г., 05:36
Одна вещь:map применяется только к обычному, визуальному режиму, режимам выбора и ожидания оператора, но не ко всем режимам.

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

 RastaJedi07 мар. 2016 г., 07:50
Возможно, но это легче воспринимать как ответ, и я думаю, что это довольно полезная информация.
 lindhe05 дек. 2014 г., 14:52
Я думаю, что это должен быть комментарий.
Решение Вопроса

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
 whytheq09 мая 2013 г., 13:53
делаетnore стоять за[no] [re]map ?
 Chetan30 сент. 2010 г., 00:35
Спасибо за Ваш ответ! Кроме того, когда используется рекурсив, а когда не рекурсивный?
 cram220823 июл. 2015 г., 01:35
И если я используюnoremap j gg а потомmap Q j нажмете ли Q на вызов gg? Я понимаю, что наоборот не будет.
 Ashwin Nanjappa24 нояб. 2010 г., 04:19
Хорошо написанный ответ, я желаю, чтобы документация ViM была ясна! :-)
 npiv03 февр. 2012 г., 18:27
Это должно быть в верхней части справочного файла VIM
 RastaJedi07 мар. 2016 г., 07:55
@AshwinNanjappa абсолютно! Я нахожу помощь в Vim такой трудной для понимания в большинстве случаев! + cram2208 это отличный вопрос, и это очень плохо, никто не ответил вам! Я думаю, что Q действительно будет называть gg. Я думаю, что это только остановит повторение j во всем, кроме gg. Но возможно этоделает влияет на "унаследованные (?)" карты? Я действительно не знаю и надеюсь, что кто-то может пролить свет на это; Я до сих пор даже не на 100% понимаю, какова цель рекурсивных и нерекурсивных карт! РЕДАКТИРОВАТЬ: похоже, что ваш вопрос был дан ответ в ответ ниже. Краткий ответ: Qбудут позвоните ГГ.
 OldTimeGuitarGuy22 мая 2019 г., 03:30
Отличный ответ! Спасибо. После того, как я прочитал это, я погрузился в документы и, наконец, нашел ссылки на это. Если бы я не знал, что это «рекурсивное отображение», я бы никогда не нашел его.:help recursive_mapping
 Dan Bechard21 мар. 2014 г., 18:50
@whytheq noremap = нерекурсивное отображение
 RastaJedi07 мар. 2016 г., 07:58
Я думаю, что у меня есть это сейчас, вы можете по существу использовать рекурсивный и нерекурсивный для привязкиа также Я думаю, откройте привязки клавиш (именно так вы можете ссылаться на обычную функцию клавиши).
 Ken Bellows26 июн. 2013 г., 15:55
@whytheq В основном, да. По сути, это означает: «Не используйте переназначение, даже если оно включено».
 DrAl30 сент. 2010 г., 09:02
@Chetan: Это зависит от того, чего вы хотите достичь. Я склонен чаще использовать нерекурсивное, но если вы определили относительно сложное отображение с использованием нерекурсивного и того, что другое отображение выполняет все, что делает первое и более, то проще использовать рекурсивное отображение, которое включает в себя оригинал, а не перепечатывать весь нерекурсивный снова (особенно, если вам нужно настроить оригинал).
 Pavan Manjunath14 мар. 2012 г., 10:07
Я предполагалnoremap быть какой-то противоположностьюmap, Я имею в виду то, что удаляет отображение. Спасибо за ответ. Это разъяснило мне
 Ken Bellows26 июн. 2013 г., 16:00
Это не так важно для большинства случаев использования, но следует отметить, что:mapи т.д. не работают ввсе режимы, а точнее все обычные (в частности, обычный режим, визуальный режим, режим выбора и режим ожидания оператора). Если вы хотите, чтобы отображение работало в режиме вставки, командной строки или режима lang-arg, вам необходимо использовать:map!и т. д. (Источник:vimdoc.sourceforge.net/htmldoc/map.html#map-overview)

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

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

как указано наhelp map-modes столы.

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

Для отображения на все режимы вам нужны оба:map а также:map!.

@Cbhihe спасибо, исправлено на cmmand-line
 lindhe05 дек. 2014 г., 14:53
Это должен быть комментарий.
 Cbhihe15 авг. 2015 г., 21:00
Осторожный !!command mode другое историческое названиеnormal mode а именно глава 5vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro).Аббревиатура «с» для «командной строки». Другими словами, по умолчанию:map! lhs rhs рекурсивно наносит на карту lhs к rhs длявставить + командная строка режимы. Это еслиremap опция по умолчанию явно отключена сset noremap[!] в ~ / .vimrc. В этом случае отображение не будет рекурсивным (не рекомендуется).

Ваш ответ на вопрос