ターミナルエミュレータはShift + Fキーをどのように処理しますか?

ターミナルエミュレータはShift + Fキーをどのように処理しますか?

この質問は以下からインスピレーションを得ました。vi.SEに関するもう一つの質問。 OPには、実行時に+ShiftキーF8の組み合わせに問題があります。端末エミュレータがそれを正しく渡していないため(少なくとも私がデバッグしたものでは)キーの組み合わせは機能しません。vimurxvtvim

F端末エミュレータがキーをどのように処理するのかわかりません。

存在するurxvt

  • Shift+を押すとF8 ~エコーが鳴ります。
  • F7(または他のFキー)を押すと~エコーされます。

vim内部urxvt

  • Shift+を押すとF8効果が表示されます~~
  • Shift+を押すとF7効果が表示されます~
  • Shift+を押すとF6効果が表示されます~~~

一方xterm

  • Shift+を押すとF8 ;2~エコーが鳴ります。
  • F8(または他のFキー)を押すと~エコーされます。

なぜこのような結果が出るのか理解できません。

追加のデバッグのために実行して、xev次のような結果を得ました。

~のためF8

KeyPress event, serial 29, synthetic NO, window 0x2000001,
    root 0x7e, subw 0x0, time 17730758, (431,256), root:(432,275),
    state 0x0, keycode 74 (keysym 0xffc5, F8), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

Shift

KeyPress event, serial 32, synthetic NO, window 0x2000001,
    root 0x7e, subw 0x0, time 17733031, (431,256), root:(432,275),
    state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

そして右側にShift

KeyPress event, serial 32, synthetic NO, window 0x2000001,
    root 0x7e, subw 0x0, time 17733372, (431,256), root:(432,275),
    state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

しかし、私はそこでまったく奇妙なものを見ませんでした。

端末エミュレータはこれらのキー(Fキー)をどのように処理しますか?ターミナルエミュレータは何から情報を受け取りますかx11?内部で実行されているプログラムにどのように渡しますか?

私はいつもFキーがEsc数字を追加するだけの組み合わせだと思いました。今私は私が間違っていたことがわかりました。


付録

そこではFキーが正しく機能しませんShift。私がするなら:vimurxvt

:map <f8> :echo "yay"<CR>

を押すと「ああ」が正しくエコーされますF8

ベストアンサー1

端末とアプリケーション間のインタフェースは、キーではなくバイトを送信します。印刷可能文字は、端末の文字符号化に対応するバイト列として解釈される。ファンクションキーはエスケープシーケンスでエンコードされます。これらのエスケープシーケンスには一般的な規則がありますが、完全に標準化されていません。

より一般的な背景については、以下を参照してください。キーボード入力とテキスト出力はどのように機能しますか?。詳細については、次を参照してください。コンソールログイン画面で上矢印を押すと^[[Aが表示される理由はありますか?そしてキーバインディングテーブル?

すべてのファンクションキーエスケープシーケンスは次から始まります。エスケープ文字そしてほとんどは~。 Vimは、コンパイル時の設定と端末情報に基づいて複数のエスケープシーケンスを認識します。 Vimがエスケープ文字列を認識しない場合、これは無視されますが、Vimはエスケープ文字列の長さを知りません(最後の文字がaであるとは思わず、必ずしも~そうではありません)。~Vimが認識する部分の後にはしばしば混乱が発生し、時にはより混乱します。

シェルまたはVimの挿入モードで最初に+を押すと、端末がCtrl送信する内容を正確に表示できます。V

Vimにエスケープシーケンスに対応するファンクションキーを知らせることができます。:set、例えば

:set <S-F8>=^[[19;2~

(後の部分を^[端末が実際に送信する内容に置き換えてください)。

おすすめ記事