要するに:
- キーコードはキーを表す方法です
- マップされたキーシーケンスは、アクションをトリガーする一連のキーコードです。
さて、あなたの質問は、マップされたキーシーケンスとキーコードの違いについてでtimeoutlen
あり、ttimeoutlen
代わりにキーコードの違いについてであると思います。
私の答えは、このウィキアの記事に基づいています。これは、答えをできるだけ短く明確にするために、ここで言及しなかったいくつかの点を扱っているため、本当に読むべきです。
まず、キーコードについて説明しましょう。この記事では、2種類のキーコードを定義しています。
端末キーコード:
これらは、端末がキーを表す方法です。
端末からVimに送信されるこれらのコード。
これらのキーコードのリストを取得するには、端末のドキュメントを使用する必要があります。またcat
、ターミナルでコマンドを入力し、キーコードを知りたいキーを入力することでそれらを見ることができます。たとえば、私の端末では、キーコードはShiftF1次のようになります。
^[[23~
Vimキーコード:
vimがキーを表す方法です。
端末のキーコードは端末ごとに変わるため、Vimはキーを表す一貫した方法を必要とします。Vimキーコードのリストはでアクセスできます:h t_ku
。VimのキーコードはShiftF1次のようになります。
<S-F1>
したがってShiftF1、キーボードを押すと、ドライバーとOSは、これらのキーを押したことを端末に通知します^[[23~
。端末はそれをVimに送信し、Vimはそれが<S-F1>
このキーコードにマッピングされたアクションを意味し、トリガーすることを理解します。
Vimキーコードを設定<S-F1>
することができます。そのため、たとえばVimが理解できないキーコードを端末が送信する場合、次のコマンドを使用できます。これにより、キーコードを受信したときにVimに通知され^[[24~
、翻訳されます<S-F1>
:
set <S-F1> ^[[24~
それでは、マップされたキーシーケンスとは何ですか?
マッピングされたキーシーケンスはマッピングのlhsであり、Vimキーコードまたはターミナルキーコードになります。例えば:
:nmap ^[[24~ :bn<CR>
:nmap <S-F1> :bn<CR>
最初のマッピングは端末キーコードをマッピングし、2番目のマッピングはVimキーコードをマッピングします。
今との違いのためtimeoutlen
とttimeoutlen
?
ttimeoutlen
は、Vimが端末キーコードのさまざまな部分を待機する時間です(前の例では^[
thenに[
なり2
ます...など)。
これらのキーコードは端末から送信されるため、これらの入力間に遅延はありません(端末から「一度に」送信されるため)。これが、この設定で本当に小さな値を推奨している理由です。
timeoutlen
は、ユーザーが手動で入力する連続したVimキーコードをVimが待機する時間であり、ターミナルキーコードよりも入力が長くなります。
例を使用するには、次のように言ってみましょう。
^[[1;6B
アクションにマッピングしました
^[1;6B
端末のキーコードは ctrlshiftdown
^[
は端末のキーコードですEscape。
予想される動作:
- を大きく設定すると
ttimeoutlen
、入力するたびにEscape、Vimは^[
(つまりEscape)または^[1;6B
(つまりctrlshiftdown)
- smallを設定すると
ttimeoutlen
、EscapeVimが完全なキーコードであることを認識するため、入力時に遅延が発生しません。
そして、timeoutlen
あなたは以下のマッピングを持っている場合は、「より高いレベル」に基づいて行動します。
inoremap jj <Esc>
inoremap jk <Esc>:nohl<CR>
jvim を入力するtimeoutlen
と、ターミナルキーコードの開始がj完了していないためではなく、次のVimキーコードを待機しているため、待機します。
私の説明が理にかなっていることを望みます。私が使用したマッピングのいくつかは機能的な観点では意味をなさないが、説明の便宜上ここにあります。