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:
- Como corrijo o unix para poder usar as teclas de seta em um terminal?
- As minhas teclas de início / fim não funcionam (FAQ do ncurses)
- Por que o meu teclado não funciona? (xterm FAQ)
- Teclado numérico e teclas de função (manual terminfo)
- Recursos definidos pelo usuário (manual do terminfo, comentando sobre outro uso de "k")
-
Modo de teclado (
getch
página de manual)