CONSOLE_CODES(4)

NOM
console_codes - Sequence de controle des consoles.

DESCRIPTION
Sous Linux, le gestionnaire de console implemente un sous-ensemble important des sequences de controle des terminaux VT102 et ECMA-48/ISO 6429/ANSI X3.64, ainsi que quelques sequences specifiques pour le changement de palette de couleurs, de fonte de caracteres, etc... Dans la description ci-dessous, la seconde colonne de la table contient les mnemoniques ECMA-48 ou DEC (ces derniers ayant le prefixe DEC) pour chaque fonction indiquee. Les sequences sans mnemoniques ne correspondent ni a l'ECMA-48 ni au VT102.

Lorsque tout le pretraitement necessaire a une sortie est termine, et qu'un flux de caracteres arrive au gestionnaire de console pour etre effectivement affiche, se produit tout d'abord une traduction des codes utilises pour le pretraitement en code utilises pour l'affichage.

Si la console est en mode UTF-8, les octets arrivants sont tout d'abord assembles en codes sur 16 bits au standard Unicode. Sinon chaque octet est transforme en fonction de la table de correspondance en cours (qui convertit chaque octet en une valeur Unicode). Voir le paragraphe JEUX DE CARACTERES plus bas pour plus de details.

Normalement, la valeur Unicode est convertie en un index dans la table de caracteres, qui est alors stocke dans la memoire video, afin que le symbole graphique correspondant (comme ceux qui se trouvent dans la memoire morte video), apparaisse sur l'ecran. Notez que l'utilisation de l'Unicode, et la conception des PC, permettent de disposer simultanement de 512 symboles differents.

Si la valeur Unicode rencontree est un caractere de controle, ou si l'on est deja dans le traitement d'une sequence d'echappement, la valeur sera traitee de maniere particuliere. Plutot que d'etre convertie en un index dans la table des caracteres et affichee comme un symbole, elle peut provoquer un deplacement du curseur, ou toute autre fonction de controle. Voir le paragraphe CONTROLE DE LA CONSOLE LINUX plus bas pour plus de details.

Il vaut mieux eviter en general de coder en dur les controles de terminaux dans les programmes. Linux propose l'utilisation de la base de donnees terminfo(5) concernant les possibilites des terminaux. Plutot que d'emettre des sequences d'echappement a la main, vous pourrez presque toujours utiliser des bibliotheques de gestion de terminaux utilisant terminfo, ou des utilitaires comme ncurses(3), tput(1), ou reset(1).

CONTROLE DE LA CONSOLE LINUX
Ce paragraphe decrit tous les caracteres de controle et les sequences d'echappement qui declenchent certaines fonctions speciales (c'est a dire n'affichant pas un symbole graphique a la position du curseur) sur la console Linux.

  Caracteres de controle
Un caractere est dit "de controle" s'il correspond a l'un des 14 codes suivants (avant traduction par la table de correspondance en cours) : 00 (NUL), 07 (BEL), 08 (BS), 09 (HT), 0A (LF), 0B (VT), 0C (FF), 0D (CR), 0E (SO), 0F (SI), 18 (CAN), 1A (SUB), 1B (ESC), 7F (DEL). On peut demander un mode d'affichage des caracteres de controle (voir plus bas), dans lequel les codes 07, 09, 0B, 18, 1A, et 7F seront quand meme affiches sous forme graphique. Inversement, en mode UTF-8 tous les codes de l'intervalle 00-1F sont consideres comme des caracteres de controle quelque soit le mode d'affichage de ces codes. Lorsqu'un caractere de controle est rencontre, il agit immediatement, puis est oublie (meme au milieu d'une sequence d'echappement, laquelle continue avec le caractere suivant). Toutefois, ESC indique le debut d'une nouvelle sequence d'echappement, annulant alors une eventuelle sequence deja commencee. De meme CAN et SUB annulent toute sequence d'echappement entamee. Les caracteres de controle reconnus sont BEL, BS, HT, LF, VT, FF, CR, SO, SI, CAN, SUB, ESC, DEL, CSI. Ils effectuent les actions suivantes :

BEL (0x07, ^G) emet un bip,

BS (0x08, ^H) revient en arriere d'une colonne (mais ne remonte pas a la ligne precedente quand il est invoque en debut de ligne),

HT (0x09, ^I) saute a la prochaine tablation, ou a la fin de ligne s'il n'y a pas de tabulation d'ici la,

LF (0x0A, ^J), VT (0x0B, ^K) et FF (0x0C, ^L) effectuent tous les trois un saut de ligne,

CR (0x0D, ^M) declenche un retour-chariot,

SO (0x0E, ^N) active le jeu de caracteres G1, et si LF/NL (mode new-line) est actif, effectue un retour-chariot,

SI (0x0F, ^O) active le jeu de caracteres G0,

CAN (0x18, ^X) et SUB (0x1A, ^Z) interrompent les sequences d'echappement,

ESC (0x1B, ^[) debute une sequence d'echappement,

DEL (0x7F) est ignore,

CSI (0x9B) est equivalent a ESC [.

  Sequences d'echappement ESC, non CSI
ESC c | RIS | Reinitialisation.
ESC D | IND | Saut de ligne.
ESC E | NEL | Nouvelle ligne.
ESC H | HTS | Positionner une tabulation a la colonne en cours
ESC M | RI | Saut de ligne inverse.
ESC Z | DECID | Identification privee DEC. Le noyau renvoie la
 |  | chaine ESC [ ? 6 c, simulant un VT102.
ESC 7 | DECSC | Sauvegarde de l'etat en cours (coordonnees curseur,
 |  | attributs, jeu de caracteres).
ESC 8 | DECRC | Restaure l'etat sauvegarde le plus recent.
ESC [ | CSI | Debut de sequence de controle.
ESC % |  | Debut de sequence de selection de jeu de caractere.
ESC % @ |  | Jeu par defaut (ISO 646/ISO 8859-1)
ESC % G |  | Jeu UTF-8
ESC % 8 |  | Jeu UTF-8 (obsolete)
ESC # 8 | DECALN | Test d'alignement d'ecran DEC, remplit l'ecran avec
 |  | des E.
ESC ( |  | Debut de sequence de definition du jeu G0
ESC ( B |  | Correspondance par defaut (ISO 8859-1)
ESC ( 0 |  | Correspondance VT100 graphique
ESC ( U |  | Pas de correspondance - Caracteres en ROM
ESC ( K |  | Correspondance definie par l'utilisateur
 |  | avec l'utilitaire mapscrn(8).
ESC ) |  | Debut de sequence de definition du jeu G1
 |  | (suivi de B, 0, U, K, comme ci-dessus).
ESC > | DECPNM | Mode de pave numerique.
ESC = | DECPAM | Mode de pave alphabetique.
ESC ] | OSC | (Operating system command)
 |  | ESC ] P nrrvvbb: fixe la palette, le parametre est
 |  | fourni avec 7 chiffres hexadecimaux apres le P final.
 |  | n est la couleur (0-16), et rrvvbb indique
 |  | les valeurs rouge/verte/bleue (0-255).
 |  | ESC ] R: reinitialise la palette.

  Sequences d'echappement ECMA-48 CSI
CSI (ou ESC [) est suivi d'une serie de parametres, au plus NPAR (16), representes par des nombres decimaux separes par des points virgules. Un parametre vide ou absent est considere comme nul. La serie de parametre peut etre precede par un point d'interrogation. Toutefois, apres CSI [ (ou ESC [ [) un seul caractere est lu, et le reste de la sequence est ignore. L'idee est d'eliminer les touches de fonctions doublees. L'action declenchee par une sequence CSI est indiquee par le dernier caractere.
@ | ICH | Insere le nombre indique de caracteres blancs.
A | CUU | Remonter le curseur du nombre de lignes indique.
B | CUD | Descendre le curseur du nombre de lignes indique.
C | CUF | Avancer le curseur du nombre de colonnes indique.
D | CUB | Reculer le curseur du nombre de colonnes indique.
E | CNL | Descendre le curseur du nombre de ligne indique,
 |  | en colonne numero 1.
F | CPL | Remonter le curseur du nombre de lignes indique,
 |  | en colonne numero 1.
G | CHA | Deplacer le curseur a la ligne indiquee, meme colonne.
H | CUP | Deplacer le curseur a la ligne et a la colonne
 |  | indiquees (origine en 1, 1).
J | ED | Effacer l'ecran (par defaut depuis la position du
 |  | curseur jusqu'a la fin de l'ecran).
 |  | ESC [ 1 J: efface du debut juqu'au curseur.
 |  | ESC [ 2 J: efface tout l'ecran.
K | EL | Efface la ligne (par defaut depuis le curseur jusqu'a
 |  | la fin de la ligne).
 |  | ESC [ 1 K: efface du debut de ligne jusqu'au curseur.
 |  | ESC [ 2 K: efface toute la ligne.
L | IL | Insere le nombre indique de lignes blanches.
M | DL | Supprimer le nombre indique de lignes.
P | DCH | Supprime le nombre indique de caracteres sur la ligne
 |  | en cours.
X | ECH | Efface le nombre indique de caracteres sur la ligne
 |  | en cours.
a | HPR | Avancer le curseur jusqu'a la colonne indiquee.
c | DA | Repondre ESC [ ? 6 c: `Je suis un VT102'.
d | VPA | Placer le curseur sur la ligne indiquee, meme colonne.
e | VPR | Descendre le curseur du nombre indiquee de lignes.
f | HVP | Placer le curseur aux lignes et colonnes indiquees.
g | TBC | Sans parametre: effacer la tabulation a la position
 |  | courante.
 |  | ESC [ 3 g: effacer toutes les tabulations.
h | SM | Fixe le mode (voir plus bas).
l | RM | Reinitialise le mode (voir pls bas).
m | SGR | Fixe les attributs (voir plus bas).
n | DSR | Indique le status (voir plus bas).
q | DECLL | Fixe les LEDs du clavier.
 |  | ESC [ 0 q: Effacer toutes les LEDs
 |  | ESC [ 1 q: Allumer LED Scroll-Lock (Defilement)
 |  | ESC [ 2 q: Allumer LED Num-Lock (Pave numerique)
 |  | ESC [ 3 q: Allumer LES Caps-Lock (Majuscules)
r | DECSTBM | Indique une region de defilement, les parametres
 |  | correspondent aux lignes haute et basse.
s | ? | Memoriser l'emplacement du curseur.
u | ? | Restituer l'emplacement du curseur.
` | HPA | Deplacer le curseur a la colonne indiquee, meme ligne.

  Affichage graphique ECMA-48
La sequence ECMA-48 SGR suivante ESC [ <parametres> m fixe les parametres d'affichage. Plusieurs attributs peuvent etre indiques dans la meme sequence.

param | resultat.
0 | reinitialiser tous les attributs a leurs valeurs par defaut.
1 | attribut gras.
2 | attribut demi-luminosite (simule par une couleur sur certains
 | ecrans couleurs).
4 | attribut soulignement (simule par une couleur sur certains
 | ecrans couleurs).
 | (Les couleurs utilisees pour simuler la demi-luminosite ou le
 | soulignement sont choisies en utilisant ESC ] ...).
5 | clignotement.
7 | video inversee.
10 | reinitialise la correspondance des touches, affiche l'etat de
 | controle et change l'attribut "meta".
11 | active une correspondance nulle, affiche l'etat de controle et
 | change l'attribut "meta".
12 | active une correspondance nulle, affiche l'etat de controle et
 | active l'attribut "meta". (le changement d'attribut meta sert
 | a changer le bit de poids fort avant la conversion avec la table
 | de correspondance).
21 | intensite normale (non compatible avec ECMA-48).
22 | intensite normale.
24 | pas de soulignement.
25 | pas de clignotement.
27 | pas d'inversion video.
30 | encre noire.
31 | encre rouge.
32 | encre verte.
33 | encre marron.
34 | encre bleue.
35 | encre magenta.
36 | encre cyan.
37 | encre blanche.
38 | soulignement, et couleur d'encre par defaut.
39 | arret soulignement et couleur d'encre par defaut.
40 | fond noir.
41 | fond rouge.
42 | fond vert.
43 | fond marron.
44 | fond bleu.
45 | fond magenta.
46 | fond cyan.
47 | fond blanc.
49 | couleur de fond par defaut.

  Modes ECMA-48

ESC [ 3 h
    DECCRM (inactif par defaut): Afficher les caracteres de controle.

ESC [ 4 h
    DECIM (inactif par defaut): Mode d'insertion.

ESC [ 20 h
    LF/NL (inactif par deat): faire suivre les LF, VT ou FF par un CR.

  Demande de rapport d'etat ECMA-48

ESC [ 5 n
    Rapport d'etat du peripherique (DSR): La reponse est ESC [ 0 n (Terminal OK).

ESC [ 6 n
    Rapport de position du curseur (CPR): La reponse est ESC [ y ; x R, ou x,y est la position actuelle du curseur.

  Modes prives DEC (DECSET/DECRST)
Ces modes ne sont pas decrits dans l'ECMA-48. La liste ci-dessous presente les sequences d'activation des modes, les sequences de desactivation sont obtenues en remplacant le `h' final par un `l'.

ESC [ ? 1 h
    DECCKM (inactif par defaut): Les touches de deplacement du curseur emettent un prefixe ESC O plutot que ESC [.

ESC [ ? 3 h
    DECCOLM (inactif par defaut): Bascule de 80 colonnes en 132 colonnes. Les sources du gestionnaire de console indiquent que ce code n'est pas suffisant a lui seul. Certains utilitaires comme resizecons(8) modifient egalement les registres materiels de la carte video.

ESC [ ? 5 h
    DECSCNM (inactif par defaut): Mode d'inversion video.

ESC [ ? 6 h
    DECOM (inactif par defaut): Adressage du curseur relatif au coin haut gauche de la region de defilement.

ESC [ ? 7 h
    DECAWM (actif par defaut): saut de ligne automatique. Un caractere emis apres la colonne 80 (ou 132 en mode DECCOLM), est affiche au debut de la ligne suivante.

ESC [ ? 8 h
    DECARM (actif par defaut): Repetition automatique des touches du clavier.

ESC [ ? 9 h
    Etat de souris X10 (inactif par defaut): Fixe le mode de rapport d'etat de la souris a 1 (ou le reinitialise a 0) - voir plus bas.

ESC [ ? 25 h
    DECCM (actif par defaut): curseur visible.

ESC [ ? 1000 h
    Etat de souris X11 (inactif par defaut): Fixe le mode de rapport d'etat de la souris a 2 (ou le reinitialise a 0) - voir plus bas.

  Sequences CSI privees de la console Linux
Les sequences suivantes ne sont ni ECMA-48 ni du VT102 original. Elles sont specifiques au gestionnaire de console de Linux. Les couleurs sont indiquees ainsi : 0 = noir, 1 = rouge, 2 = vert, 3 = marron, 4 = bleu, 5 = magenta, 6 = cyan, 7 = blanc.
ESC [ 1 ; n ] | Choisit la couleur n pour simuler
 | le soulignement.
ESC [ 2 ; n ] | Choisit la couleur n pour simuler
 | la demi-brillance.
ESC [ 8 ] | Utilise la paire de couleurs actuelle par defaut.
ESC [ 9 ; n ] | Delai d'economiseur d'ecran en minutes.
ESC [ 10 ; n ] | Frequence du bip en Hz.
ESC [ 11 ; n ] | Duree du bip en ms.
ESC [ 12 ; n ] | Bascule sur la controle virtuelle indiquee.
ESC [ 13 ] | Arrete l'economiseur d'ecran.
ESC [ 14 ; n ] | Indique l'intervalle d'arret ecran VESA en minutes.

JEUX DE CARACTERES
Le noyau connait 4 types de traductions des octets en symboles graphiques pour la console. Les 4 tables sont a) Latin1 -> PC, b) VT100 graphique -> PC, c) PC -> PC, d) specifique utilisateur. Il existe deux jeux de caracteres, appeles G0 et G1, et l'un d'entre eux est selectionne comme jeu en cours (initialement G0). La frappe de ^N selectionne le jeu G1 comme jeu en cours, la frapper de ^O selectionne le jeu G0. Ces variables G0 et G1 pointent vers des tables de traduction, qui peuvent etre modifiees par l'utilisateur. Initialement elles pointent respectivement vers les tables a) et b). Les sequences ESC ( B, ESC ( 0, ESC ( U et ESC ( K font pointer G0 respectivement vers les tables a), b), c) et d). Les sequences ESC ) B, ESC ) 0, ESC ) U, ESC ) K font pointer G1 vers les tables a), b), c) et d) respectivement. La sequence ESC c reinitialise le terminal. C'est ce qui doit etre effectue lorsque l'ecran est rempli de codes incomprehensibles. La commande classique "echo ^V^O" selectionne seulement le jeu G0, elle ne garantit pas que G0 pointe sur la table a). Dans certaines distributions, on trouve une commande reset(1) qui effectue simplement "echo ^[c". Si l'entree de la base terminfo pour la console est correcte, et dispose d'une entree rs1=\Ec alors la commande "tput reset" fonctionnera aussi. La table de correspondance definie par l'utilisateur peut etre construite en utilisant mapscrn(8). Cette correspondance agit ainsi : si le symbole c doit etre imprime, alors le symbole s = map[c] est envoye a la memoire video. La representation graphique correspondant a s est placee par defaut en memoire morte, et peut etre modifiee en utilisant setfont(8).

GESTION DE SOURIS
Les possibilites de gestion de souris sont prevues pour fournir un rapport d'etat de la souris compatible avec xterm. Comme le gestionnaire de console n'a aucun moyen de connaitre le peripherique, ni le type de souris, ces rapports sont envoyes dans le flux de saisie de la console uniquement quand une requete ioctl de mise a jour de la souris est recue. Ces requetes doivent etre declenchees par une application utilisateur capable de gerer les souris, comme le demon gpm(8). Les parametres numeriques pour toutes les sequences de suivi de souris engendrees par xterm sont encodes dans un unique caractere, de code valeur+040. par exemple, `!' correspond a 1. Le systeme de coordonnees d'ecran commence a 1. En mode de compatibilite X10, une sequence d'echappement est envoyee lors de l'appui sur un bouton, encodant la position et le numero du bouton presse. Ce mode est active avec ESC [ ? 9 h et desactive par ESC [ ? 9 l. Lors d'une pression sur un bouton, xterm envoie ESC [ M bxy (6 caracteres). Dans ce message b correspond au numero de bouton -1, x et y sont les coordonnees de l'emplacement ou le bouton a ete presse. Ce sont les memes codes que ceux produits par le noyau. En mode de suivi normal (non implemente sous Linux 2.0.24), une sequence d'echappement est envoyee lors de l'appui sur un bouton, mais aussi lors du relachement. Des informations sur les touches de modification (SHIFT, CTL...) sont egalement envoyees. Le mode est active par ESC [ ? 1000 h et desactive avec ESC [ 1000 l. Lors de l'appui ou du relachement d'un bouton, xterm envoie ESC [ M bxy. les deux bits de poids faible de b correspondent a l'etat du bouton 0=B1 presse, 1=B2 presse, 2=B3 presse, 3=relachement. Les bits de poids forts codent l'eventuelle touche modificatrice enfoncee lors de l'appui sur le bouton 4=Shift, 8=Meta, 16=Control. A nouveau x et y sont les coordonnees de la souris au moment de l'evenement. Le coin en haut a gauche de l'ecran a pour coordonnees (1,1).

COMPARAISON AVEC D'AUTRES TERMINAUX
Beaucoup d'autres terminaux sont dits compatibles VT100, comme la console Linux. Nous allons voir ici les differences entre cette derniere et les deux types principaux de terminaux : le DEC VT102 et xterm(1).

  Gestion des caracteres de controle
Le VT102 reconnaissait les caracteres de controle supplementaires suivants :

NUL (0x00) etait ignore.

ENQ (0x05) renvoyait un message d'identification.

DC1 (0x11, ^Q, XON) reprenait une transaction.

DC3 (0x13, ^S, XOFF) demandait au vt100 d'ignorer tous les codes saufs XOFF et XON (et d'arreter egalement de transmettre).

Une gestion de DC1/DC3 compatible VT100 pouvait etre active par le gestionnaire de terminaux.

Le programme xterm (en mode VT100) reconnait les caracteres de controle BEL, BS, HT, LF, VT, FF, CR, SO, SI, ESC.

  Sequences d'echappement
Les sequences d'echappement VT100 non implementees sur la console Linux :

ESC N | SS2 | Basculement G2 simple. (Selectionner le jeu G2 pour le
 |  | caractere suivant uniquement)
ESC O | SS3 | Basculement G3 simple. (Selectionner le jeu G3 pour le
 |  | caractere suivant uniquement)
ESC P | DCS | Chaine de controle de peripherique (terminee par ESC \)
ESC X | SOS | Debut de chaine.
ESC ^ | PM | Message prive (termine par ESC \)
ESC \ | ST | Fin de chaine
ESC * ... |  | Designe le jeu de caractere G2
ESC + ... |  | Designe le jeu de caractere G3
Le programme xterm (en mode VT100) reconnait ESC c, ESC # 8, ESC >, ESC =, ESC D, ESC E, ESC H, ESC M, ESC N, ESC O, ESC P ... ESC \, ESC Z (il repond ESC [ ? 1 ; 2 c, `Je suis un VT100 avec des options video avancees') et ESC ^ ... ESC \ avec les memes significations que celles indiquees plus haut. Il accepte ESC (, ESC ), ESC *, ESC + suivis de 0, A, B pour les caracteres speciaux DEC, les traces de lignes, l'ASCII UK, et l'ASCII US, respectivement. Il accepte ESC ] pour fixer certaines ressources :

ESC ] 0 ; txt BEL | Utiliser txt pour le nom d'icone et le
 | titre de la fenetre
ESC ] 1 ; txt BEL | Utiliser txt pour le nom d'icone.
ESC ] 2 ; txt BEL | Utiliser txt pour le titre de la fenetre.
ESC ] 4 6 ; nom BEL | Modifier le nom du fichier de journalisation
 | (generalement desactive a la compilation)
ESC ] 5 0 ; fn BEL | Choisir la fonte fn
Les codes suivants ont une signification legerement differente des codes originaux :

ESC 7 DECSC | Memoriser l'emplacement du curseur.
ESC 8 DECRC | Restaurer l'emplacement du curseur.
Il reconnait egalement :

ESC F |  | Curseur en bas a gauche de l'ecran (si active par la
 |  | ressource hpLowerleftBugCompat)
ESC l |  | Verrouillage memoire (comme les terminaux HP).
 |  | verrouille la memoire sous le curseur.
ESC m |  | Deverrouillage memoire (comme les terminaux HP);
ESC n | LS2 | Invoque le jeu de carcateres G2.
ESC o | LS3 | Invoque le jeu de carcateres G3.
ESC | | LS3R | Choisit le jeu G3 comme GR ([NDT] ??)
 |  | Pas d'effet visible dans un xterm.
ESC } | LS2R | Choisit le jeu G2 comme GR
 |  | Pas d'effet visible dans un xterm.
ESC ~ | LS1R | Choisit le jeu G1 comme GR
 |  | Pas d'effet visible dans un xterm.
Il ne reconnait pas ESC % ...

  Sequences CSI
Le programme xterm (avec XFree86 3.1.2G) ne reconnait pas les sequences de clignotement ou d'invisibilite. La version de base sous X11R6 ne reconnait pas les sequences de choix de couleur. Toutes les autres sequences ECMA-48 CSI reconnues par la console Linux sont reconnue par xterm, et inversement. Le programme xterm reconnaitra egalement toutes les sequences privees DEC citees plus haut, mais aucune sequence privee Linux. Pour plus de detail sur les sequences privees d'xterm consulter le document Xterm Control Sequences d'Edward Moy et Stephen Gildea, disponible avec la distribution X.

BUGS
Avec le noyau 2.0.23, CSI fonctionne mal, et les caracteres NUL ne sont pas ignores dans les sequences d'echappement.

VOIR AUSSI
console(4), console_ioctl(4), charsets(4)