Яка різниця між "відображеними послідовностями ключів" та "ключовими кодами"? (timeoutlen v ttimeoutlen)


20

Посібник vim говорить, що ми можемо використовувати timeoutlenдля визначення довжини часу очікування відображених послідовностей ключів, а також можна ttimeoutlenвказати довжину тайм-ауту ключових кодів :

Корисна настройка була б

:set timeout timeoutlen=3000 ttimeoutlen=100

(тайм-аут на відображення через три секунди, тайм-аут на ключових кодах через десяту частину секунди).

Що таке ключові коди ? Чим вони відрізняються від відображених ключових послідовностей ?

Я знаю, що приклад відображеної послідовності ключів наведено jkз відображення нижче:

inoremap jk <esc>

У цьому прикладі, коли я перебуваю в режимі вставки та типу j, vim буде чекати , коли я timeoutlenнатискатимуть мілісекунди, kперш ніж вирішити, у чому полягає моя мета.

Але що таке ключовий код і як він ttimeoutlenвпливає на нього? Дякую тобі.

Відповіді:


22

Коротко:

  • keycodes - це спосіб представити ключ
  • Відображена відображена послідовність клавіш - це послідовність клавішних кодів, що викликають дію

Тепер я думаю, що ваше питання стосується більше різниці між, timeoutlenа ttimeoutlenне різницею між відображеною послідовністю ключів та кодом ключа.

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


Спочатку поговоримо про ключові коди. У статті визначено два типи ключових кодів:

  • Ключові коди терміналів:

    Вони є тим, як термінал представляє ключ.

    Ці коди, які термінал надсилає Vim.

    Щоб отримати список цих ключових кодів, ви повинні використовувати свою термінальну документацію. Ви також можете побачити їх, ввівши команду catу своєму терміналі та ввівши ключ, який ви хочете знати. Наприклад, на моєму терміналі код ключа ShiftF1виглядає так:

    ^[[23~

  • Ключові коди Vim:

    Вони є тим, як vim являє собою ключ.

    Vim потрібен послідовний спосіб представлення ключів, оскільки коди ключів терміналу змінюються від терміналу до іншого. Список ключових кодів Vim доступний за адресою :h t_ku. Ключ Vim для ShiftF1вигляду виглядає так:

    <S-F1>

Таким чином, коли я натискаю ShiftF1клавіатуру, драйвери та ОС повідомлять термінал, що я натиснув ці клавіші, що він буде інтерпретувати як ^[[23~. Термінал надішле це Vim, який зрозуміє, що це означає, <S-F1>і запустить дію, відображену на цей код ключа.

Ми можемо встановити Vim keycodes, тому якщо ваш термінал надсилає код, який Vim не розуміє, як, <S-F1>наприклад, ви можете використовувати наступну команду. Це підкаже Vim, коли отримаєте код ключа ^[[24~, перекладіть його <S-F1>:

set <S-F1> ^[[24~

Отже, що таке відображена ключова послідовність?

Послідовність зіставлених ключів буде долі карток і може бути кодами ключів Vim або кодами терміналів. Наприклад:

:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>

Перше відображення буде відображати код терміналу, а друге відображає код Vim.

Тепер про різницю між timeoutlenі ttimeoutlen?

  • ttimeoutlenчас Vim буде чекати різних частин терміналу ключових кодів (в нашому попередньому прикладі , що було б ^[тоді [то 2, і т.д. ...

    Оскільки ці ключові коди надсилаються терміналом, між цими входами не повинно бути затримок (оскільки терміналом вони надсилаються "відразу"). Ось чому doc рекомендує дійсно невелике значення для цього параметра.

  • timeoutlen це час, коли Vim чекатиме послідовних клавішів Vim, які вводяться користувачем вручну і, таким чином, довше вводити, ніж код терміналу.

Для використання прикладу скажімо, що:

  • Ви вказали ^[[1;6Bна дію
  • ^[1;6B - код коду вашого терміналу ctrlshiftdown
  • ^[- код коду вашого терміналу Escape.

Поведінка, яку слід очікувати:

  • Якщо ви встановите велику ttimeoutlen, кожен раз, коли ви вводите Escape, Vim буде чекати, щоб побачити, чи ви мали на увазі ^[(тобто Escape) або ^[1;6B(тобто ctrlshiftdown)
  • Якщо ви встановите малий ttimeoutlen, у вас не буде затримки, коли ви будете набирати текст, Escapeоскільки Vim знатиме, що це повний код коду.

І timeoutlenдіятиме на "вищому рівні", якщо у вас є такі відображення:

inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>

Коли ви введете jvim, будете чекати timeoutlenне тому, що початок коду терміналу для термінала jне завершений, а тому, що він чекає наступного коду ключа Vim.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.