La réponse de Johan Myréen était proche, mais pas exactement le problème: la plupart des émulateurs de terminaux que vous utiliserez ont des modes normal et d' application pour les touches spéciales. Les descriptions des terminaux sont écrites pour un mode, ce qui correspond à ce qu'une application plein écran utilise. D'autres applications (comme un shell interactif ) n'initialisent généralement pas l'écran pour utiliser le mode d' application . Bash en est un exemple.
En mode normal , les terminaux xterm et similaires envoient escape[
(CSI) tandis qu'en mode application , leurs claviers envoient escapeO
(SS3). Dans la syntaxe terminfo, cet échappement est \E
. Donc , infocmp
vous montre que la description utilise le mode d'application. La home
capacité est envoyée au terminal, lui indiquant comment déplacer le curseur vers la position d' origine (en haut à gauche), et n'est pas la même que khome
(envoyée depuis le terminal à l'aide du clavier).
Les applications plein écran (telles que celles utilisant ncurses) peuvent envoyer les chaînes de capacité de terminal pour initialiser le clavier. Certaines descriptions de terminaux mettent le terminal en mode application, d'autres non.
L'utilisation de kend
versus end
est une convention de dénomination: dans terminfo par convention, tout nom commençant par k fait référence à une touche spéciale (touche de fonction, touche de curseur, touche de clavier) pour indiquer clairement qu'il s'agit de chaînes à lire par une application. Par exemple, kcub1
( touche curseur vers l'arrière ) est différent de cub1
(déplacer le curseur d'une colonne vers l'arrière).
ncurses reconnaît la clé KEY_END
car l'application que vous utilisez appellera la keypad
fonction pour initialiser le terminal en utilisant le smkx
(le mnémonique signifie "démarrer le mode de transmission clavier"). Cela peut / peut ne pas réellement activer le mode d'application. La description du terminal de la console Linux ne le fait pas, celle de xterm le fait.
En principe, vous pouvez utiliser tput
pour changer de mode (et obtenir des résultats différents 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
Comme complication, les curses ne reconnaîtront qu'un seul nom pour une chaîne. Certains terminaux (tels que xterm) émulent des terminaux matériels plus anciens en utilisant des noms différents pour les touches du clavier d'édition. Dans la FAQ xterm listée ci-dessous, il est possible de nommer la touche "Accueil" "Insérer" ...
Lectures complémentaires:
home
etkhome
est que lakhome
chaîne est la séquence qui produit la touche Home, tandis que lahome
chaîne est la séquence qui doit être envoyée au terminal pour déplacer le curseur à la position d'origine. À ma connaissance, terminfo ne définit pas uneend
capacité, justekend
.