Ваша картографічна робота не робить те, що вона повинна робити, або поводиться інакше, ніж очікувалося. Для усунення несправностей необхідно виконати кілька кроків:
Переконайтеся, що ключ ефективно відображений до того, що він повинен робити
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
: перший - це відображення, змінене моїм, .vimrc
а друге - відображення, створене плагіном:
Тепер, якщо ви бачите, що інший скрипт змінив ваше відображення, вам доведеться побачити, чи можете ви його видалити чи змінити його поведінку. (Зверніть увагу, що деякі додатки надають змінну, щоб увімкнути / вимкнути їх відображення, на жаль, не всі додатки роблять це)
Якщо останній файл, який змінив ваше відображення, є вашим .vimrc
, переконайтеся, що немає іншого рядка, який також визначає відображення того ж ключа. .vimrc
Файл буде щасливо скасовує будь-які порівняння з останнім у своєму роді в файлі.
Перевірте, чи справді Вайм перехопив Вашу карту
Кілька ситуацій можуть свідчити про те, що 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
як я вже говорив у першому рядку свого питання, тому збір цих причин повинен дозволяти зменшити кількість повторюваних запитань щодо картографування.