| ч6. nmap, imap, vmap | Содержание | ч8. Лидер {Leaders} |
Будьте готовы, сейчас будет полная дичь.
До этого момента мы использовали map, nmap, vmap, и imap для создания сопоставлений, это экономит нам время, работает, но.... Выполните следующие команды:
:nmap - dd
:nmap \ -
Теперь попробуйте нажать < \ >(в обычном режиме). Что же происходит?
Когда вы нажимаете < \ >, Vim видит сопоставление и говорит: "Я должен запустить < - > вместо этого". Но мы уже сопоставили < - >, чтобы сделать что-то еще! Vim видит это и говорит: "О, теперь мне нужно запустить < dd >", и поэтому удаляет текущую строку.
Когда вы сопоставляете ключи с помощью этих команд, Vim будет учитывать и другие сопоставления. На первый взгляд это может показаться хорошей вещью, но на самом деле это чистое зло. Давайте поговорим о том, почему это так, но сначала удалите эти сопоставления, выполнив следующие команды:
:nunmap -
:nunmap \
Рекурсия
Выполните эту команду:
:nmap dd O<esc>jddk
На первый взгляд может показаться, что мы сопоставляем dd с:
- Создай новую строку над текущей
- Выйди из режима вставки
- Вернись на одну строчку вниз
- Удали текущую строчку
- Перейди к только что созданной пустой строке.
То есть мы просто хотим "очистить текущую строку". Попробуйте.
При нажатии < dd > , Vim зависнет и начнёт выдавать без перерыва пустые строки. Выйти из этого безобразия, что бы получить контроль над Vim нажми <Ctrl-c>. Но теперь в нашем файле будет куча пустых строк! Что же произошло?
Это сопоставление на самом деле рекурсивно! Когда вы нажимаете < dd >, Vim говорит:
У меня есть сопоставление для < dd > поэтому надо выполнить следующее:
- Создать строку [ O<esc>jddk ]
- Выйти из режима вставки [ O<esc>jddk ]
- Переместись вниз на строку [ O<esc>jddk ]
У меня есть сопоставление для < dd > поэтому надо выполнить следующее: [ O<esc>jddk ]
- Создать строку [ O<esc>jddk ]
- Выйти из режима вставки [ O<esc>jddk ]
- Переместись вниз на строку [ O<esc>jddk ]
- У меня есть сопоставление для < dd > поэтому надо выполнить следующее: [ O<esc>jddk ]
и так далее
Это сопоставление никогда не завершиться! Поэтому удалите этот ужас с помощью следующей команды:
:nunmap dd
Побочные эффекты
Один большой недостаток команд < *map > заключается в том, что есть опасность переопределения, таким образом поведение ваших команд может измениться, если вы установите плагин, который по своему сопоставляет ключи, от которых могут зависеть ваши сопоставления.
Когда вы установите плагин Vim, скорее всего вы не будете использовать и запоминать каждое созданное им сопоставление. Даже если вы это сделаете, вам придется вернуться и просмотреть свой ~/.vimrc файл, чтобы убедиться, что ни одно из ваших пользовательских сопоставлений не использует ключ, сопоставленный плагином.
Это сделало бы установку плагинов утомительной и подверженной ошибкам. Должен быть лучший способ.
Нерекурсивное отображение
Vim предлагает другой набор команд сопоставлений, которые не будут учитывать сопоставления, когда они выполняются. Выполните следующие команды:
:nmap x dd
:nnoremap \ x
Теперь нажмите < \ > и посмотрите, что произойдет. При нажатии < \ > Vim игнорирует < x > сопоставление и он будет делать то, что < x > делает по умолчанию, а именно удалит текущий символ, а не строку
Каждая из < *map >команд имеет < *noremap >аналог, который игнорирует другие сопоставления: noremap, nnoremap, vnoremap, и inoremap.
(прим. Читай как: nnoremap = normal no recursion map. vnoremap = visual no recursion map. inoremap = insert no recursion map )
Когда вы должны использовать эти нерекурсивные варианты вместо их обычных аналогов?
Всегда.
Нет, серьезно, всегда
Избавьте себя от лишних хлопот и введите дополнительные символы, что бы избавиться от рекурсии навсегда.
Упражнения
Преобразуйте все ваши в сопоставления в ~/.vimrc на их нерекурсивные аналоги.
Прочти: help unmap
| ч6. nmap, imap, vmap | Содержание | ч8. Лидер {Leaders} |