Quel est l'historique des touches Maj + Flèche dans le terminal?

21

Je me demande pourquoi Shift+ Arrow Keyrésultat dans l' un des A, B, Cou Dlettres.

Pourquoi pas d'autres lettres? Pourquoi une lettre?

Dan
la source
Intriguant: D Mon pari? A
propos du
2
Juste une observation: in tty Shift + Arrow Keysne fait rien.
Radu Rădeanu
@Rinzwind: :)))
Radu Rădeanu
1
J'ai posé cette question sur Unix / Linux Stack Exchange. Il y a quelques réponses utiles. Vous voulez peut-être les regarder. unix.stackexchange.com/questions/73669/…
yfklon

Réponses:

27

Les émulateurs de terminaux tels que gnome-terminal("Terminal" dans Ubuntu) mais aussi xtermet urxvtsont nommés "émulateurs" car ils reproduisent le comportement de terminaux plus anciens qui étaient le seul affichage d'un ordinateur. Ces terminaux communiquaient avec l'ordinateur avec un protocole textuel et étaient initialement conçus pour recevoir uniquement du texte. Rapidement, plus de contrôle était nécessaire: comment effacer une ligne? Utilisez des couleurs? Ou changer la position du curseur?

Terminal VT-100 Source: L'art de l'utilisabilité d'Unix - Interfaces de ligne de commande

Les séquences d'échappement ont été conçues pour que chaque terminal fasse de telles choses. Ils sont nommés échapper parce qu'ils commencent par le code d'échappement ASCII: 33. Il n'y a aucun moyen d'imprimer un tel personnage directement, ce qui en fait un bon choix pour de telles séquences. Lorsque nous voulons toujours afficher ce caractère, ^[[est utilisé, et c'est ce que je vais utiliser dans mes explications.

Lorsque le terminal a reçu ^[[A, cela ne signifiait pas "imprimer ^ [[A", mais "l'utilisateur a appuyé sur la flèche vers le haut". "A" ici est totalement arbitraire: il se trouve que c'est la lettre sur laquelle tout le monde était d'accord, car c'est ce que le DEC VT-52 et son successeur le populaire terminal VT-100 ont utilisé.

DEC VT-52 Manuel de maintenance 1976

Source: Manuel de maintenance DEC VT-52 1976

C'est toujours ainsi que fonctionnent les émulateurs de terminaux: selon la $TERMvariable, une base de données nommée terminfoest chargée de dire quels codes doivent être envoyés au shell (bash, sh, zsh ...), qui est ensuite chargé de les comprendre et de réagir pour eux.

Maintenant, le code pour Shift+ upse trouve être ^[[1;2A: l'émulateur de terminal envoie ce code au shell, qui essaie d'interpréter ^[[1;2mais n'affiche rien car il ne connaît pas cette séquence d'échappement. Mais Aest laissé et affiché.

Jennifer Wilson
la source
5
Wow intéressant. Maintenant, tout cela a du ^[[Asens lorsque je clique sur les touches fléchées pendant qu'un processus est en cours d'exécution sur le terminal.
Dan
4
Vous pouvez appuyer sur CTRL-v juste avant d'appuyer sur SHIFT-UpArrow pour «afficher» les séquences d'échappement sous forme brute. Sauf si vous avez modifié les valeurs par défaut, ESC devrait apparaître sur l'écran de votre terminal sous la forme ^ [
arielf
@arielf Vous pouvez également exécuter cat >/dev/nullpuis taper et appuyer sur Ctrl + C (ou Entrée puis Ctrl + D) lorsque vous avez terminé.
wjandrea