Коротко:
- 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.
Я сподіваюся, що моє пояснення має сенс, зауважте, що деякі застосовані вами відображення не мають сенсу функціональної точки зору, але тут для зручності пояснення.