DebianシステムでEND
キーを押すと、次のようになります^[[F
。
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[F 27 0033 0x1b
91 0133 0x5b
70 0106 0x46
しかし、なぜこのキーとコードはありませんか?用語情報?
$ infocmp -1 | grep end
kend=\EOF,
それにもかかわらず、呪い。で正しく識別するように管理するにはどうですかKEY_END
?
TERM
はいxterm-256color
kend
しかし、end
justの代わりにandを持つ動機は何ですかend
? (khome
およびと同じhome
)
編集する
Johan Myréenが自分の意見で述べたように、khome
この文字列はHomeキーを押して生成されるシーケンスです。しかし、Debianでホームボタンを押すとhome
。
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[H 27 0033 0x1b
91 0133 0x5b
72 0110 0x48
$ infocmp -1 | grep home
home=\E[H,
khome=\EOH,
答え1
Johan Myréenの答えは似ていますが、問題ではありません。使用するほとんどの端末エミュレータではノーマルそしてアプリケーション特殊キーモードです。端末の説明は次のとおりです。一つフルスクリーンアプリケーションで使用されるモードに対応するモードです。その他のアプリケーション(例:インタラクティブシェル)通常使用する画面を初期化しません。アプリケーションモデル。バッシュがその例です。
存在するノーマルモード、xtermなどの端末伝送escape[
(CSI)アプリケーションモードでは、キーボードが送信されますescapeO
(SS3)。 terminfo構文では、脱出するはい\E
。だからinfocmp
アプリケーションパターンを使って説明を見てみましょう。これhome
送信された機能到着端末、カーソルの移動方法を教えてください。家位置(左上隅)とkhome
(送る~からキーボードを使用する端末)。
フルスクリーンアプリケーション(例:ncursesを使用するアプリケーション)可能キーボードの初期化に使用される端末機能文字列を送信します。一部の端末記述は端末をアプリケーションモードに切り替えますが、一部ではありません。
何かの目的を指します。kend
比較的end
命名規則は次のとおりです。 terminfo では、規則に従って次に始まるすべての名前を指定します。K特殊キー(ファンクションキー、カーソルキー、キーパッドキー)を参照して、そのキーがアプリケーションが読み取る文字列であることを明確にします。例えば、kcub1
(カーソルを後ろに鍵)とは違うcub1
(カーソルを1列後ろに移動します)。
ncurses はキーを次のように識別します。KEY_END
使用しているアプリケーションが呼び出すのでkeypad
smkx
この関数は(「キーボード転送モードの開始」を意味するニーモニック)を使用して端末を初期化します。実際には、アプリケーションモードが開いたり開いたりしない場合があります。 Linuxコンソールの端末記述はありませんが、xtermの説明はあります。
原則として、以下を使用できます。tput
モード切り替え(および他の結果を得るshowkey
):
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[H 27 0033 0x1b
91 0133 0x5b
72 0110 0x48
^C 3 0003 0x03
^D 4 0004 0x04
$ tput smkx
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[OH 27 0033 0x1b
79 0117 0x4f
72 0110 0x48
問題は、cursesは文字列の名前を1つだけ認識することです。 xterm などの一部の端末は、編集キーボードで別の名前のキーを使用して古いハードウェア端末をエミュレートします。以下のxterm FAQでは、「Home」キーの名前を「Insert」として指定できます。
追加資料:
- 端末で矢印キーを使用できるようにUnixを変更する方法は?
- ホーム/エンドキーが機能しない(ncurses FAQ)
- キーボードが機能しないのはなぜですか?(xterm FAQ)
- キーボードとファンクションキー(用語情報マニュアル)
- ユーザー定義関数(terminfoマニュアル、「k」の他の用途の説明)
- キーボードモード(
getch
マニュアルページ)
答え2
ホームキーの問題は、物理端末と後でエミュレートする端末エミュレータには通常モードとアプリケーションモードの2つのモードがあり、エスケープシーケンスは端末がどのモードにあるかによって異なります。 Terminfoはこれをうまく処理できません。通常モード(「カーソルモード」とも呼ばれます)では、EndキーエスケープシーケンスはESC [ F
アプリケーションモードですESC O F
。問題をインターネットで検索すると、全体的な混乱が明らかになります。
編集するterminfoソースから:
VT100シリーズターミナルには、カーソルモードとアプリケーションモードの2つのモードで動作できるカーソル(「矢印」)キーがあります。カーソルモードはリセット状態で正常とみなされます。アプリケーションモードは「設定」です。カーソルモードでは、カーソルキーはANSI規格に準拠した「Esc [{コード}」シーケンスを送信します。アプリケーションモードでは、カーソルキーは「Esc O」シーケンスを送信します。アプリケーションモードは主に移植を支援するためのものです。 VT52アプリケーションは、カーソルキーが通常カーソルモードにあると仮定し、viなどのアプリケーションが常に文字列を送信することを期待しているため、カーソルキーは、端末が文字列を送信した後に送信される内容と一致するように定義されます。文字列が空であるか定義されていない場合、カーソルキーは「カーソルモード」にあると見なされ、カーソルキー定義はこの仮定と一致する必要があります。そうしないと、アプリケーションが失敗する可能性があります。終了する前に、文字列を端末に送信してください。 」