Alt+箭头键绑定在 xfce4-terminal 中不起作用

Alt+箭头键绑定在 xfce4-terminal 中不起作用

Esc在我的 shell 中,我可以通过键入-Esc-跳转到上一个或下一个单词分隔符,并用作Esc替换键的前缀,从而在长命令行中移动Alt。键绑定可能如下:

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

但是,当我按Alt+组合键时,无法识别特殊代码并打印两个字母“3D”:

$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 中的功能(参见altIsNotMetaaltSendsEscape, 也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

错误报告#663779详细介绍了 vte 开发人员在该领域对 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;
        }

相关内容