Por que a chave END não tem entrada terminfo?

5

Em um sistema Debian, pressionar END key gera ^[[F :

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[F     27 0033 0x1b
         91 0133 0x5b
         70 0106 0x46

Mas por que este keychord não está em terminfo ?

$ infocmp -1 | grep end
kend=\EOF,

No entanto, ncurses consegue reconhecê-lo corretamente como KEY_END . Como?

TERM é xterm-256color

BTW, qual é a motivação por trás de ter kend e end em vez de apenas end ? (o mesmo para khome e home )

EDITAR

Como dito no comentário de Johan Myréen, khome string é a sequência que a tecla Home produz. Mas no Debian, pressionar a tecla Home produz home . Por quê?

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[H     27 0033 0x1b
         91 0133 0x5b
         72 0110 0x48
$ infocmp -1 | grep home
    home=\E[H,
    khome=\EOH,
    
por Igor Liferenko 01.08.2017 / 07:57

2 respostas

6

A resposta de Johan Myréen estava próxima, mas não exatamente o problema: a maioria dos emuladores de terminal que você usará tem os modos normal e aplicação para teclas especiais. As descrições de terminal são gravadas para o modo um , que corresponde ao que um aplicativo de tela inteira usa. Outros aplicativos (como um shell interativo) normalmente não inicializam a tela para usar o modo aplicativo . Bash é um exemplo disso.

No modo normal , o xterm e terminais similares enviam escape [ (CSI) enquanto estiver no modo application , seus keypads enviam escape O (SS3) Na sintaxe terminfo, escape é \E . Então, infocmp está mostrando que a descrição usa o modo de aplicativo. O recurso home é enviado para o terminal, informando como mover o cursor para a posição home (superior esquerdo) e é não é o mesmo que khome (enviado do terminal usando o teclado).

Aplicativos de tela cheia (como aqueles que usam ncurses) podem enviar as seqüências de capacidade de terminal para inicializar o teclado. Algumas descrições de terminais colocam o terminal no modo de aplicação, outras não.

O uso de kend versus end é uma convenção de nomenclatura: em terminfo por convenção, qualquer nome que comece com k refere-se a uma tecla especial (tecla de função, tecla do cursor, tecla do teclado) para deixar claro que são strings para serem lidas por um aplicativo. Por exemplo, kcub1 (tecla cursor para trás ) é diferente de cub1 (mova o cursor de volta uma coluna).

ncurses reconhece a chave como KEY_END porque o aplicativo que você está usando chamará o keypad função para inicializar o terminal usando o smkx (o mnemônico significa" iniciar o modo de transmissão via teclado "). Isso pode / não pode realmente ativar o modo de aplicativo. A descrição do terminal do console Linux não faz o xterm.

Em princípio, você pode usar tput para alternar o modo (e obter diferentes resultados de showkey ):

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[H     27 0033 0x1b
         91 0133 0x5b
         72 0110 0x48
^C        3 0003 0x03
^D        4 0004 0x04
$ tput smkx
$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[OH     27 0033 0x1b
         79 0117 0x4f
         72 0110 0x48

Como complicação, os curses reconhecerão apenas um nome para uma string. Alguns terminais (como o xterm) emulam terminais de hardware mais antigos usando nomes diferentes para as teclas no teclado de edição. No FAQ do xterm listado abaixo, existe a possibilidade de nomear a chave "Home" "Insert" ...

Leitura adicional:

por 01.08.2017 / 10:25
5

O problema com a chave Home é que os terminais físicos e posteriormente os emuladores de terminal que os emulam têm dois modos: normal e modo de aplicativo, e as seqüências de escape são diferentes dependendo do modo em que o terminal está. com isso. No modo normal (também conhecido como "Modo Cursor"), a seqüência de escape da tecla Fim é ESC [ F , no modo de aplicativo ESC O F . Procurar por esse problema revela toda a confusão.

Editar da fonte terminfo:

"Os terminais da série VT100 possuem teclas de cursor (" setas ") que podem operar em dois modos diferentes: Modo Cursor e Modo de Aplicação. Modo Cursor é o estado de reinicialização e é considerado o estado normal. Aplicação Mode é o estado "set". No Modo Cursor, as teclas do cursor transmitem "Esc [{code}" seqüências, em conformidade com os padrões ANSI. Na aplicação Modo, as teclas do cursor transmitem seqüências "Esc O". Modo de Aplicação foi fornecido principalmente como um auxílio para a portabilidade de aplicações VT52. Isto é assumiu que as teclas do cursor estão normalmente no Modo Cursor e espera-se que Aplicativos como o vi sempre transmitirão a string. Assim sendo, as definições para as teclas do cursor são feitas para coincidir com o que o terminal transmite depois que a string é transmitida. Se a string é uma string nula ou não está definida, então as teclas do cursor são consideradas "Modo Cursor", e as definições das teclas do cursor devem corresponder a essa suposição, senão o aplicativo pode falhar. Espera-se também que as aplicações sempre transmitir a string para o terminal antes de sair. "

    
por 01.08.2017 / 10:07