Séquences de terminaux virtuels de console

Les séquences de terminaux virtuels sont des séquences de caractères de contrôle qui peuvent contrôler le déplacement du curseur, la couleur de la console, et d’autres opérations lors de leur écriture dans le flux de sortie. Les séquences peuvent également être reçues sur le flux d’entrée en réponse à une séquence d’informations de requête de flux de sortie ou en tant qu’encodage d’entrée d’utilisateur quand le mode approprié est défini.

Pour configurer ce comportement, vous pouvez utiliser les fonctions GetConsoleMode et SetConsoleMode. Vous trouverez un exemple de la méthode suggérée pour activer les comportements des terminaux virtuels à la fin de ce document.

Le comportement des séquences suivantes est basé sur les technologies d’émulateur de terminal VT100 et dérivés, plus spécifiquement l’émulateur de terminal xterm. Pour plus d’informations sur les séquences de terminal, consultez http://vt100.net et http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.

Séquences de sortie

Les séquences de terminal suivantes sont interceptées par l’hôte de la console quand elles sont écrites dans le flux de sortie, si l’indicateur ENABLE_VIRTUAL_TERMINAL_PROCESSING est défini sur le descripteur de mémoire tampon d’écran à l’aide de la fonction SetConsoleMode. Notez que l’indicateur DISABLE_NEWLINE_AUTO_RETURN peut également être utile pour émuler le comportement de défilement et de positionnement de curseur d’autres émulateurs de terminal par rapport aux caractères écrits dans la dernière colonne de n’importe quelle ligne.

Positionnement de curseur simple

Dans toutes les descriptions suivantes, le caractère d’échappement (ESC) est toujours la valeur hexadécimale 0x1B. Aucun espace ne doit être inclus dans les séquences de terminal. Les séquences individuelles de terminaux peuvent être fractionnées, à tout caractère ou octet, en plusieurs appels séquentiels à WriteFile ou WriteConsole, mais il est de meilleure pratique d'inclure l'ensemble de la séquence dans un seul appel. Pour obtenir un exemple d’utilisation pratique de ces séquences, consultez l’exemple à la fin de cette rubrique.

Le tableau suivant décrit des séquences d’échappement simples avec une commande d’action unique directement après le caractère d’échappement (ESC). Ces séquences n’ont pas de paramètres et prennent effet immédiatement.

Toutes les commandes de ce tableau équivalent généralement à appeler l’API console SetConsoleCursorPosition pour placer le curseur.

Le déplacement du curseur est limité par la fenêtre d’affichage actuelle dans la mémoire tampon. Le défilement (si disponible) ne se produit pas.

Séquence Forme abrégée Comportement
ESC M Instance réservée Index inverse : effectue l’opération inverse de \n, déplace le curseur d’une ligne vers le haut, conserve la position horizontale, fait défiler le tampon si nécessaire*
ESC 7 DECSC Enregistrer la position du curseur en mémoire**
ESC 8 DECSR Restaurer la position du curseur à partir de la mémoire**

Remarque

* Si des marges de défilement sont définies, l’index inverse (RI) à l’intérieur des marges fait défiler uniquement le contenu des marges et laisse la fenêtre d’affichage inchangée. (Voir Marges de défilement)

**Aucune valeur n’est enregistrée en mémoire tant que la commande d’enregistrement n’a pas été utilisée une première fois. La seule façon d’accéder à la valeur enregistrée consiste à utiliser la commande de restauration.

Positionnement du curseur

Les tableaux suivants englobent les séquences de types CSI (Control Sequence Introducer, Introducteur de séquence de commandes). Toutes les séquences CSI commencent par ESC (0x1B) suivi de [ (crochet gauche, 0x5B) et peuvent contenir des paramètres de longueur variable afin de spécifier plus d’informations pour chaque opération. Cela est représenté par la forme abrégée <n>. Chaque tableau ci-dessous est regroupé par fonctionnalité et est suivi de notes expliquant le fonctionnement du groupe.

Pour tous les paramètres, les règles suivantes s’appliquent, sauf indication contraire :

  • <n> représente la distance de déplacement et est un paramètre facultatif
  • Si <n> est omis ou est égal à 0, il est traité comme un 1
  • <n> ne peut pas être supérieur à 32 767 (valeur courte maximale)
  • <n> ne peut pas être négatif

Toutes les commandes de cette section équivalent généralement à appeler l’API console SetConsoleCursorPosition.

Le déplacement du curseur est limité par la fenêtre d’affichage actuelle dans la mémoire tampon. Le défilement (si disponible) ne se produit pas.

Séquence Code Description Comportement
ESC [ <n> A CUU Déplacement du curseur vers le haut Déplacement du curseur vers le haut de <n> ligne(s)
ESC [ <n> B CUD Déplacement du curseur vers le bas Déplacement du curseur vers le bas de <n> ligne(s)
ESC [ <n> C CUF Déplacement du curseur vers l’avant Déplacement du curseur vers l’avant (à droite) de <n> colonne(s)
ESC [ <n> D CUB Déplacement du curseur vers l’arrière Déplacement du curseur vers l’arrière (à gauche) de <n> colonne(s)
ESC [ <n> E CNL Déplacement du curseur vers la ligne suivante Déplacement du curseur vers le bas de <n> lignes à partir de la position actuelle
ESC [ <n> F CPL Déplacement du curseur vers la ligne précédente Déplacement du curseur vers le haut de <n> lignes à partir de la position actuelle
ESC [ <n> G CHA Déplacement horizontal absolu du curseur Le curseur se déplace horizontalement jusqu’à la <n>ième position dans la ligne actuelle
ESC [ <n> d VPA Déplacement vertical absolu jusqu’à une ligne Le curseur se déplace verticalement jusqu’à la <n>ième position dans la colonne actuelle
ESC [ <y> ; <x> H CUP Position du curseur *Le curseur se déplace jusqu’à la position <x>; <y> dans la fenêtre d’affichage, où <x> correspond à la colonne de la ligne <y>
ESC [ <y> ; <x> f HVP Position verticale horizontale *Le curseur se déplace jusqu’à la position <x>; <y> dans la fenêtre d’affichage, où <x> correspond à la colonne de la ligne <y>
ESC [ s ANSISYSSC Enregistrer le curseur – émulation Ansi.sys **Sans paramètre, effectue une opération d’enregistrement du curseur comme DECSC
ESC [ u ANSISYSRC Restaurer le curseur – émulation Ansi.sys **Sans paramètre, effectue une opération de restauration du curseur comme DECRC

Remarque

Les paramètres <x> et <y> présentent les mêmes limitations que <n> ci-dessus. Si <x> et <y> sont omis, ils sont définis sur 1;1.

**La documentation historique sur ANSI.sys est disponible à l’adresse https://msdn.microsoft.com/library/cc722862.aspx et est implémentée pour des raisons pratiques et de compatibilité.

Visibilité du curseur

Les commandes suivantes contrôlent la visibilité du curseur et son état de clignotement. Les séquences DECTCEM équivalent généralement à appeler l’API console SetConsoleCursorInfo pour changer l’état de la visibilité du curseur.

Séquence Code Description Comportement
ESC [ ? 12 h ATT160 Curseur de texte - Activer le clignotement Démarrer le clignotement du curseur
ESC [ ? 12 l ATT160 Curseur de texte - Désactiver le clignotement Arrêter le clignotement du curseur
ESC [ ? 25 h DECTCEM Curseur de texte - Activer le mode affichage Afficher le curseur
ESC [ ? 25 l DECTCEM Curseur de texte - Activer le mode masquage Masquer le curseur

Conseil

Les séquences d’activation se terminent par un caractère H minuscule (h), tandis que les séquences de désactivation se terminent par un caractère L minuscule (l).

Forme de curseur

Les commandes suivantes contrôlent et autorisent la personnalisation de la forme du curseur.

Séquence Code Description Comportement
ESC [ 0 SP q DECSCUSR Forme d’utilisateur Forme de curseur par défaut configurée par l’utilisateur
ESC [ 1 SP q DECSCUSR Bloc de clignotement Forme de curseur de bloc de clignotement
ESC [ 2 SP q DECSCUSR Bloc stable Forme de curseur de bloc stable
ESC [ 3 SP q DECSCUSR Soulignement de clignotement Forme de curseur de soulignement de clignotement
ESC [ 4 SP q DECSCUSR Soulignement stable Forme de curseur de soulignement stable
ESC [ 5 SP q DECSCUSR Barre clignotante Forme de curseur de barre de clignotement
ESC [ 6 SP q DECSCUSR Barre stable Forme de curseur de barre stable

Remarque

SP est un espace littéral (0x20) en position intermédiaire, et il est suivi par q (0x71) en position finale.

Positionnement de la fenêtre d’affichage

Toutes les commandes de cette section équivalent généralement à appeler l’API console ScrollConsoleScreenBuffer pour déplacer le contenu de la mémoire tampon de la console.

Attention Les noms des commandes sont trompeurs. Le défilement fait référence à la direction dans laquelle le texte se déplace au cours de l’opération, et non à celle que semblerait emprunter la fenêtre d’affichage.

Séquence Code Description Comportement
ESC [ <n> S Unités de diffusion en continu Faire défiler vers le haut Faire défiler le texte vers le haut de <n>. Opération également appelée « panoramique vers le bas » ; les nouvelles lignes se remplissent à partir du bas de l’écran
ESC [ <n> T SD Faire défiler vers le bas Faire défiler vers le bas de <n>. Opération également appelée « panoramique vers le haut » ; les nouvelles lignes se remplissent à partir du haut de l’écran

Le texte est déplacé à partir de la ligne sur laquelle se trouve le curseur. Si le curseur se trouve sur la ligne du milieu de la fenêtre d’affichage, le défilement vers le haut déplace la moitié inférieure de la fenêtre d’affichage et insère des lignes vides en bas. Le défilement vers le bas déplace la moitié supérieure des lignes de la fenêtre d’affichage et insère de nouvelles lignes en haut.

En outre, il est important de noter que le défilement vers le haut et vers le bas est également affecté par les marges de défilement. Le défilement vers le haut et vers le bas n’affecte pas les lignes situées en dehors des marges de défilement.

La valeur par défaut de <n> est 1 et la valeur peut éventuellement être omise.

Modification du texte

Toutes les commandes de cette section équivalent généralement à appeler les API consoles FillConsoleOutputCharacter, FillConsoleOutputAttribute et ScrollConsoleScreenBuffer pour modifier le contenu de la mémoire tampon de texte.

Séquence Code Description Comportement
ESC [ <n> @ ICH Insérer un caractère Insérer <n> espaces à la position actuelle du curseur, en décalant tout le texte existant vers la droite. Le texte qui quitte l’écran à droite est supprimé.
ESC [ <n> P DCH Supprimer un caractère Supprimer <n> caractères à la position actuelle du curseur, entraînant par effet de décalage la création d’autant de caractères d’espace à partir du bord droit de l’écran.
ESC [ <n> X ECH Effacer un caractère Effacer <n> caractères de la position actuelle du curseur en les remplaçant par un espace.
ESC [ <n> L IL Insérer une ligne Insérer <n> lignes dans la mémoire tampon à la position du curseur. La ligne sur laquelle se trouve le curseur et les lignes au-dessous de celle-ci sont décalées vers le bas.
ESC [ <n> M DL Supprimer la ligne Supprime <n> lignes de la mémoire tampon, en commençant par la ligne sur laquelle se trouve le curseur.

Remarque

Pour IL et DL, seules les lignes dans les marges de défilement (voir Marges de défilement) sont affectées. Si aucune marge n’est définie, les bordures de marge par défaut sont la fenêtre d’affichage actuelle. Si des lignes sont décalées en dessous des marges, elles sont ignorées. Quand des lignes sont supprimées, des lignes vides sont insérées en bas des marges et les lignes en dehors de la fenêtre d’affichage ne sont jamais affectées.

Pour chacune des séquences, la valeur par défaut de <n> s’il est omis est 0.

Pour les commandes suivantes, le paramètre <n> a 3 valeurs valides :

  • 0 efface de la position actuelle du curseur (comprise) jusqu’à la fin de la ligne/de l’affichage
  • 1 efface du début de la ligne/de l’affichage jusqu’à la position actuelle du curseur comprise
  • 2 efface l’intégralité de la ligne/de l’affichage
Séquence Code Description Comportement
ESC [ <n> J ED Effacer dans l’affichage En fonction de la valeur de <n>, remplacer par des espaces tout le texte de la fenêtre d’affichage ou de l’écran actuel
ESC [ <n> K EL Effacer dans la ligne En fonction de la valeur de <n>, remplacer par des espaces tout le texte de la ligne contenant le curseur

Mise en forme du texte

Toutes les commandes de cette section équivalent généralement à appeler les API consoles SetConsoleTextAttribute pour ajuster la mise en forme de toutes les écritures futures dans la mémoire tampon de texte de sortie de la console.

Cette commande est spéciale dans la mesure où la position <n> ci-dessous peut accepter entre 0 et 16 paramètres séparés par des points-virgules.

L’absence de paramètre équivaut à la présence d’un paramètre 0 unique.

Séquence Code Description Comportement
ESC [ <n> m SGR Définir un rendu graphique Définir le format de l’écran et du texte tel que spécifié par <n>

Le tableau de valeurs suivant peut être utilisé dans <n> pour représenter différents modes de mise en forme.

Les modes de mise en forme s’appliquent de gauche à droite. Si des options de mise en forme concurrentes sont appliquées, l’option la plus à droite est prioritaire.

Pour les options qui spécifient des couleurs, celles-ci sont utilisées comme défini dans la table de couleurs de la console, qui peut être modifiée à l’aide de l’API SetConsoleScreenBufferInfoEx. Si la table est modifiée afin que la position « bleu » dans la table affiche une nuance RVB rouge, tous les appels à Premier plan en bleu affichent cette couleur rouge jusqu’à ce qu’une nouvelle modification soit effectuée.

Valeur Description Comportement
0 Par défaut Retourne tous les attributs à l’état par défaut avant la modification
1 Mise en gras/couleur brillante Applique l’indicateur de luminosité/intensité à la couleur de premier plan
22 Aucune mise en gras/couleur brillante Supprime l’indicateur de luminosité/intensité de la couleur de premier plan
4 Souligner Ajoute un soulignement
24 Pas de soulignement Supprime le soulignement
7 Négatif Permute les couleurs de premier plan et d’arrière-plan
27 Image positive (non négative) Rétablit le premier plan et l’arrière-plan à l’état normal
30 Premier plan en noir Applique la couleur noir brillant sans mise en gras au premier plan
31 Premier plan en rouge Applique la couleur rouge vif sans mise en gras au premier plan
32 Premier plan en vert Applique la couleur vert clair sans mise en gras au premier plan
33 Premier plan en jaune Applique la couleur jaune vif sans mise en gras au premier plan
34 Premier plan en bleu Applique la couleur bleu brillant sans mise en gras au premier plan
35 Premier plan en magenta Applique la couleur magenta brillant sans mise en gras au premier plan
36 Premier plan en cyan Applique la couleur cyan brillant sans mise en gras au premier plan
37 Premier plan en blanc Applique la couleur blanc brillant sans mise en gras au premier plan
38 Premier plan avec valeur de couleur étendue Applique la valeur de couleur étendue au premier plan (voir les détails ci-dessous).
39 Définition par défaut du premier plan Applique uniquement la partie du premier plan des valeurs par défaut (voir 0).
40 Arrière-plan en noir Applique la couleur noir brillant sans mise en gras à l’arrière-plan
41 Arrière-plan en rouge Applique la couleur rouge vif sans mise en gras à l’arrière-plan
42 Arrière-plan en vert Applique la couleur vert clair sans mise en gras à l’arrière-plan
43 Arrière-plan en jaune Applique la couleur jaune vif sans mise en gras à l’arrière-plan
44 Arrière-plan en bleu Applique la couleur bleu brillant sans mise en gras à l’arrière-plan
45 Arrière-plan en magenta Applique la couleur magenta brillant sans mise en gras à l’arrière-plan
46 Arrière-plan en cyan Applique la couleur cyan brillant sans mise en gras à l’arrière-plan
47 Arrière-plan en blanc Applique la couleur blanc brillant sans mise en gras à l’arrière-plan
48 Arrière-plan avec valeur de couleur étendue Applique une valeur de couleur étendue à l’arrière-plan (voir les détails ci-dessous).
49 Définition par défaut de l’arrière-plan Applique uniquement la partie de l’arrière-plan des valeurs par défaut (voir 0).
90 Premier plan en noir brillant Applique la couleur noir brillant avec mise en gras au premier plan
91 Premier plan en rouge vif Applique la couleur rouge vif avec mise en gras au premier plan
92 Premier plan en vert clair Applique la couleur vert clair avec mise en gras au premier plan
93 Premier plan en jaune vif Applique la couleur jaune vif avec mise en gras au premier plan
94 Premier plan en bleu brillant Applique la couleur bleu brillant avec mise en gras au premier plan
95 Premier plan en magenta brillant Applique la couleur magenta brillant avec mise en gras au premier plan
96 Premier plan en cyan brillant Applique la couleur cyan brillant avec mise en gras au premier plan
97 Premier plan en blanc brillant Applique la couleur blanc brillant avec mise en gras au premier plan
100 Arrière-plan en noir brillant Applique la couleur noir brillant avec mise en gras à l’arrière-plan
101 Arrière-plan en rouge vif Applique la couleur rouge vif avec mise en gras à l’arrière-plan
102 Arrière-plan en vert clair Applique la couleur vert clair avec mise en gras à l’arrière-plan
103 Arrière-plan en jaune vif Applique la couleur jaune vif avec mise en gras à l’arrière-plan
104 Arrière-plan en bleu brillant Applique la couleur bleu brillant avec mise en gras à l’arrière-plan
105 Arrière-plan en magenta brillant Applique la couleur magenta brillant avec mise en gras à l’arrière-plan
106 Arrière-plan en cyan brillant Applique la couleur cyan brillant avec mise en gras à l’arrière-plan
107 Arrière-plan en blanc brillant Applique la couleur blanc brillant avec mise en gras à l’arrière-plan

Couleurs étendues

Certains émulateurs de terminaux virtuels prennent en charge une palette de couleurs supérieure aux 16 couleurs fournies par la console Windows. Pour ces couleurs étendues, la console Windows choisit la couleur appropriée la plus proche dans la table de 16 couleurs existante pour l’affichage. Contrairement aux valeurs SGR classiques ci-dessus, les valeurs étendues consomment des paramètres supplémentaires après l’indicateur initial, conformément au tableau ci-dessous.

Sous-séquence SGR Description
38 ; 2 ; <r> ; <g> ; <b> Définir la couleur de premier plan sur la valeur RVB spécifiée dans les paramètres* <r>, <g>, <b>
48 ; 2 ; <r> ; <g> ; <b> Définir la couleur d’arrière-plan sur la valeur RVB spécifiée dans les paramètres* <r>, <g>, <b>
38 ; 5 ; <s> Définir la couleur de premier plan sur l’index <s> dans la table de 88 ou 256 couleurs*
48 ; 5 ; <s> Définir la couleur d’arrière-plan sur l’index <s> dans la table de 88 ou 256 couleurs*

*Les palettes de 88 et 256 couleurs gérées en interne pour la comparaison sont basées sur l’émulateur de terminal xterm. Les tables de comparaison et d’arrondi ne peuvent pas être modifiées pour l’instant.

Couleurs d’écran

La commande suivante permet à l’application de définir les valeurs de la palette de couleurs d’écran sur n’importe quelle valeur RVB.

Les valeurs RVB doivent être des valeurs hexadécimales comprises entre 0 et ff séparées par le caractère barre oblique (par exemple, rgb:1/24/86).

Notez que cette séquence est une séquence OSC (Operating System Command, commande de système d’exploitation), et non une séquence CSI telle que la plupart des autres séquences listées. Ainsi, elle commence par « \x1b] », et non pas par « \x1b[ ». Comme les séquences OSC, elles finissent par un terminateur de chaîne representé par <ST> et transmis avec ESC \ (0x1B 0x5C). BEL (0x7) peut être utilisé à la place comme terminateur, mais la forme la plus longue est préférée.

Séquence Description Comportement
ESC ] 4 ; <i> ; rgb : <r> / <g> / <b><ST> Modifier les couleurs d’écran Définit l’index <i> de la palette de couleurs d’écran sur les valeurs RVB spécifiées dans <r>, <g>, <b>

Changements de mode

Il s’agit de séquences qui contrôlent les modes d’entrée. Il existe deux ensembles différents de modes d’entrée : le mode touches de direction et le mode touches du pavé numérique. Le mode touches de direction contrôle les séquences émises par les touches de direction, Début et Fin, tandis que le mode touches du pavé numérique contrôle les séquences émises par les touches du pavé numérique, essentiellement, ainsi que par les touches de fonction.

Chacun de ces modes est constitué de paramètres booléens simples : le mode touches de direction est Normal (valeur par défaut) ou Application, tandis que le mode touches du pavé numérique est soit Numérique (valeur par défaut), soit Application.

Consultez les sections Touches de direction et Touches de fonction et pavé numérique pour connaître les séquences émises dans ces modes.

Séquence Code Description Comportement
ESC = DECKPAM Activer le mode Application du pavé numérique Les touches du pavé numérique émettent leurs séquences en mode Application.
ESC > DECKPNM Activer le mode Numérique du pavé numérique Les touches du pavé numérique émettent leurs séquences en mode Numérique.
ESC [ ? 1 h DECCKM Activer le mode Application de touches de direction Les touches du pavé numérique émettent leurs séquences en mode Application.
ESC [ ? 1 l DECCKM Désactiver le mode Application de touches de direction (utiliser le mode Normal) Les touches du pavé numérique émettent leurs séquences en mode Numérique.

État de requête

Toutes les commandes de cette section équivalent généralement à appeler* les API consoles pour récupérer les informations sur l’état actuel de la mémoire tampon de la console.

Remarque

Ces requêtes émettent leurs réponses dans le flux d’entrée de la console immédiatement après avoir été reconnues sur le flux de sortie si l’indicateur ENABLE_VIRTUAL_TERMINAL_PROCESSING est défini. L’indicateur ENABLE_VIRTUAL_TERMINAL_INPUT ne s’applique pas aux commandes de requête, car il est supposé qu’une application qui effectue la requête doit toujours recevoir la réponse.

Séquence Code Description Comportement
ESC [ 6 n DECXCPR Signaler la position du curseur Émettre la position du curseur comme suit : ESC [ <r> ; <c> R Où <r> = ligne de curseur and <c> = colonne de curseur
ESC [ 0 c DA Attributs de l’appareil Signaler l’identité du terminal. Émet « \x1b[?1;0c », en indiquant « VT101 with No Options » (VT101 sans options).

Tabulations

Alors que la console Windows s’attend traditionnellement à ce que les tabulations aient exclusivement une largeur de huit caractères, les applications *nix utilisant certaines séquences peuvent manipuler la position des taquets de tabulation dans les fenêtres de console pour optimiser le déplacement du curseur par l’application.

Les séquences suivantes permettent à une application de définir les positions des taquets de tabulation dans la fenêtre de console, de supprimer ces derniers et de passer de l’un à l’autre.

Séquence Code Description Comportement
ESC H HTS Définir une tabulation horizontale Définit un taquet de tabulation au niveau de la colonne à laquelle se trouve actuellement le curseur.
ESC [ <n> I CHT Déplacer le curseur vers un taquet de tabulation horizontale (vers l’avant) Avance le curseur jusqu’à la colonne suivante (sur la même ligne) ayant un taquet de tabulation. S’il n’y a plus de taquets de tabulation, passe à la dernière colonne de la ligne. Si le curseur se trouve à la dernière colonne, passe à la première colonne de la ligne suivante.
ESC [ <n> Z CBT Déplacer le curseur vers un taquet de tabulation vers l’arrière Déplace le curseur jusqu’à la colonne précédente (sur la même ligne) ayant un taquet de tabulation. S’il n’y a plus de taquets de tabulation, déplace le curseur jusqu’à la première colonne. Si le curseur se trouve à la première colonne, ne déplace pas le curseur.
ESC [ 0 g À confirmer Effacer un taquet de tabulation (colonne actuelle) Efface le taquet de tabulation à la colonne actuelle, s’il en existe un. Sinon, ne fait rien.
ESC [ 3 g À confirmer Effacer les taquets de tabulation (toutes les colonnes) Efface tous les taquets de tabulation actuellement définis.
  • Pour CHT et CBT, <n> est un paramètre facultatif (valeur par défaut = 1) qui indique combien de fois il faut avancer le curseur dans la direction spécifiée.
  • Si aucun taquet de tabulation n’est défini par le biais de HTS, CHT et CBT traitent les première et dernière colonnes de la fenêtre comme étant les deux seuls taquets de tabulation.
  • En outre, quand HTS est utilisé pour définir un taquet de tabulation, la console accède au taquet de tabulation suivant sur la sortie d’un caractère de tabulation (0x09, « t »), de la même manière que CHT.

Désigner le jeu de caractères

Les séquences suivantes permettent à un programme de changer le mappage du jeu de caractères actif. Ainsi, un programme peut émettre des caractères ASCII de 7 bits, mais les faire s’afficher sous la forme d’autres glyphes sur l’écran de terminal lui-même. Les deux seuls jeux de caractères pris en charge sont ASCII (par défaut) et le jeu de caractères DEC Special Graphics. Consultez http://vt100.net/docs/vt220-rm/table2-4.html pour obtenir la liste de tous les caractères représentés par le jeu de caractères DEC Special Graphics.

Séquence Description Comportement
ESC ( 0 Désigner le jeu de caractères – Dessin de ligne DEC Active le mode de dessin de la ligne DEC
ESC ( B Désigner le jeu de caractères – ASCII des États-Unis Active le mode ASCII (par défaut)

En particulier, le mode de dessin de ligne DEC est utilisé pour dessiner les bordures dans les applications de console. Le tableau suivant indique les correspondances entre les caractères ASCII et les caractères de dessin de ligne.

Hex ASCII Dessin de ligne DEC
0x6a j
0x6b k
0x6c l
0x6d m
0x6e n
0x71 q
0x74 t
0x75 u
0x76 v
0x77 w
0x78 x

Marges de défilement

Les séquences suivantes permettent à un programme de configurer la « zone de défilement » de l’écran qui est affectée par les opérations de défilement. Il s’agit d’un sous-ensemble des lignes qui sont ajustées en cas de défilement de l’écran, par exemple, sur une commande « n » ou RI. Ces marges affectent également les lignes modifiées par les commandes d’insertion de ligne (IL), de suppression de ligne (DL), de défilement vers le haut (SU) et de défilement vers le bas (SD).

Les marges de défilement peuvent être particulièrement utiles pour disposer d’une partie de l’écran qui ne défile pas quand le reste de l’écran est rempli, par exemple une barre de titre en haut ou une barre d’état en bas de votre application.

Pour DECSTBM, il existe deux paramètres facultatifs, <t> et <b>, qui servent à spécifier les lignes qui représentent les lignes supérieure et inférieure de la zone de défilement, celles-ci incluses. Si les paramètres sont omis, <t> a la valeur par défaut 1 et <b> est défini par défaut sur la hauteur de la fenêtre d’affichage actuelle.

Les marges de défilement sont définies par mémoire tampon. Il est donc important que la mémoire tampon secondaire et la mémoire tampon principale aient constamment des paramètres de marges de défilement distincts (afin qu’une application en plein écran dans la mémoire tampon secondaire n’altère pas les marges de la mémoire tampon principale).

Séquence Code Description Comportement
ESC [ <t> ; <b> r DECSTBM Définir la zone de défilement Définit les marges de défilement des tabulations verticales de la fenêtre d’affichage.

Titre de fenêtre

Les commandes suivantes permettent à l’application de définir le titre de la fenêtre de console sur le paramètre <chaîne> donné. La chaîne doit contenir moins de 255 caractères pour être acceptée. Cela équivaut à appeler SetConsoleTitle avec la chaîne donnée.

Notez que ces séquences sont des séquences OSC, et non des séquence CSI telles que la plupart des autres séquences listées. Ainsi, elle commence par « x1b », et non pas par « x1b ». Comme les séquences OSC, elles finissent par un terminateur de chaîne representé par <ST> et transmis avec ESC \ (0x1B 0x5C). BEL (0x7) peut être utilisé à la place comme terminateur, mais la forme la plus longue est préférée.

Séquence Description Comportement
ESC ] 0 ; <string><ST> Définir le titre de la fenêtre Définit le titre de la fenêtre de console sur <chaîne>.
ESC ] 2 ; <chaîne><ST> Définir le titre de la fenêtre Définit le titre de la fenêtre de console sur <chaîne>.

En l’occurrence, le caractère de fin est le caractère « sonnerie », « x07 »

Mémoire tampon d’écran secondaire

Les applications de style *nix utilisent souvent une mémoire tampon d’écran secondaire, afin de pouvoir modifier l’ensemble du contenu de la mémoire tampon, sans affecter l’application qui les a démarrées. La mémoire tampon secondaire épouse les dimensions de la fenêtre, sans aucune zone de défilement.

À titre d’exemple de ce comportement, pensez à la façon dont vim est lancé à partir de bash. Vim utilise l’intégralité de l’écran pour modifier le fichier, puis le retour à bash laisse la mémoire tampon d’origine inchangée.

Séquence Description Comportement
ESC [ ? 1 0 4 9 h Utiliser une mémoire tampon d’écran secondaire Bascule vers une nouvelle mémoire tampon d’écran secondaire.
ESC [ ? 1 0 4 9 l Utiliser la mémoire tampon d’écran principale Bascule vers la mémoire tampon principale.

Largeur de la fenêtre

Les séquences suivantes peuvent être utilisées pour contrôler la largeur de la fenêtre de console. Elles équivalent plus ou moins à appeler l’API console SetConsoleScreenBufferInfoEx pour définir la largeur de la fenêtre.

Séquence Code Description Comportement
ESC [ ? 3 h DECCOLM Définir le nombre de colonnes sur 132 Définit la largeur de la console sur une largeur de 132 colonnes.
ESC [ ? 3 l DECCOLM Définir le nombre de colonnes sur 80 Définit la largeur de la console sur une largeur de 80 colonnes.

Réinitialisation à chaud

La séquence suivante peut être utilisée pour réinitialiser certaines propriétés à leurs valeurs par défaut. Les propriétés suivantes sont réinitialisées aux valeurs par défaut indiquées (les séquences qui contrôlent ces propriétés sont également listées) :

  • Visibilité du curseur : visible (DECTEM)
  • Pavé numérique : Mode numérique (DECNKM)
  • Mode touche de direction : Mode normal (DECCKM)
  • Marges supérieures et inférieures : Haut=1, Bas=Hauteur de console (DECSTBM)
  • Jeu de caractères : US ASCII
  • Rendu graphique : Défaut/Off (SGR)
  • Enregistrer l’état du curseur : Position d’accueil (0,0) (DECSC)
Séquence Code Description Comportement
ESC [ ! p DECSTR Réinitialisation à chaud Réinitialiser certains paramètres de terminal à leurs valeurs par défaut.

Séquences d’entrée

Les séquences de terminal suivantes sont émises par l’hôte de la console sur le flux d’entrée si l’indicateur ENABLE_VIRTUAL_TERMINAL_INPUT est défini sur le descripteur de mémoire tampon d’entrée à l’aide de l’indicateur SetConsoleMode.

Il existe deux modes internes qui déterminent les séquences émises pour les touches d’entrée données : le mode touches de direction et le mode touches du pavé numérique. Ces modes sont décrits dans la section Changements de mode.

Touches de direction

Clé Mode Normal Mode Application
Haut ESC [ A ESC O A
Flèche bas ESC [ B ESC O B
Droite ESC [ C ESC O C
Gauche ESC [ D ESC O D
Accueil ESC [ H ESC O H
End ESC [ F ESC O F

En outre, si la touche CTRL est enfoncée avec l’une de ces touches, les séquences suivantes sont émises à la place, indépendamment du mode touches de direction :

Clé N’importe quel mode
Ctrl + flèche haut ESC [ 1 ; 5 A
Ctrl + flèche bas ESC [ 1 ; 5 B
Ctrl + flèche droite ESC [ 1 ; 5 C
Ctrl + flèche gauche ESC [ 1 ; 5 D

Touches de fonction et pavé numérique

Clé Séquence
Retour arrière 0x7f (DEL)
Pause 0x1a (SUB)
Caractère d'échappement 0x1b (ESC)
Insérer ESC [ 2 ~
Supprimer ESC [ 3 ~
Page précédente ESC [ 5 ~
Page suivante ESC [ 6 ~
F1 ESC O P
F2 ESC O Q
F3 ESC O R
F4 ESC O S
F5 ESC [ 1 5 ~
F6 ESC [ 1 7 ~
F7 ESC [ 1 8 ~
F8 ESC [ 1 9 ~
F9 ESC [ 2 0 ~
F10 ESC [ 2 1 ~
F11 ESC [ 2 3 ~
F12 ESC [ 2 4 ~

Modificateurs

Alt est traitée en préfixant la séquence avec une séquence d’échappement : ESC <c où <c>> est le caractère transmis par le système d’exploitation. La séquence Alt+Ctrl est gérée de la même façon, à la différence que le système d’exploitation aura préalablement décalé la touche <c> vers le caractère de contrôle approprié qui sera relayé à l’application.

La touche Ctrl est généralement transmise telle qu’elle est reçue du système. Il s’agit généralement d’un caractère unique baissé dans l’espace réservé de caractères de contrôle (0x0-0x1f). Par exemple, Ctrl+@ (0x40) devient NUL (0x00), Ctrl+[ (0x5b) devient ESC (0x1b), etc. Quelques combinaisons de touches Ctrl sont traitées spécialement selon le tableau suivant :

Clé Séquence
Ctrl + espace 0x00 (NUL)
Ctrl + flèche haut ESC [ 1 ; 5 A
Ctrl + flèche bas ESC [ 1 ; 5 B
Ctrl + flèche droite ESC [ 1 ; 5 C
Ctrl + flèche gauche ESC [ 1 ; 5 D

Remarque

Ctrl gauche + Alt droite est traité comme AltGr. Quand ils apparaissent ensemble, ils sont supprimés et la valeur Unicode du caractère présenté par le système est transmise à la cible. Le système pré-convertit les valeurs AltGr en fonction des paramètres d’entrée système actuels.

Exemples

Exemple de séquences de terminal SGR

Le code suivant fournit plusieurs exemples de mise en forme de texte.

#include <stdio.h>
#include <wchar.h>
#include <windows.h>

int main()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return GetLastError();
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return GetLastError();
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return GetLastError();
    }

    // Try some Set Graphics Rendition (SGR) terminal escape sequences
    wprintf(L"\x1b[31mThis text has a red foreground using SGR.31.\r\n");
    wprintf(L"\x1b[1mThis text has a bright (bold) red foreground using SGR.1 to affect the previous color setting.\r\n");
    wprintf(L"\x1b[mThis text has returned to default colors using SGR.0 implicitly.\r\n");
    wprintf(L"\x1b[34;46mThis text shows the foreground and background change at the same time.\r\n");
    wprintf(L"\x1b[0mThis text has returned to default colors using SGR.0 explicitly.\r\n");
    wprintf(L"\x1b[31;32;33;34;35;36;101;102;103;104;105;106;107mThis text attempts to apply many colors in the same command. Note the colors are applied from left to right so only the right-most option of foreground cyan (SGR.36) and background bright white (SGR.107) is effective.\r\n");
    wprintf(L"\x1b[39mThis text has restored the foreground color only.\r\n");
    wprintf(L"\x1b[49mThis text has restored the background color only.\r\n");

    return 0;
}

Remarque

Dans l’exemple précédent, la chaîne « \x1b[31m » correspond à l’implémentation de ESC [ <n> m où <n> a pour valeur 31.

Le graphique suivant montre la sortie de l’exemple de code précédent.

output of the console using the sgr command

Exemple d’activation de traitement de terminal virtuel

Le code suivant fournit un exemple de la méthode recommandée pour activer le traitement de terminal virtuel pour une application. L’exemple vise à illustrer les points suivants :

  1. Le mode existant doit toujours être récupéré par le biais de GetConsoleMode et analysé avant d’être défini avec SetConsoleMode.

  2. Le fait de vérifier si la fonction SetConsoleMode renvoie 0 et la fonction GetLastError renvoie ERROR_INVALID_PARAMETER est le mécanisme actuel pour déterminer si l’exécution a lieu sur un système de niveau inférieur. Une application qui reçoit ERROR_INVALID_PARAMETER avec l’un des nouveaux indicateurs de mode de console dans le champ de bit doit progressivement dégrader le comportement, puis réessayer.

#include <stdio.h>
#include <wchar.h>
#include <windows.h>

int main()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
    if (hIn == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwOriginalOutMode = 0;
    DWORD dwOriginalInMode = 0;
    if (!GetConsoleMode(hOut, &dwOriginalOutMode))
    {
        return false;
    }
    if (!GetConsoleMode(hIn, &dwOriginalInMode))
    {
        return false;
    }

    DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
    DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;

    DWORD dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
    if (!SetConsoleMode(hOut, dwOutMode))
    {
        // we failed to set both modes, try to step down mode gracefully.
        dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
        dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
        if (!SetConsoleMode(hOut, dwOutMode))
        {
            // Failed to set any VT mode, can't do anything here.
            return -1;
        }
    }

    DWORD dwInMode = dwOriginalInMode | dwRequestedInModes;
    if (!SetConsoleMode(hIn, dwInMode))
    {
        // Failed to set VT input mode, can't do anything here.
        return -1;
    }

    return 0;
}

Exemple de certaines fonctionnalités de mise à jour anniversaire

L’exemple suivant se veut un exemple plus robuste de code utilisant une variété de séquences d’échappement pour manipuler la mémoire tampon et met l’accent sur les fonctionnalités ajoutées dans la mise à jour anniversaire pour Windows 10.

Cet exemple utilise la mémoire tampon d’écran secondaire et illustre la manipulation des taquets de tabulation, la définition des marges de défilement et le changement du jeu de caractères.

// System headers
#include <windows.h>

// Standard library C-style
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>

#define ESC "\x1b"
#define CSI "\x1b["

bool EnableVTMode()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return false;
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return false;
    }
    return true;
}

void PrintVerticalBorder()
{
    printf(ESC "(0"); // Enter Line drawing mode
    printf(CSI "104;93m"); // bright yellow on bright blue
    printf("x"); // in line drawing mode, \x78 -> \u2502 "Vertical Bar"
    printf(CSI "0m"); // restore color
    printf(ESC "(B"); // exit line drawing mode
}

void PrintHorizontalBorder(COORD const Size, bool fIsTop)
{
    printf(ESC "(0"); // Enter Line drawing mode
    printf(CSI "104;93m"); // Make the border bright yellow on bright blue
    printf(fIsTop ? "l" : "m"); // print left corner 

    for (int i = 1; i < Size.X - 1; i++)
        printf("q"); // in line drawing mode, \x71 -> \u2500 "HORIZONTAL SCAN LINE-5"

    printf(fIsTop ? "k" : "j"); // print right corner
    printf(CSI "0m");
    printf(ESC "(B"); // exit line drawing mode
}

void PrintStatusLine(const char* const pszMessage, COORD const Size)
{
    printf(CSI "%d;1H", Size.Y);
    printf(CSI "K"); // clear the line
    printf(pszMessage);
}

int __cdecl wmain(int argc, WCHAR* argv[])
{
    argc; // unused
    argv; // unused
    //First, enable VT mode
    bool fSuccess = EnableVTMode();
    if (!fSuccess)
    {
        printf("Unable to enter VT processing mode. Quitting.\n");
        return -1;
    }
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        printf("Couldn't get the console handle. Quitting.\n");
        return -1;
    }

    CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo;
    GetConsoleScreenBufferInfo(hOut, &ScreenBufferInfo);
    COORD Size;
    Size.X = ScreenBufferInfo.srWindow.Right - ScreenBufferInfo.srWindow.Left + 1;
    Size.Y = ScreenBufferInfo.srWindow.Bottom - ScreenBufferInfo.srWindow.Top + 1;

    // Enter the alternate buffer
    printf(CSI "?1049h");

    // Clear screen, tab stops, set, stop at columns 16, 32
    printf(CSI "1;1H");
    printf(CSI "2J"); // Clear screen

    int iNumTabStops = 4; // (0, 20, 40, width)
    printf(CSI "3g"); // clear all tab stops
    printf(CSI "1;20H"); // Move to column 20
    printf(ESC "H"); // set a tab stop

    printf(CSI "1;40H"); // Move to column 40
    printf(ESC "H"); // set a tab stop

    // Set scrolling margins to 3, h-2
    printf(CSI "3;%dr", Size.Y - 2);
    int iNumLines = Size.Y - 4;

    printf(CSI "1;1H");
    printf(CSI "102;30m");
    printf("Windows 10 Anniversary Update - VT Example");
    printf(CSI "0m");

    // Print a top border - Yellow
    printf(CSI "2;1H");
    PrintHorizontalBorder(Size, true);

    // // Print a bottom border
    printf(CSI "%d;1H", Size.Y - 1);
    PrintHorizontalBorder(Size, false);

    wchar_t wch;

    // draw columns
    printf(CSI "3;1H");
    int line = 0;
    for (line = 0; line < iNumLines * iNumTabStops; line++)
    {
        PrintVerticalBorder();
        if (line + 1 != iNumLines * iNumTabStops) // don't advance to next line if this is the last line
            printf("\t"); // advance to next tab stop

    }

    PrintStatusLine("Press any key to see text printed between tab stops.", Size);
    wch = _getwch();

    // Fill columns with output
    printf(CSI "3;1H");
    for (line = 0; line < iNumLines; line++)
    {
        int tab = 0;
        for (tab = 0; tab < iNumTabStops - 1; tab++)
        {
            PrintVerticalBorder();
            printf("line=%d", line);
            printf("\t"); // advance to next tab stop
        }
        PrintVerticalBorder();// print border at right side
        if (line + 1 != iNumLines)
            printf("\t"); // advance to next tab stop, (on the next line)
    }

    PrintStatusLine("Press any key to demonstrate scroll margins", Size);
    wch = _getwch();

    printf(CSI "3;1H");
    for (line = 0; line < iNumLines * 2; line++)
    {
        printf(CSI "K"); // clear the line
        int tab = 0;
        for (tab = 0; tab < iNumTabStops - 1; tab++)
        {
            PrintVerticalBorder();
            printf("line=%d", line);
            printf("\t"); // advance to next tab stop
        }
        PrintVerticalBorder(); // print border at right side
        if (line + 1 != iNumLines * 2)
        {
            printf("\n"); //Advance to next line. If we're at the bottom of the margins, the text will scroll.
            printf("\r"); //return to first col in buffer
        }
    }

    PrintStatusLine("Press any key to exit", Size);
    wch = _getwch();

    // Exit the alternate buffer
    printf(CSI "?1049l");

}