Які відмінності між командами map, noremap, skrav та noreabbrev?


19

Ці команди певним чином перетворюють один набір натискань клавіш на інший, але я дещо нечіткий, на якому з найбільш підходящих для певної ситуації. Крім того, існують і !варіанти їх. Наразі моє використання їх є досить випадковим, тож чи можу я знати, які підводні камені пов'язані з кожним? Зокрема, примітки про різні версії режимів можуть бути корисними, оскільки я дізнався від Пітера Рінкера в коментарі, який cmapможе розширюватися майже в будь-якій точці рядка, а не лише при використанні :команд. Які заходи безпеки можна вжити проти можливих підводних каменів?


Наступна частина - це трохи мета: Яку форму слід використовувати, відповідаючи на цьому сайті? - чи слід запитати це на Meta чи додати це до питання?
муру

Я б сказав, що це залежить. Я б завжди використовував версію 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містить ключ, який, як буває, відображається на щось інше, то ваше відображення може мати зовсім іншу поведінку, ніж передбачалося.
Багатий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.