Каковы различия между командами map, noremap, abbrev и noreabbrev?

19

Эти команды каким-то образом преобразуют один набор нажатий клавиш в другой, но я не совсем понимаю, какой из них наиболее подходит для некоторой ситуации. Кроме того, есть !варианты их. На данный момент я использую их довольно случайно, поэтому я могу знать, с какими подводными камнями связан каждый из них? В частности, заметки о различных версиях режима могут быть полезны, так как я узнал от Питера Ринкера в комментарии, который cmapможет расширяться практически везде в строке, а не только при использовании :команд. Какие меры предосторожности я могу предпринять против потенциальных ловушек?

Мур
источник
Следующая часть немного мета: какую форму мы должны использовать при ответе на этом сайте? - я должен задать это на Мете, или добавить это к вопросу?
Муру
Я бы сказал, что это зависит. Я бы всегда использовал версию noremap, если демонстрировал отображение. Таким образом, люди привыкли использовать нерекурсивные отображения над рекурсивными версиями. Если, конечно, есть причина использовать карту специально, например, в отображении <Plug>.
Акшай

Ответы:

21

Во- первых, mapи noremapпохожи в том , что каждый создания отображений для нормальной, визуальный, выберите и оператор в ожидании режима одновременно . Vim детализирует это в :help map-overview:

Overview of which map command works in which mode.  More details below.
     COMMANDS                    MODES ~
:map   :noremap  :unmap     Normal, Visual, Select, Operator-pending
:nmap  :nnoremap :nunmap    Normal
:vmap  :vnoremap :vunmap    Visual and Select
:smap  :snoremap :sunmap    Select
:xmap  :xnoremap :xunmap    Visual
:omap  :onoremap :ounmap    Operator-pending
:map!  :noremap! :unmap!    Insert and Command-line
:imap  :inoremap :iunmap    Insert
:lmap  :lnoremap :lunmap    Insert, Command-line, Lang-Arg
:cmap  :cnoremap :cunmap    Command-line

Согласно приведенной выше справке, если вы хотите ограничить сопоставление определенным режимом, вы должны добавить:

'n' (для обычного), 'v' (для визуального и выберите), 'c' (для команды), 'x' (для визуального режима), 's' (для выбора), 'o' (для ожидающего оператора ).

Например,

nmap n nzz

создаст нормальный режим рекурсивного отображения n.

Теперь noremapэто просто нерекурсивная версия map.

Так что же такое нерекурсивное отображение? У Vim тоже есть ответ :help map-recursive:

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times.  The
only problem is that the only way to stop this is by causing an error.  The
macros to solve a maze uses this, look there for an example.  There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
   :map ab abcd
will execute the "a" command and insert "bcd" in the text.  The "ab" in the
{rhs} will not be mapped again.

Примером этого является отображение следующего:

:imap j k

:imap k j

Теперь vim заменит j на k и k на j бесконечное число раз и, следовательно, покажет вам ошибку, что вы создали рекурсивное отображение.

Вот почему обычно рекомендуется, чтобы вы почти всегда (кроме случаев, когда у вас есть <Plug>сопоставления или аналогичные) использовали нерекурсивные сопоставления. Это предотвращает зависание Vim при непреднамеренном создании рекурсивных отображений. Поэтому нерекурсивное отображение является более безопасным способом отображения команд в Vim.

Имея вышеуказанную информацию, мы можем видеть, что :noreabbrevэто просто нерекурсивная версия :abbrevкоманды.

Вы можете использовать :abbrevтолько в режимах вставки, замены и командования. :abbrevиспользуется для создания сокращений (или ярлыков, которые может расширять Vim). Короткое расширение - использовать :map/ :noremapдля создания отображений, :abbrev/ :noreabbrevдля создания сокращений или всякий раз, когда вы хотите, чтобы Vim расширил вашу типизацию.

Акшай
источник
1
Избегание зависаний - не единственная причина использования noreформ команды map. Еще одна (и, на мой взгляд, более важная) причина их использования заключается в том, что они делают ваши сопоставления надежными / предсказуемыми. Если вы используете простую форму, а rhsключ содержит ключ, который оказывается сопоставленным с чем-то другим, то ваше сопоставление может иметь совершенно другое поведение, чем предполагалось.
Богатый