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 中的功能(参见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
错误报告#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;
}