Les séquences de contrôle sur les terminaux Xterm
Motivation
Les forums de bidouilleurs Linux regorgent de recettes magiques pour:
- Afficher une invite de commande sympa (genre user@hote)
- ... voire la mettre en couleurs
- ... et même changer le titre de la fenêtre ou de l'onglet du terminal
Voir en particulier un tutoriel sur Le Site du Zéro qui semble avoir déménagé ici
Cependant ces explications ne précisent presque jamais leurs sources.
On va y remédier à partir d'un petit exemple.
Exemple
Supposons donc que vous entriez cette formule cabalistique:
PS1="\[\e]0;\h\a\]\[\e[34m\][\u@\h \W]\$\[\e[00m\]"
A la lumière des explications qui suivent, vous verrez qu'elle se décompose ainsi:
- \[\e]0;\h\a\] : Mettre le nom de la machine en titre de fenêtre
- \[\e[34m\] : Couleur bleue
- [\u@\h \W]\$ : Afficher [utilisateur@machine repertoire]$
- \[\e[00m\] : Retour à la couleur normale
Le rôle du bash
Le très long manuel bash informe ceux qui le veulent bien de l'existence d'une variable PS1 qui décrit l'invite de commande.
- Les \h,\u,\W ... pour les noms d'hôte, d'utilisateur, de répertoire ...
- Les \[...\] pour des caractères à ne pas afficher: en particulier les séquences de contrôle du terminal.
- Les \e ou \033 pour le caractère littéral ESC
- Les \a pour le caractère littéral BEL (celui qui fait bip)
Ainsi:
- \[\e]0;\h\a\] devient ESC ] 0 ; machine BEL
- \[\e[34m\] devient ESC [ 34 m
- [\u@\h \W]\$ devient [utilisateur@machine repertoire]$
- \[\e[00m\] devient ESC [ 00 m
Le rôle du terminal
Pour le bien de la cause, supposons que vous utilisiez le terminal GNOME. Le manuel (ou chercher "Gnome terminal introduction") nous indique qu'il comprend les séquences de type VT102, VT220 et xterm.
Une recherche sur l'Internet des séquences de contrôle Xterm, VT102, etc. donne en particulier Xterm Control Sequences; un document très ressemblant est donné par la page d'aide Linux man console_codes.
Ce document est austère, mais très complet (normal: son auteur Thomas Dickey maintient notamment xterm, ncurses, et lynx), et sa signification sera beaucoup plus claire après interprétation de notre exemple.
Caractères de contrôle 7 bits/8bits
Ainsi:
- ESC ] 0 ; machine BEL correspond à OSC 0 ; machine BEL
- ESC [ 34 m correspond à CSI 34 m
- [utilisateur@machine repertoire]$ est affiché directement.
- ESC [ 00 m correspond à CSI 00 m
Choix des couleurs
Dans la section Functions using CSI , ordered by the final character(s)on trouve les lignes suivantes:
CSI Pm m Character Attributes (SGR) 0 ==> Normal (default) ... 3 4 ==> Set foreground color to Blue
La signification des séquences CSI 34 m (mettre en bleu) et CSI 00 m (couleur normale) est ainsi dévoilée.
Titre de la fenêtre
La section Operating System Controls détaille:
OSC Ps ; Pt BEL
Et quelques lignes plus bas on voit que Ps = 0 correspond à la fonction "Window Title to Pt" comme annoncé
Pour aller plus loin
- Par exemple, depuis la ligne de commande bash, vous pouvez taper directement Ctrl-V ESC [ 34 m pour voir votre texte passer en bleu (Ctrl-V sert à entrer un caractère littéral)
- La librairie ncurses fournit une interface C qui évite de s'embêter avec la génération manuelle des séquences.