Selon la configuration du terminal, la saisie Alt+Keyrevient à taper les touches Escet Keydans l'ordre, elle envoie donc le caractère ESC (alias \e
ou ^[
ou \033
) suivi du caractère ou de la séquence de caractères envoyés en appuyant dessus Key.
En appuyant sur Up, la plupart des émulateurs de terminal envoient les trois caractères \033[A
ou \033OA
selon qu'ils sont en mode clavier d'application ou non.
La première correspond à la séquence d'échappement qui, lorsqu'elle est envoyée au terminal, déplace le curseur vers le haut. Si tu fais:
printf '\nfoo\033[Abar\n\n'
Vous verrez bar
écrit après foo
une rangée. Si tu fais:
stty -echoctl; tput rmkx; read foo
Vous verrez que les touches fléchées déplacent le curseur.
Lorsqu'une application aime zsh
ou vi
lit cette séquence de caractères à partir du terminal, elle l'interprète comme l'action "Up", car elle sait depuis la base de données terminfo ( kcuu1
capacité) que c'est la séquence d'échappement envoyée lors de la pression Up.
Maintenant, pour Alt-Up, certains terminaux comme rxvt
et ses dérivés comme eterm
envoi \033
suivi par la séquence d'échappement pour Up(qui est \033\033[A
ou \033\033OA
), tandis que d'autres comme xterm
ou gnome-terminal
ont des séquences d'échappement séparées pour ces types de clés lorsqu'il est utilisé avec les touches de combinaison comme Alt, Shift, Ctrl.
Ceux - ci généralement envoyer \033[1;3A
sur Alt-Up.
Lorsqu'elle est envoyée au terminal, cette séquence déplace également le curseur vers le haut (le deuxième paramètre (3) est ignoré). Il n'y a pas de touche de clavier correspondante , il s'agit donc de la même séquence envoyée Alt-Upen mode clavier de l' application ou hors de celui-ci .
Maintenant, que ce soit \033\033[A
ou \033[1;3A
, de nombreuses applications ne savent pas à quoi servent ces séquences. La base de données terminfo ne les aidera pas, car il n'y a pas une telle capacité qui définit quels caractères ces combinaisons de touches envoient.
Ils feront de leur mieux pour interpréter cette séquence. bash
par exemple, interprètera \033[1;3
comme une séquence d'échappement, ne sait rien à ce sujet, tout comme rien, suivi de A
. zsh
, arrêtera la lecture dès qu'il découvrira qu'il n'y a pas de séquence de caractères correspondante connue. Il n'y a pas de séquence d'échappement qu'il sait qui commence par \033[1
donc il sautera cela, et lira le reste: ;3A
et l'insérera dans l'éditeur de ligne.
De nombreuses applications comme vi
, zsh
ou readline
basées comme gdb
ou bash
(bien que méfiez-vous bash
utilise une version modifiée de readline
) vous permettent d'ajouter des liaisons pour n'importe quelle séquence de caractères.
Par exemple, dans zsh
, vous pouvez vouloir lier Alt-Up, Alt-Downcomme:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
Celles-ci consistent à rechercher l'historique en arrière et en avant pour les lignes de commande qui commencent comme l'actuelle jusqu'à la position actuelle du curseur, ce qui est assez pratique pour rappeler les commandes précédentes.