Как отладить отображение?

66

Здесь я вижу много вопросов, где у пользователя есть отображение, которое не работает, и в большинстве случаев причины довольно схожи.

Я предлагаю сделать этот вопрос ссылкой для такого рода вопросов, чтобы дать полную процедуру для отладки отображения. Если у пользователя возникли проблемы с отображением, его можно перенаправить сюда, чтобы устранить наиболее распространенные проблемы.

Конечно, все еще будут особые случаи, которые потребуют специального вопроса и не будут рассматриваться здесь.

statox
источник

Ответы:

90

Ваше отображение не делает то, что должно делать или ведет себя не так, как ожидалось, необходимо выполнить несколько шагов, чтобы устранить следующие проблемы:

Убедитесь, что ключ эффективно сопоставлен с тем, что он должен делать

Vim предоставляет команду :map. По умолчанию (когда аргумент не указан) команда покажет все созданные в данный момент отображения. Вот пример результата команды:

результат <code>: map </ code>

Как всегда док твой друг: :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, убедитесь, что нет другой строки, которая также определяет сопоставление для того же ключа. .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 о картографировании и содержит интересные вопросы:

И бонус: вопрос о передовой практике, чтобы найти, какие ключи использовать в вашем отображении

statox
источник
2
Чтобы поделиться своим опытом с другими пользователями, как предложил наш модератор . И потому что, 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как я сказал в первой строке моего вопроса, сбор этих причин должен позволить уменьшить количество дублирующих вопросов о картографировании.
statox
1
Повторяющаяся проблема с ВИМОМ-латексом и французскими клавиатурами: <m-i>и éта же для Vim, и это то же самое со всей метой + ключом: они связаны с другими диакритическим.
Люк Эрмитт
1
Также важно знать, как читать локальные сопоставления буфера, когда мы запрашиваем их определение с помощью :map {sequence}-> есть *обратная подсветка того, что vim печатает перед связанным действием.
Люк Эрмитт
2
Иногда мы действительно хотим отладить то, что происходит. Обычно, когда сопоставление вызывает сопоставление плагинов или функцию с именем, которое невозможно запомнить, или со сложными параметрами В этом случае мы можем выполнить: :debug normal {keysequence}(без взрыва), или :debug i{keysequence}для отображения режима вставки и т.д. Если ключевая последовательность содержит такие вещи , как специальные клавиши ( <cr>, <left>, <c-x>, <m-i>, <leader>...). Затем нам нужно поиграть с execute + double-quotes + backslash -> :debug execute "normal \<leader>\<cr>Z".
Люк Эрмитт
2
Что касается мета-последовательностей, это старый пункт FAQ, поскольку vim-latex решил использовать такие вещи, как <m-i>. Большинство пользователей не используют мета-ключ, поскольку они строго ориентированы на запуск Vim в терминале, где мета-ключ не может быть использован просто. Нам нужно использовать gvim или macvim, чтобы заметить проблему.
Люк Эрмит