web-dev-qa-db-ja.com

KonsoleキータブでのVT220エスケープシーケンスのエミュレート

少し無駄なハッキングをした後、私はそれに気づきました。 。 。さまざまなメタキーを使用できるように、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がオンの場合、konsolextermと同じ制御シーケンスを発行します。これらのシーケンスは、テンキーからキーストロークを一意に識別し、任意の関数をそれらにバインドできるため、VT220エミュレーションを期待するアプリケーションに役立ちます。

私の構成には、1つの一般的なキーパッドキーがありません:/(Qt :: Key_Slash)。 Konsoleグラフィカルキーバインディングエディターは、名前またはリテラルとして表現された、そのキーへの参照を認識していないようです。手動で.keytabファイルに書き込まれた場合、Konsoleはそれを無視し、その行はGUIエディターに表示されません。これにより、キーパッドに非常に厄介な穴が残り、1つのキーだけが頑固にプログラムできなくなります。

xkbや友達と雑草に巻き込まれたくない。しかしもちろん、Vanilla xtermはこのすべてをすぐに実行できます。これは、この場合、このような低レベルでキーバインディングをいじる必要がないことを示しています。代わりに、Konsole(またはQT)がXの上でユニークで雪だるま式の何かをしているようです。

質問:Konsoleで、テンキーの/キーを別の制御シーケンスに再バインドすることは可能ですか?あるいは、これは、異なるレベルで動作するもの(terminfoxkb、またはtmuxとはxterm-keysなど)がより効果的であるポイントですか?私は、おそらく、怒ったことがありますか?

他の勇敢なコンソール司令官からの洞察をいただければ幸いです。

5
nethershaw

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; 
3
Thomas Dickey