No terminal na sessão GUI,Oo produz o caractere "/"

No terminal na sessão GUI,Oo produz o caractere "/"

Quando estiver em uma sessão de login da GUI do GNOME3 no Ubuntu 20.10, pressionar ESC, O, oem rápida sucessão em uma janela de terminal produz um caractere '/' em vez de inserir essas teclas. Isso é problemático ao executar o Vim, onde muitas vezes quero sair do modo Inserir e iniciar rapidamente uma nova linha de texto acima da atual.

Outras sequências de teclas começando com ESC Ose comportam de maneira semelhante: ESC O qproduz "1"; ... wum "7", etc. Muitos também funcionam conforme o esperado.

A janela de tempo para inserir essas teclas e acionar o efeito parece ser de cerca de 2 segundos no Vim e consideravelmente mais curta na linha de comando.

Enquanto estiver em um login no console via CTRL ALT F6, esse comportamento não é observado.

Também não ocorre em outros aplicativos como Chrome, Text Editor ou GVim.

Isso ocorre tanto no Guake quanto no Terminal.

Também observei o mesmo comportamento em uma instalação WSL do Ubuntu em uma máquina Windows 10. Não parece haver nenhum elemento de configuração comum entre os dois diretórios iniciais que seja suspeito.

Não verifiquei o comportamento em outros desktops, como LXDE ou KDE.

Percebi que esse problema não ocorre em uma sessão de terminal MacOS.

Este é um recurso do GNOME? Existe alguma maneira de desativá-lo ou modificá-lo?

Responder1

O problema está no mapa de teclado do VTE, deessa mudança em 2014:

cometer 598572b526568591ca91e3e0019412274edd9643
Autor: Egmont Koblinger[e-mail protegido]
Data: domingo, 18 de maio 13:36:01 2014 +0200

keymap: Use sequências codificadas em vez de terminfo

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

O código fonte diz o seguinte:

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},
};

ondeSS3acontece que é a EscapeOsequência. Alguns terminais (e possivelmente algumas versões do gnome-terminal) permitem que as chaves sejam redefinidas, mas em uma verificação rápida do Ubuntu 20, vejo apenas a capacidade de atribuir uma ligação a um dosaçõesque o terminal reconhece:

preferências do terminal gnome

Se essa rota não ajudar, existem outros terminais que rodam no Ubuntu.

Responder2

DR Verifique se suas opções timeoutlene/ou ttimeoutlenvim não são muito altas.

Isso não é específico do Gnome. Eu tive um problema semelhante há algum tempo, só que estava <Esc>Or produzindo "2":

A macro “oend^[Ores^[” resulta na nova linha “end2es”. Como?

O terminal fornece chaves especiais (como F1ou ->) para os programas executados nele como sequências de escape. Para que o vim saiba se deve interpretar essas sequências de escape ou interpretar cada caractere por conta própria, ele usa um cronômetro para determinar se o usuário provavelmente os digitou ou se o terminal forneceu a sequência como uma tradução para uma chave especial (que deve ser muito mais rápido do que alguém poderia digitar). O Vim documenta isso na opção 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 esse comportamento em uma configuração padrão do vim, você deve digitar as 3 teclas em menos de um décimo de segundo.

Como você está vendo que sua janela de tempo no vim é de 2 segundos, acho que suas opções timeoutlene/ou ttimeoutlenvim são muito 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).

Agora, /pode não parecer uma chave especial, mas aparentemente deve ser interpretada de forma diferente daquela ao lado de Shift. Olhando para a página de manual urxvt(7), vejo:

KP_Divide      /       ESC O o

KPprovavelmente significando o teclado numérico.

informação relacionada