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


1113

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


1
Обережно vnoremapта vmapпрацюйте в режимі Visual AND Select. Щоб мати відображення лише у візуальному режимі, використовуйте xmapта xnoremap.
Бенуа

Відповіді:


1626

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

8
Дякую за вашу відповідь! Також коли використовується рекурсивна та коли нерекурсивна?
Четан

14
@Chetan: Це залежить від того, чого ти хочеш досягти. Я схильний використовувати нерекурсивні частіше, але якщо ви визначили порівняно складне картографування з використанням нерекурсивного та інше відображення, яке робить усе, що робить перше картографування, та інше, може бути простіше використовувати рекурсивне відображення, що включає оригінальний, а не повторне повторне введення цілого нерекурсивного (особливо, якщо потім потрібно підправити оригінальний).
DrAl

10
Я мав на увазі noremapбути деякою протилежністю map. Я маю на увазі щось, що знімає відображення. Дякую за відповідь. Це прояснило мене
Pavan Manjunath

4
Це не так важливо для більшості випадків використання, але слід зазначити, що :mapтощо працюють не у всіх режимах, а саме у всіх загальних (зокрема, звичайному, візуальному, вибраному і режим очікування від оператора). Якщо ви хочете, щоб відображення працювало в режимі вставки, командного рядка або lang-arg, вам потрібно використовувати :map!і т.д. (Джерело: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
Кен Беллоуз

3
@whytheq noremap = нерекурсивне відображення
Dan Bechard,

281

Я думаю, що документація Vim повинна була пояснити значення, яке стоїть за називанням цих команд. Тільки кажучи вам, що вони роблять, це не допоможе вам запам'ятати імена.

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

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

(Зверніть увагу, що існують також такі !режими, map!які застосовуються для вставки та командного рядка.)

Дивіться нижче, що означає "рекурсивний" у цьому контексті.

Попередження букви режиму, як-от nзміна режимів, у яких працює відображення. Він може вибрати підмножину списку застосовних режимів (наприклад, лише "візуальний") або вибрати інші режими, до mapяких не застосовуватиметься (наприклад, "вставити").

Використання help map-modesпокаже вам кілька таблиць, які пояснюють, як керувати, для яких режимів відображення застосовується.

Букви в режимі:

  • n: тільки нормально
  • v: візуально та виберіть
  • o: очікує на оператора
  • x: лише візуально
  • s: вибрати лише
  • i: вставити
  • c: командний рядок
  • l: вставка, командний рядок, regexp-search (та ін.. Псевдорежим "Lang-Arg" у сукупності)

" Рекурсивний " означає, що відображення розгортається на результат, потім результат розширюється на інший результат тощо.

Розширення припиняється, коли одне з них відповідає дійсності:

  1. результат більше не відображається ні на що інше.
  2. застосовано нерекурсивне відображення (тобто "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 не використовувався.


4
Одне: mapстосується лише звичайних, візуальних, вибраних та очікуваних оператором режимів, а не всіх режимів.
Брайан Маккотчон

1
слід прийняти відповідь.
Тихоліз

це спосіб кращої відповіді, ніж прийнятий.
MilMike

19

Одна відмінність полягає в тому, що:

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

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

Отже: mapне відображається у всіх режимах .

Для відображення всіх режимів вам потрібно і те, :mapі :map!.


5
Обережно !! command mode- ще одна історична назва normal modeвіз. розділ 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). Абревіатура "c" означає "командний рядок". Іншими словами, за замовчуванням: map! lhs rhs рекурсивно відображає lhs в rhs для режимів insert + command-LINE . Тобто, якщо параметр remapза замовчуванням явно не вимкнено set noremap[!]в ~ / .vimrc. У такому випадку картографування не буде рекурсивним (не доцільним).
Cbhihe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.