В терминале в сеансе графического интерфейса пользователя,Oo производит символ "/"

В терминале в сеансе графического интерфейса пользователя,Oo производит символ "/"

При входе в сеанс GNOME3 GUI в Ubuntu 20.10 быстрое нажатие ESC, O, oв окне терминала приводит к появлению символа '/' вместо ввода этих нажатий клавиш. Это проблематично при запуске Vim, где я часто хочу выйти из режима вставки и быстро начать новую строку текста над текущей.

Другие последовательности клавиш, начинающиеся с , ESC Oведут себя аналогичным образом: ESC O qвыдает «1»; ... w«7» и т. д. Многие также работают так, как и ожидалось.

Временной интервал для ввода этих клавиш и срабатывания эффекта составляет около 2 секунд в Vim и значительно короче в командной строке.

При входе в консоль через CTRL ALT F6такое поведение не наблюдается.

Этого также не происходит в других приложениях, таких как Chrome, Text Editor или GVim.

Это происходит как под Guake, так и под Terminal.

Я также наблюдал такое же поведение в установке WSL Ubuntu на машине с Windows 10. Похоже, что нет никаких общих элементов конфигурации между двумя домашними каталогами, которые могли бы вызвать подозрения.

Я не проверял поведение под другими рабочими столами, такими как LXDE или KDE.

Я заметил, что эта проблема не возникает в терминальном сеансе MacOS.

Это функция GNOME? Есть ли способ отключить или изменить ее?

решение1

Проблема в раскладке клавиатуры VTE, изэто изменение в 2014 году:

коммит 598572b526568591ca91e3e0019412274edd9643
Автор: Эгмонт Коблингер[email protected]
Дата: Вс Май 18 13:36:01 2014 +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},
};

гдеСС3случайно оказывается, что это EscapeOпоследовательность. Некоторые терминалы (и, возможно, некоторые версии gnome-terminal) позволяют переопределять клавиши, но при быстрой проверке Ubuntu 20 я вижу только возможность назначить привязку к одной издействиячто терминал распознает:

Настройки gnome-терминала

Если этот способ не помогает, есть другие терминалы, работающие на Ubuntu.

решение2

TL;DR Проверьте, не слишком ли высоки ваши параметры timeoutlenи/или vim.ttimeoutlen

Это не относится только к Gnome. У меня была похожая проблема некоторое время назад, только она была <Esc>Или производила "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 по умолчанию, вам нужно нажимать три клавиши менее чем за десятую долю секунды.

Поскольку вы видите, что ваше временное окно в 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вероятно, имеется в виду цифровая клавиатура.

Связанный контент