A resposta de Johan Myréen foi próxima, mas não exatamente o problema: a maioria dos emuladores de terminal que você usará possui modos normal e de aplicativo para teclas especiais. As descrições dos terminais são escritas para um modo, que corresponde ao que um aplicativo de tela cheia usa. Outros aplicativos (como um shell interativo ) normalmente não inicializam a tela para usar o modo de aplicativo . Bash é um exemplo disso.
No modo normal , xterm e terminais semelhantes enviam escape[
(CSI) enquanto no modo de aplicativo , seus teclados enviam escapeO
(SS3). Na sintaxe terminfo, esse escape é \E
. Então, infocmp
está mostrando que a descrição usa o modo de aplicativo. O home
recurso é enviado ao terminal, informando como mover o cursor para a posição inicial (superior esquerda) 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 strings de capacidade do terminal para inicializar o teclado. Algumas descrições de terminal colocam o terminal no modo de aplicativo, 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 se refere a uma tecla especial (tecla de função, tecla do cursor, tecla do teclado) para deixar claro que essas são cadeias de caracteres para serem lidas por um aplicativo. Por exemplo, kcub1
( tecla do cursor para trás ) é diferente de cub1
(mova o cursor para trás uma coluna).
O ncurses reconhece a tecla KEY_END
porque o aplicativo que você está usando chamará a keypad
função para inicializar o terminal usando o smkx
(o mnemônico significa "iniciar o modo de transmissão do teclado"). Isso pode ou não pode realmente ativar o modo de aplicativo. A descrição do terminal do console Linux não, a do xterm.
Em princípio, você pode usar tput
para alternar o modo (e obter resultados diferentes 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, as maldições 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. Nas perguntas frequentes do xterm listadas abaixo, há a possibilidade de nomear a tecla "Página inicial" "Inserir" ...
Leitura adicional:
home
ekhome
é que akhome
sequência é a sequência que pressiona a tecla Home, enquantohome
sequência é a sequência que deve ser enviada ao terminal para mover o cursor para a posição inicial. Que eu saiba, terminfo não define umaend
capacidade, apenaskend
.