少し無駄なハッキングをした後、私はそれに気づきました。 。 。さまざまなメタキーを使用できるように、HHKキーボードを適切にマッピングする必要があります。このようにして、私の地獄への降下が始まりました。
Doug Palmer、XKB構成の信頼できないガイド
アプリケーションのキーパッドモードが有効になっている場合(たとえば、echoti smkx
)に、テンキーからVT220スタイルのエスケープシーケンスを出力するようにKonsoleを構成しようとしています。特に、以下の制御シーケンスは、説明された条件下での出力である必要があります。
http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-VT220-Style-Function-Keys
TERM
環境変数を変更することは、端末の機能についてシェルに嘘をつくことと同じであり、通常は避ける必要があることに注意する必要があります。 TERM=xterm-vt220
を設定するだけでは不十分であり、予期しない動作が発生します。
私には単純ですが部分的な解決策があります。 Konsoleでは、.keytab
ファイルの形式で端末キーバインディングを構成できます。次の追加が有効で、.local/share/konsole/VT220.keytab
に保存されます。
keyboard "VT220"
key 0+KeyPad+AppCursorKeys : "\EOp"
key 1+KeyPad+AppCursorKeys : "\EOq"
key 2+KeyPad+AppCursorKeys : "\EOr"
key 3+KeyPad+AppCursorKeys : "\EOs"
key 4+KeyPad+AppCursorKeys : "\EOt"
key 5+KeyPad+AppCursorKeys : "\EOu"
key 6+KeyPad+AppCursorKeys : "\EOv"
key 7+KeyPad+AppCursorKeys : "\EOw"
key 8+KeyPad+AppCursorKeys : "\EOx"
key 9+KeyPad+AppCursorKeys : "\EOy"
key ++KeyPad+AppCursorKeys : "\EOk"
key *+KeyPad+AppCursorKeys : "\EOj"
key .+KeyPad+AppCursorKeys : "\EOn"
key -+KeyPad+AppCursorKeys : "\EOm"
key Enter+KeyPad : "\EOM"
これらのキーバインディングが適用されると(存在する可能性のある他のバインディングとともに)、アプリケーションキーパッドモードが有効でNumLockがオンの場合、konsole
はxterm
と同じ制御シーケンスを発行します。これらのシーケンスは、テンキーからキーストロークを一意に識別し、任意の関数をそれらにバインドできるため、VT220エミュレーションを期待するアプリケーションに役立ちます。
私の構成には、1つの一般的なキーパッドキーがありません:/
(Qt :: Key_Slash)。 Konsoleグラフィカルキーバインディングエディターは、名前またはリテラルとして表現された、そのキーへの参照を認識していないようです。手動で.keytab
ファイルに書き込まれた場合、Konsoleはそれを無視し、その行はGUIエディターに表示されません。これにより、キーパッドに非常に厄介な穴が残り、1つのキーだけが頑固にプログラムできなくなります。
xkb
や友達と雑草に巻き込まれたくない。しかしもちろん、Vanilla xterm
はこのすべてをすぐに実行できます。これは、この場合、このような低レベルでキーバインディングをいじる必要がないことを示しています。代わりに、Konsole(またはQT)がXの上でユニークで雪だるま式の何かをしているようです。
質問:Konsoleで、テンキーの/
キーを別の制御シーケンスに再バインドすることは可能ですか?あるいは、これは、異なるレベルで動作するもの(terminfo
、xkb
、またはtmux
とはxterm-keys
など)がより効果的であるポイントですか?私は、おそらく、怒ったことがありますか?
他の勇敢なコンソール司令官からの洞察をいただければ幸いです。
Konsoleは、 マップできないキーのハードコードされたリスト に依存しているため、これを無視します。
//次のショートカットのいずれかをオーバーライドします。 //ターミナルで必要になるためです int keyCode = keyEvent-> key()|修飾子; switch(keyCode){ //リストはQLineEdit :: event()コードから取得されます case Qt :: Key_Tab: case Qt: :Key_Delete: case Qt :: Key_Home: case Qt :: Key_End: case Qt :: Key_Backspace: case Qt :: Key_Left: case Qt :: Key_Right: case Qt :: Key_Slash: case Qt :: Key_Period: case Qt :: Key_Space: keyEvent-> accept (); return true; } return false;