Як налагодити відображення?


65

Я бачу тут багато питань, коли у користувача є картографування, яке не працює, і більшість випадків причини досить схожі.

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

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

Відповіді:


88

Ваша картографічна робота не робить те, що вона повинна робити, або поводиться інакше, ніж очікувалося. Для усунення несправностей необхідно виконати кілька кроків:

Переконайтеся, що ключ ефективно відображений до того, що він повинен робити

Vim надає команду :map. За замовчуванням (коли не вказано жодного аргументу) команда покаже всі створені в даний час відображення. Ось приклад результату команди:

результат <code>: карта </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: перший - це відображення, змінене моїм, .vimrcа друге - відображення, створене плагіном:

Набір карток від 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 стосується картографування та містить цікаві запитання:

І бонус: запитання про найкращі практики пошуку ключових ключів у картографуванні


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
Повторювана проблема з клавіатурами vim-latex та французькою мовою: <m-i>і éоднакова для vim, і однакова з усіма мета + клавішами: вони пов'язані з різною діакритикою.
Люк Ермітт

1
Також важливо знати, як читати буферні локальні відображення, коли ми запитуємо їх визначення за допомогою :map {sequence}-> є *зворотна підсвітка у тому, що vim друкує перед пов’язаною дією.
Люк Ермітт

2
Іноді ми дуже хочемо налагодити те, що відбувається. Зазвичай, коли відображення викликає відображення плагіну, або функцію з іменем, неможливо запам'ятати, або зі складними параметрами. У цьому випадку ми можемо виконати: :debug normal {keysequence}(без вибуху), або :debug i{keysequence}для відображення режиму вставки і т.д. Якщо ключова послідовність містить такі речі , як спеціальні клавіші ( <cr>, <left>, <c-x>, <m-i>, <leader>...). Тоді нам потрібно пограти з Execute + подвійними котируваннями + backslash -> :debug execute "normal \<leader>\<cr>Z".
Люк Ермітт

2
Щодо метапослідовностей, то це стара точка поширених запитань, оскільки vim-latex вирішив використовувати такі речі <m-i>. Більшість користувачів не використовують мета-ключ, оскільки вони сильно орієнтовані на запуск Vim у терміналі - там, де мета-ключ не може бути використаний просто. Нам потрібно використовувати gvim або macvim, щоб помітити проблему.
Люк Ермітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.