xfce4-terminalでAlt +矢印キーバインディングが機能しない

xfce4-terminalでAlt +矢印キーバインディングが機能しない

Esc私のシェルでは、-と-を入力して長いコマンドラインを移動することがEscできます。キーバインディングは次のようになります。EscAlt

$ bindkey | grep -a -- -word
(...)
"^[^[[D"       -> backward-word
"^[^[[C"       -> forward-word
(...)

Altちなみに+キーの組み合わせを押すと特殊コードが認識されず、「3D」という2文字が印刷されます。

$echo longcommand longcommand longcommand longcommand
(pressing at the end of the line at this point)
$echo longcommand longcommand longcommand longcommand3D

Alt+は「3C」を提供します。

xevキーの有無にかかわらず、同じKeyPressイベントを表示しますAlt(ここでは左のAltが使用されます)。

プレフィックスバリアントはすでに機能していますが、どのようにAlt機能させますかEsc

これはキーの組み合わせが機能しているxfce4-terminalときに発生します。xterm

答え1

xfce4-terminal は、vte ライブラリを使用してすべての関連機能を実装します。この場合、xtermの関数(参照altIsNotMetaそしてaltSendsEscape、またmetaSendsEscape)。 vteはこれを実装しません。その場合(xtermを正しく模倣するために)、メタモードをオフまたはオンにするために使用されるエスケープシーケンスも認識する必要があります。それもしません。

VTEは文書化されていないため、その内容を読む必要があります。ソースコードその特性を理解することです。

xfce4-terminal 0.8.9.2およびvte 0.62.1を使用してソースコードを読み取ったことを確認すると、後者はこのシーケンスを部分的に実装します(プライベートモード 1036)、存在するvte.cc:

 Ps = 1 0 3 6  ⇒  Send ESC   when Meta modifies a key, xterm.
      This enables the metaSendsEscape resource.

ただし、特殊キー処理は省略されました(あなたの質問はこれに関連しています)。このブロックの前のコメントは次のとおりです。

/* If we got normal characters, send them to the child. */

特殊キーは派生修飾子を使用します。widget.cc:

    /* Read the modifiers. See bug #663779 for more information on why we do this. */
    auto mods = GdkModifierType{};
    if (!gdk_event_get_state(event, &mods))
            return 0;

    #if 1
    /* HACK! Treat META as ALT; see bug #663779. */
    if (mods & GDK_META_MASK)
            mods = GdkModifierType(mods | GDK_MOD1_MASK);
    #endif

エラーレポート#663779vte開発者がこの領域でxtermの動作の一部をハードコーディングした方法を詳しく説明します。彼らが言う部分は特別なキーです(例:Alt+矢印、AltまたはMetaと組み合わせる)。このブロックはvte.cc:

        _vte_keymap_map(keyval, m_modifiers,
                                    m_modes_private.DEC_APPLICATION_CURSOR_KEYS(),
                                    m_modes_private.DEC_APPLICATION_KEYPAD(),
                &normal,
                &normal_length);
        /* If we found something this way, suppress
         * escape-on-alt. */
                    if (normal != NULL && normal_length > 0) {
            suppress_alt_esc = TRUE;
        }

関連情報