Ваше отображение не делает то, что должно делать или ведет себя не так, как ожидалось, необходимо выполнить несколько шагов, чтобы устранить следующие проблемы:
Убедитесь, что ключ эффективно сопоставлен с тем, что он должен делать
Vim предоставляет команду :map
. По умолчанию (когда аргумент не указан) команда покажет все созданные в данный момент отображения. Вот пример результата команды:
Как всегда док твой друг: :h map-listing
Вы можете видеть в первом столбце режим отображения ( n
для нормального режима,
v
для визуального режима и т. Д.), Во втором столбце отображаются сопоставленные ключи и в последнем столбце отображаются ключи. Обратите внимание, что перед отображаемыми действиями могут появиться некоторые дополнительные символы, важно понять их:
*
указывает на то, что он не может быть переназначен (т.е. это не рекурсивное отображение, см. know when to use nore
далее в этом ответе)
&
указывает на то, что только сопоставления сценария локальны
@
указывает на локальное отображение буфера
При обращении за помощью в отношении сопоставления полезно добавить эту информацию, поскольку она может помочь другим людям понять поведение вашего сопоставления.
Можно ограничить запрос на конкретный режим с родственными-команд :map
, как :vmap
, :nmap
, :omap
и т.д.
Теперь, чтобы ограничить ваш поиск проблемным отображением, вы можете передать последовательность ключей, которую вы отлаживаете, в качестве параметра команд, например так:
:map j
:map <Leader>m
:map <F5>
Обратите внимание, что <Leader>
ключ будет заменен его фактическим значением в списке.
Если результат выполнения команды показывает, что ваши ключи правильно сопоставлены, это, вероятно, означает, что проблема связана не с Vim, а с вашим терминалом или средой рабочего стола. Посмотрите часть Проверьте, действительно ли ваше отображение было перехвачено Vim
Если результат команды показывает, что ваши ключи не правильно сопоставлены, см. Следующую часть.
Проверьте, что перекрывает ваше отображение
Другое удобное использование :map
команды - объединить ее с verbose
: Это предложит последний файл, который изменил ваше отображение.
Например, посмотрите эти два снимка экрана, которые являются результатами :verbose map
: первый - это отображение, измененное my, .vimrc
а второй - созданный плагином:
Теперь, если вы видите, что другой скрипт изменил ваше отображение, вам нужно будет посмотреть, сможете ли вы удалить его или изменить его поведение. (Обратите внимание, что некоторые плагины предоставляют переменные для включения / отключения их отображений, к сожалению, не все плагины делают это)
Если последний файл, который изменил ваше сопоставление, принадлежит вам .vimrc
, убедитесь, что нет другой строки, которая также определяет сопоставление для того же ключа. .vimrc
Файл будет счастливо отменяет любые сопоставления с последним в своем роде в файле.
Проверьте, действительно ли ваше отображение было перехвачено Vim
Несколько ситуаций могут указывать на то, что Vim не перехватывает ваш ключ:
- Команда
:map
показывает, что ваша клавиша правильно сопоставлена, но нажатие на нее ничего не дает.
- Ваше отображение работает на gVim (GUI), но ничего не делает в терминале Vim
- Ваше отображение работает на определенном эмуляторе терминала, но не на другом
- Ваше отображение работает на определенной ОС, но не на другой.
Это, вероятно, вызвано одной из двух следующих вещей:
Что-то перехватывает ключ перед Vim : это могут быть разные приложения: ваша ОС, среда рабочего стола, ваш эмулятор терминала, Tmux (если вы его используете) ...
Чтобы устранить это, вы должны:
- Попробуйте временно удалить свой,
.tmux.conf
если вы используете tmux
- Обратитесь к документации вашего терминала или вашего рабочего стола.
Вы также можете сослаться на дочерние сайты, такие как суперпользователь ,
Unix и Linux , askUbuntu и т. Д.
Если это проблема, то у вас есть два решения: либо вы тратите (много) времени на изменение поведения приложения, которое вызывает проблему, либо вы находите другую комбинацию клавиш для сопоставления, которая не перехватывается другим приложением.
Ваш эмулятор терминала не может обрабатывать комбинацию клавиш, которую вы пытаетесь отобразить : эмуляторы терминала реализованы по-разному, и некоторые из них не могут обрабатывать какую-то конкретную комбинацию клавиш. (Причина, по которой они не могут этого сделать, выходит за рамки этого вопроса, см. Их документ или родственные сайты, упомянутые ранее для более подробной информации).
В этом случае у вас не так много решений: либо вы меняете ключ на другой, который обрабатывается вашим терминалом, либо вы меняете эмулятор терминала.
Проверьте на общие ловушки
Некоторые проблемы в отображениях довольно повторяются и в основном связаны с синтаксисом vimscript. Если ваше отображение имеет непредвиденное поведение, не забудьте проверить следующие пункты:
Не размещайте комментарий в той же строке, что и ваше отображение , вместо этого поместите комментарий в строку выше. Пример:
Не делай этого:
inoremap ii <esc> " ii to go back into normal mode
Vim будет рассматривать пробелы, и "
и комментарий как часть отображения, что приведет к неожиданному поведению.
Вместо этого сделайте это:
" ii to go back into normal mode
inoremap ii <esc>
Это легче читать и не испортит ваше отображение.
Не передавайте свои команды по трубопроводу|
. Пример:
Не делай этого:
nnoremap <Leader>x :w | !% python -m json.tools
Vim будет рассматривать канал |
как завершение команды: когда вы создадите свое .vimrc
отображение nnoremap <Leader>x :w
, тогда !% python -m json.tools
будет выполнена внешняя команда .
Вместо этого сделайте это:
nnoremap <Leader>x :w <bar> !% python -m json.tools
Смотрите объяснение о<bar>
.
Знайте, когда использовать nore
: всегда .
LearnVimscriptTheHardWay объяснить это довольно ясно: никогда не использовать map
, nmap
, vmap
и т.д ... Всегда предпочитаю версию NORE: noremap
, nnoremap
, vnoremap
, и т.д. ... Почему? nore
означает non-recursive
отображение, это означает, что правая часть отображения будет считаться встроенной функцией, даже если вы изменили ее. Пример:
Допустим, вы хотите сопоставить, >
чтобы удалить строку и -
увеличить отступ строки. Если вы не используете нерекурсивные отображения, вы сделаете это:
( Не делай так это для примера )
nmap > dd
nmap - >
Когда вы нажмете, >ваша строка будет удалена, это хорошо. Но когда вы нажмете, -ваша строка также будет удалена вместо отступа. Почему? Потому что Вим понимал: «Я получил удар, на -
который я должен перевести, на >
который я, в свою очередь, должен перевести dd
».
Вместо этого сделай это
nnoremap > dd
nnoremap - >
Таким образом Vim будет переводить так же, -
как >
и не будет пытаться сделать какой-либо другой перевод из-за nore
.
Редактировать примечание «Всегда» может быть преувеличенным ответом, в некоторых случаях вам нужно использовать форму рекурсивного отображения, но это не очень распространено. Чтобы уточнить, я процитирую @romainl из этого ответа :
Используйте рекурсивное отображение, только если вы собираетесь использовать любое другое отображение в своем отображении. Используйте нерекурсивные отображения, если вы этого не сделаете.
Помните, что некоторые комбинации клавиш эквивалентны : из-за создаваемых шестнадцатеричных кодов некоторые комбинации клавиш будут интерпретироваться Vim как другой ключ. Например
<C-h>
эквивалентно <backspace>
<C-j>
как <enter>
- На французских клавиатурах так
<M-a>
же, как á
и на всех
<m-
сопоставлениях. Как отметил @LucHermitte в комментарии, это проблема с плагинами, использующими такие типы отображений, как vim-latex.
<C-S-a>
эквивалентно
<C-a>
. Отображение Ctrl + заглавная буква отдельно от Ctrl + строчная буква не возможно из-за способа, которым терминалы отправляют коды ASCII.
Если ваше отображение влияет на другой ключ, попробуйте использовать другую комбинацию lhs, если это решает проблему, проверьте, какие шестнадцатеричные коды отправляются в Vim.
Убедитесь, что ваш лидер определен правильно : если ваши сопоставления<leader>
не работают, и вы изменили своего лидера с помощью командыmapleader
, убедитесь, что определение вашего лидера выполнено до определения отображений. В противном случае Vim попытается создать сопоставления с ключом, который не является тем, который вы думаете. Также, если вы хотите использовать пробел в качестве лидера (что довольно актуально), убедитесь, что вы использовали правильные обозначения:let mapleader = "\<Space>"
Ваше отображение все еще не работает?
Если вы прошли все этапы этого ответа и ваше сопоставление по-прежнему не работает так, как вы хотите, вы, вероятно, захотите обратиться за помощью на этот сайт.
Чтобы помочь людям не забыть предоставить важную информацию, такую как:
- Команда, которую вы использовали для определения вашего отображения.
- Что вы ожидаете от своего отображения?
Точное описание проблемы:
«Это не работает» не очень поможет людям, которые попытаются вам помочь. Вы должны уточнить, если отображение ничего не делает или как оно ведет себя не так, как вы ожидали.
- Также укажите, что вы действительно выполнили шаги, описанные здесь, и результаты, которые вы получите,
:map
и:verbose map
Все это сэкономит вам и пользователям сайта много времени.
Полезная команда: :unmap
Иногда бывает полезно сбросить отображение, не выходя из Vim, чтобы помочь отладить его поведение.
Для этого вы можете использовать команду, :unmap <key>
которая удалит сопоставление, назначенное <key>
для обычного, визуального и рабочего режимов ожидания. :iunmap
удалит сопоставления для режима вставки. Для других режимов см :help :unmap
.
Рекомендации
Отличное введение в картографирование: learnvimscriptthehardway (и много других аспектов Vim)
Док: :h mapping
,
:h :map
Раздел 20 часто задаваемых вопросов Vim о картографировании и содержит интересные вопросы:
И бонус: вопрос о передовой практике, чтобы найти, какие ключи использовать в вашем отображении
I see a lot of questions on here where a user has a mapping which doesn't work and most of the time the reasons are pretty similar
как я сказал в первой строке моего вопроса, сбор этих причин должен позволить уменьшить количество дублирующих вопросов о картографировании.<m-i>
иé
та же для Vim, и это то же самое со всей метой + ключом: они связаны с другими диакритическим.:map {sequence}
-> есть*
обратная подсветка того, что vim печатает перед связанным действием.:debug normal {keysequence}
(без взрыва), или:debug i{keysequence}
для отображения режима вставки и т.д. Если ключевая последовательность содержит такие вещи , как специальные клавиши (<cr>
,<left>
,<c-x>
,<m-i>
,<leader>
...). Затем нам нужно поиграть с execute + double-quotes + backslash ->:debug execute "normal \<leader>\<cr>Z"
.<m-i>
. Большинство пользователей не используют мета-ключ, поскольку они строго ориентированы на запуск Vim в терминале, где мета-ключ не может быть использован просто. Нам нужно использовать gvim или macvim, чтобы заметить проблему.