При входе в сеанс 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 +0200keymap: использовать жестко заданные последовательности вместо terminfo
В исходном коде говорится следующее:
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 я вижу только возможность назначить привязку к одной издействиячто терминал распознает:
Если этот способ не помогает, есть другие терминалы, работающие на 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
и/или ttimeoutlen
vim слишком велики?
*'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
вероятно, имеется в виду цифровая клавиатура.