在 GUI 会话下的终端中,Oo 产生“/”字符

在 GUI 会话下的终端中,Oo 产生“/”字符

在 Ubuntu 20.10 下的 GNOME3 GUI 登录会话中,在终端窗口中快速连续按ESCOo会生成“/”字符,而不是输入这些击键。当运行 Vim 时,这是有问题的,我经常想打破插入模式并在当前文本上方快速开始一个新文本行。

以 开头的其他键序列的ESC O行为类似:ESC O q产生“1”; ... w“7”等。许多也按预期工作。

在 Vim 中输入这些键并触发效果的时间窗口似乎约为 2 秒,而在命令行中则要短得多。

在通过控制台登录时CTRL ALT F6,不会观察到此行为。

它也不会发生在 Chrome、文本编辑器或 GVim 等其他应用程序中。

它确实出现在 Guake 和 Terminal 下。

我还在 Windows 10 计算机上的 Ubuntu WSL 安装中观察到相同的行为。两个主目录之间似乎没有任何可疑的公共配置元素。

我还没有检查其他桌面(例如 LXDE 或 KDE)下的行为。

我注意到这个问题不会出现在 MacOS 终端会话中。

这是 GNOME 的一个特性吗?有什么方法可以禁用它或修改它吗?

答案1

问题出在 VTE 的键盘映射中,来自2014年的这一变化:

提交 598572b526568591ca91e3e0019412274edd9643
作者:Egmont Koblinger[电子邮件受保护]
日期:2014 年 5 月 18 日星期日 13:36:01 +0200

keymap:使用硬编码序列而不是 terminfo

https://bugzilla.gnome.org/show_bug.cgi?id=728900#c5

源代码是这样说的:

static const struct _vte_keymap_entry _vte_keymap_GDK_KP_Divide[] = {
        {cursor_all, keypad_default, 0, "/", 1},
        {cursor_all, keypad_app, VTE_NUMLOCK_MASK, "/", 1},
        {cursor_all, keypad_app, 0, _VTE_CAP_SS3 "o", -1},
        {cursor_all, keypad_all, 0, X_NULL, 0},
};

在哪里SS3恰好是EscapeO顺序。某些终端(可能还有某些版本的 gnome-terminal)允许重新定义键,但在快速检查 Ubuntu 20 时,我只看到能够将绑定分配给其中一个行动终端识别:

gnome 终端首选项

如果该方法没有帮助,还有其他在 Ubuntu 上运行的终端。

答案2

TL;DR 检查您的timeoutlen和/或ttimeoutlenvim 选项是否太高。

这不是 Gnome 特有的。不久前我遇到了类似的问题,只是它是 <Esc>Or 生成“2”:

宏“oend^[Ores^[”产生新行“end2es”。如何?

终端为在其下运行的程序提供特殊键(如F1或)作为转义序列。->为了让 vim 知道是解释这些转义序列还是单独解释每个字符,它使用一个计时器来确定用户是否可能键入这些字符,或者终端是否提供该序列作为对特殊键的翻译(这应该比比打字还快)。 Vim 在选项上记录了这一点esckeys

'esckeys' 'ek'      boolean (Vim default: on, Vi default: off)
            global
    Function keys that start with an <Esc> are recognized in Insert
    mode.  When this option is off, the cursor and function keys cannot be
    used in Insert mode if they start with an <Esc>.  The advantage of
    this is that the single <Esc> is recognized immediately, instead of
    after one second.  Instead of resetting this option, you might want to
    try changing the values for 'timeoutlen' and 'ttimeoutlen'.  Note that
    when 'esckeys' is off, you can still map anything, but the cursor keys
    won't work by default.
    NOTE: This option is set to the Vi default value when 'compatible' is
    set and to the Vim default value when 'compatible' is reset.
    NOTE: when this option is off then the |modifyOtherKeys| functionality
    is disabled while in Insert mode to avoid ending Insert mode with any
    key that has a modifier.

要在 vim 默认配置下看到此行为,您必须在十分之一秒内键入 3 个键。

既然你看到 vim 中的时间窗口是 2 秒,我猜你timeoutlen和/或ttimeoutlenvim 选项太高了?

                        *'timeoutlen'* *'tm'*
'timeoutlen' 'tm'   number  (default 1000)
            global

                        *'ttimeoutlen'* *'ttm'*
'ttimeoutlen' 'ttm' number  (default -1, set to 100 in |defaults.vim|)
            global
    The time in milliseconds that is waited for a key code or mapped key
    sequence to complete.  Also used for CTRL-\ CTRL-N and CTRL-\ CTRL-G
    when part of a command has been typed.
    Normally only 'timeoutlen' is used and 'ttimeoutlen' is -1.  When a
    different timeout value for key codes is desired set 'ttimeoutlen' to
    a non-negative number.

        ttimeoutlen mapping delay      key code delay   ~
           < 0      'timeoutlen'       'timeoutlen'
          >= 0      'timeoutlen'       'ttimeoutlen'

    The timeout only happens when the 'timeout' and 'ttimeout' options
    tell so.  A useful setting would be >
        :set timeout timeoutlen=3000 ttimeoutlen=100
    (time out on mapping after three seconds, time out on key codes after
    a tenth of a second).

现在,/可能看起来不是一个特殊的键,但它的解释显然与 旁边的键不同Shift。查看手册页 urxvt(7),我看到:

KP_Divide      /       ESC O o

KP可能指的是数字键盘。

相关内容