В чем разница между «сопоставленными последовательностями клавиш» и «кодами клавиш»? (timeoutlen v ttimeoutlen)

20

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

Полезная настройка будет

:set timeout timeoutlen=3000 ttimeoutlen=100

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

Что такое коды клавиш ? Чем они отличаются от сопоставленных последовательностей клавиш ?

Я знаю пример сопоставленной последовательности клавиш jkиз приведенного ниже сопоставления:

inoremap jk <esc>

В этом примере, когда я нахожусь в режиме вставки и jнабираю, vim будет ждать timeoutlenмиллисекунды, пока я нажму, kпрежде чем решить, каково мое намерение.

Но что такое ключевой код и как он ttimeoutlenвлияет? Спасибо вам.

Нико Беллик
источник

Ответы:

22

Короче говоря:

  • коды клавиш - это способ представления ключа
  • Сопоставленная последовательность клавиш - это последовательность кодов клавиш, запускающих действие

Теперь я думаю, что ваш вопрос больше касается разницы между 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.


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

statox
источник