Cuando se está en una sesión de inicio de sesión de la GUI de GNOME3 en Ubuntu 20.10, presionar ESC
, O
, o
en rápida sucesión en una ventana de terminal produce un carácter '/' en lugar de ingresar esas pulsaciones de teclas. Esto es problemático cuando ejecuto Vim, donde a menudo quiero salir del modo Insertar y comenzar rápidamente una nueva línea de texto encima de la actual.
Otras secuencias de teclas que comienzan con ESC
O
se comportan de manera similar: ESC
O
q
produce "1"; ... w
un "7", etc. Muchos también funcionan como se esperaba.
La ventana de tiempo para ingresar estas claves y activar el efecto parece ser de aproximadamente 2 segundos en Vim y considerablemente más corta en la línea de comando.
Al iniciar sesión en la consola a través de CTRL
ALT
F6
, no se observa este comportamiento.
Tampoco ocurre en otras aplicaciones como Chrome, Text Editor o GVim.
Ocurre tanto en Guake como en Terminal.
También observé el mismo comportamiento en una instalación WSL de Ubuntu en una máquina con Windows 10. No parece haber ningún elemento de configuración común entre los dos directorios de inicio que sea sospechoso.
No he comprobado el comportamiento en otros escritorios como LXDE o KDE.
He notado que este problema no ocurre en una sesión de terminal MacOS.
¿Es esta una característica de GNOME? ¿Hay alguna forma de desactivarlo o modificarlo?
Respuesta1
El problema está en el mapa de teclas de VTE, desdeeste cambio en 2014:
confirmar 598572b526568591ca91e3e0019412274edd9643
Autor: Egmont Koblinger[correo electrónico protegido]
Fecha: domingo 18 de mayo 13:36:01 2014 +0200Mapa de teclas: use secuencias codificadas en lugar de terminfo
El código fuente dice esto:
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},
};
dóndeSS3resulta ser la EscapeO
secuencia. Algunas terminales (y posiblemente algunas versiones de gnome-terminal) permiten redefinir claves, pero en una revisión rápida de Ubuntu 20, solo veo la capacidad de asignar un enlace a una de lascomportamientoque el terminal reconoce:
Si esa ruta no ayuda, hay otras terminales que se ejecutan en Ubuntu.
Respuesta2
TL;DR Verifique que sus opciones timeoutlen
y/o ttimeoutlen
vim no sean demasiado altas.
Esto no es específico de Gnome. Tuve un problema similar hace un tiempo, solo que <Esc>O producía "2":
La macro “oend^[Ores^[” da como resultado una nueva línea “end2es”. ¿Cómo?
El terminal proporciona claves especiales (como F1o ->) para los programas que se ejecutan en él como secuencias de escape. Para que vim sepa si interpretar estas secuencias de escape o interpretar cada carácter por sí solo, utiliza un temporizador para determinar si el usuario probablemente las escribió o si el terminal proporcionó la secuencia como una traducción a una clave especial (lo cual debería ser mucho más más rápido de lo que uno podría escribir). Vim documenta esto en la opción 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.
Para ver este comportamiento en una configuración predeterminada de vim, debe escribir las 3 teclas en menos de una décima de segundo.
Dado que ve que su ventana de tiempo en vim es de 2 segundos, supongo que sus opciones timeoutlen
y/o ttimeoutlen
vim son demasiado altas.
*'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).
Ahora bien, /
puede que no parezca una clave especial, pero aparentemente debe interpretarse de manera diferente a la que aparece al lado Shift. Mirando la página de manual urxvt(7), veo:
KP_Divide / ESC O o
KP
Probablemente se refiere al teclado numérico.