La respuesta de Johan Myréen fue cercana, pero no exactamente el problema: la mayoría de los emuladores de terminal que usará tienen modos normales y de aplicación para teclas especiales. Las descripciones de terminal se escriben para un modo, que corresponde a lo que usa una aplicación de pantalla completa. Otras aplicaciones (como un shell interactivo ) generalmente no inicializan la pantalla para usar el modo de aplicación . Bash es un ejemplo de eso.
En modo normal , xterm y terminales similares envían escape[
(CSI) mientras que en modo de aplicación , envían sus teclados escapeO
(SS3). En la sintaxis terminfo, ese escape es \E
. Entonces te infocmp
está mostrando que la descripción usa el modo de aplicación. La home
capacidad se envía al terminal, diciéndole cómo mover el cursor a la posición de inicio (arriba a la izquierda), y no es lo mismo que khome
(enviado desde el terminal usando el teclado).
Las aplicaciones de pantalla completa (como las que usan ncurses) pueden enviar cadenas de capacidad de terminal para inicializar el teclado. Algunas descripciones de terminal ponen el terminal en modo de aplicación, otras no.
El uso de kend
versus end
es una convención de nomenclatura: en terminfo por convención, cualquier nombre que comience con k se refiere a una tecla especial (tecla de función, tecla de cursor, tecla del teclado) para dejar en claro que estas son cadenas que debe leer una aplicación. Por ejemplo, kcub1
( tecla de cursor hacia atrás ) es diferente de cub1
(mover el cursor una columna hacia atrás).
ncurses reconoce la clave KEY_END
porque la aplicación que está utilizando llamará a la keypad
función para inicializar el terminal usando smkx
(el mnemotécnico significa "iniciar el modo de transmisión de teclado"). Eso puede o no activar el modo de aplicación. La descripción del terminal de la consola Linux no lo hace, la de xterm sí.
En principio, podría usar tput
para cambiar el modo (y obtener 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 complicación, las maldiciones reconocerán solo un nombre para una cadena. Algunos terminales (como xterm) emulan terminales de hardware más antiguos utilizando diferentes nombres para las teclas en el teclado de edición. En las preguntas frecuentes de xterm enumeradas a continuación, existe la posibilidad de nombrar esa tecla "Inicio" "Insertar" ...
Otras lecturas:
home
ykhome
es que lakhome
cadena es la secuencia que produce la tecla Inicio, mientras que lahome
cadena es la secuencia que debe enviarse al terminal para mover el cursor a la posición inicial. Que yo sepa, terminfo no define unaend
capacidad, solokend
.