Короче говоря:
- коды клавиш - это способ представления ключа
- Сопоставленная последовательность клавиш - это последовательность кодов клавиш, запускающих действие
Теперь я думаю, что ваш вопрос больше касается разницы между timeoutlen
и ttimeoutlen
вместо разницы между отображенной последовательностью клавиш и кодом клавиши.
Мой ответ основан на этой статье вики, которую вы действительно должны прочитать, потому что она затрагивает некоторые моменты, которые я здесь не упомянул, чтобы сделать ответ как можно более кратким и ясным.
Сначала поговорим о кодах клавиш. В статье определены два типа кодов клавиш:
Терминальные коды клавиш:
Они - то, как терминал представляет ключ.
Эти коды отправляются терминалом в Vim.
Чтобы получить список этих кодов клавиш, вы должны использовать документацию вашего терминала. Вы также можете увидеть их, набрав команду cat
в своем терминале и набрав ключ, который вы хотите знать код клавиши. Например, на моем терминале код ключа ShiftF1выглядит так:
^[[23~
Ключевые коды Vim:
Они как Vim представляют ключ.
Vim нужен последовательный способ представления ключей, потому что коды клавиш терминала меняются с терминала на другой. Список кодов клавиш Vim доступен по адресу :h t_ku
. Код ключа Vim для ShiftF1выглядит следующим образом:
<S-F1>
Таким образом, когда я нажимаю ShiftF1на клавиатуре, драйверы и ОС сообщат терминалу, что я нажал эти клавиши, что он будет интерпретировать как ^[[23~
. Терминал отправит это Vim, который поймет, что это значит, <S-F1>
и запустит действие, сопоставленное с этим кодом ключа.
Мы можем установить коды ключей Vim, поэтому, если ваш терминал отправляет код ключа, который Vim не понимает, как, <S-F1>
например, вы можете использовать следующую команду. Это сообщит Vim, когда вы получите код ключа ^[[24~
, переведите его <S-F1>
:
set <S-F1> ^[[24~
Итак, что такое сопоставленная последовательность клавиш?
Сопоставленная последовательность клавиш будет lhs сопоставления и может быть кодами ключей Vim или кодами терминалов. Например:
:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>
Первое отображение отобразит код ключа терминала, а второе - код ключа Vim.
Теперь о разнице между timeoutlen
и ttimeoutlen
?
ttimeoutlen
время Vim будет ждать различных частей терминала ключевых кодов (в нашем предыдущем примере , что было бы ^[
тогда [
то 2
, и т.д. ...
Поскольку эти коды клавиш отправляются терминалом, между этими входами не должно быть задержки (так как они отправляются терминалом «все сразу»). Вот почему документ рекомендует очень маленькое значение для этого параметра.
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>
Когда вы jнабираете vim, вы будете ждать timeoutlen
не потому, что начало кода терминала jне является полным, а потому, что оно ожидает следующего кода ключа Vim.
Я надеюсь, что мое объяснение имеет смысл, обратите внимание, что некоторые из отображений, которые я использовал, не имеют смысла с функциональной точки зрения, но приведены здесь для удобства объяснения.