「マップされたキーシーケンス」と「キーコード」の違いは何ですか?(timeoutlen v ttimeoutlen)


20

vimのマニュアルでは、我々が使用できると言うtimeoutlenのタイムアウトの長さを指定するためにマッピングされたキーシーケンスをして使用することができるttimeoutlenのタイムアウトの長さを指定するキーコードを

便利な設定は

:set timeout timeoutlen=3000 ttimeoutlen=100

(3秒後のマッピングでのタイムアウト、1/10秒後のキーコードでのタイムアウト)。

キーコードとは何ですか?マッピングされたキーシーケンスとはどう違うのですか?

マッピングされたキーシーケンスの例はjk、以下のマッピングのものです。

inoremap jk <esc>

この例では、挿入モードでを入力するとj、vimはtimeoutlen押すのをミリ秒待ってからk、意図を決定します。

しかし、キーコードとは何であり、どのようにttimeoutlen影響しますか?ありがとうございます。

回答:


22

要するに:

  • キーコードはキーを表す方法です
  • マップされたキーシーケンスは、アクションをトリガーする一連のキーコードです。

さて、あなたの質問は、マップされたキーシーケンスとキーコードの違いについてで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キーコードをマッピングします。

今との違いのためtimeoutlenttimeoutlen

  • ttimeoutlenは、Vimが端末キーコードのさまざまな部分を待機する時間です(前の例では^[thenに[なり2ます...など)。

    これらのキーコードは端末から送信されるため、これらの入力間に遅延はありません(端末から「一度に」送信されるため)。これが、この設定で本当に小さな値を推奨している理由です。

  • timeoutlen は、ユーザーが手動で入力する連続したVimキーコードをVimが待機する時間であり、ターミナルキーコードよりも入力が長くなります。

例を使用するには、次のように言ってみましょう。

  • ^[[1;6Bアクションにマッピングしました
  • ^[1;6B 端末のキーコードは ctrlshiftdown
  • ^[は端末のキーコードですEscape

予想される動作:

  • を大きく設定するとttimeoutlen、入力するたびにEscape、Vimは^[(つまりEscape)または^[1;6B(つまりctrlshiftdown
  • smallを設定するとttimeoutlenEscapeVimが完全なキーコードであることを認識するため、入力時に遅延が発生しません。

そして、timeoutlenあなたは以下のマッピングを持っている場合は、「より高いレベル」に基づいて行動します。

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

jvim を入力するtimeoutlenと、ターミナルキーコードの開始がj完了していないためではなく、次のVimキーコードを待機しているため、待機します。


私の説明が理にかなっていることを望みます。私が使用したマッピングのいくつかは機能的な観点では意味をなさないが、説明の便宜上ここにあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.