この質問は以下からインスピレーションを得ました。vi.SEに関するもう一つの質問。 OPには、実行時に+ShiftキーF8の組み合わせに問題があります。端末エミュレータがそれを正しく渡していないため(少なくとも私がデバッグしたものでは)キーの組み合わせは機能しません。vim
urxvt
vim
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。私がするなら:vim
urxvt
:map <f8> :echo "yay"<CR>
を押すと「ああ」が正しくエコーされますF8。
ベストアンサー1
端末とアプリケーション間のインタフェースは、キーではなくバイトを送信します。印刷可能文字は、端末の文字符号化に対応するバイト列として解釈される。ファンクションキーはエスケープシーケンスでエンコードされます。これらのエスケープシーケンスには一般的な規則がありますが、完全に標準化されていません。
より一般的な背景については、以下を参照してください。キーボード入力とテキスト出力はどのように機能しますか?。詳細については、次を参照してください。コンソールログイン画面で上矢印を押すと^[[Aが表示される理由はありますか?そしてキーバインディングテーブル?
すべてのファンクションキーエスケープシーケンスは次から始まります。エスケープ文字そしてほとんどは~
。 Vimは、コンパイル時の設定と端末情報に基づいて複数のエスケープシーケンスを認識します。 Vimがエスケープ文字列を認識しない場合、これは無視されますが、Vimはエスケープ文字列の長さを知りません(最後の文字がaであるとは思わず、必ずしも~
そうではありません)。~
Vimが認識する部分の後にはしばしば混乱が発生し、時にはより混乱します。
シェルまたはVimの挿入モードで最初に+を押すと、端末がCtrl送信する内容を正確に表示できます。V
Vimにエスケープシーケンスに対応するファンクションキーを知らせることができます。:set
、例えば
:set <S-F8>=^[[19;2~
(後の部分を^[
端末が実際に送信する内容に置き換えてください)。