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

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

無駄なハッキングの終わりに、私はこれに気づきました。 。 。さまざまなメタキーを使用できるように、HHKキーボードを正しくマッピングする必要があります。そしてそう私の地獄旅行は始まった。

ダグ・パルマー、信頼できない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エミュレーションが必要なアプリケーションに役立ちます。

/私の設定に共通のキーボードキー(Qt :: Key_Slash)がありません。 Konsoleグラフィックキーバインディングエディタは、名前でもテキストでもこのキーへの参照を認識しないようです。.keytabファイルに手動で書き込むと、Konsoleはそれを無視し、その行はGUIエディタに表示されません。これにより、キーボードに1つのキーだけを強くプログラムできない非常に面倒な穴が生まれました。

xkb私は友達と一緒に泥沼に落ちたくありません。もちろん、バニラはxterm基本的に提供されています。これは、この場合、低レベルでキーバインディングを操作する必要がないことを意味します。代わりに、Konsole(またはQT)は、Xの上にユニークで雪の結晶のように見えることをするようです。

質問:Konsoleで数字キーパッドキーを/別の制御シーケンスに再バインドできますか?それとも、別のレベル(たとえばterminfoxkbまたはxterm-keystmux)で動作する方が効率的である可能性がありますか?私が狂ったのではないでしょうか?

他の勇敢なコンソール司令官の洞察力を高く評価します。

答え1

Konsoleは次のように依存するため、これを無視します。マッピングできないハードコーディングされたキーのリスト:

// 次のショートカットのいずれかをオーバーライドします。なぜなら
// 端末に必要です。
int keyCode = keyEvent->key() | int keyCode = keyEvent->key() |修飾子;
スイッチ(キーコード){
    //リストはQLineEdit :: event()コードから取得されます。
ケース Qt::Key_Tab:
ケース Qt::Key_Delete:
ケース Qt::Key_Home:
ケース Qt::Key_End:
ケース Qt::Key_Backspace:
ケース Qt::Key_Left:
ケース Qt::Key_Right:
ケース Qt::Key_Slash:
ケース Qt::Key_Period:
ケース Qt::Key_Space:
    keyEvent->accept();
    事実を返します。
}
偽を返します。

関連情報