Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les séquences de terminal virtuel 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 lorsqu’elles sont écrites 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 utilisateur lorsque le mode approprié est défini.
Vous pouvez utiliser les fonctions GetConsoleMode et SetConsoleMode pour configurer ce comportement. Un exemple de la méthode suggérée pour activer les comportements de terminal virtuel est inclus à la fin de ce document.
Le comportement des séquences suivantes est basé sur les technologies de l’émulateur de terminal VT100 et dérivées, plus précisément l’émulateur de terminal xterm. Pour plus d’informations sur les séquences de terminal, consultez et à l’adresse http://vt100.nethttp://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 console lorsqu’elles sont écrites dans le flux de sortie, si l’indicateur ENABLE_VIRTUAL_TERMINAL_PROCESSING est défini sur le handle de mémoire tampon d’écran à l’aide de la fonction SetConsoleMode . Notez que l’indicateur de DISABLE_NEWLINE_AUTO_RETURN peut également être utile pour simuler le positionnement du curseur et le comportement de défilement d’autres émulateurs de terminal par rapport aux caractères écrits dans la colonne finale de n’importe quelle ligne.
Positionnement de curseur simple
Dans toutes les descriptions suivantes, esc est toujours la valeur hexadécimale 0x1B. Aucun espace ne doit être inclus dans les séquences de terminal. Les séquences de terminal individuelles peuvent être fractionnées, à n’importe quelle position de caractère ou d’octet, sur plusieurs appels séquentiels à WriteFile ou WriteConsole , mais il est recommandé d’inclure l’ensemble de la séquence dans un seul appel. Pour obtenir un exemple de la façon dont ces séquences sont utilisées dans la pratique, consultez l’exemple à la fin de cette rubrique.
Le tableau suivant décrit des séquences d’échappement simples avec une seule commande d’action directement après le caractère ÉCHAP. Ces séquences n’ont aucun paramètre et prennent effet immédiatement.
Toutes les commandes de cette table sont généralement équivalentes à l’appel de l’API de 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 (s’il est disponible) ne se produit pas.
| Séquence | Sténographie | Comportement |
|---|---|---|
| ÉCHAP M | RI | Index inverse : effectue l’opération inverse de \n, déplace le curseur vers le haut d’une ligne, conserve la position horizontale, fait défiler la mémoire tampon si nécessaire* |
| ÉCHAP 7 | DECSC | Enregistrer la position du curseur en mémoire** |
| ÉCHAP 8 | DECSR | Restaurer la position du curseur à partir de la mémoire** |
Remarque
* S’il existe des marges de défilement définies, l’instance 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 première utilisation de la commande save n’est pas enregistrée. La seule façon d’accéder à la valeur enregistrée est avec la commande restore.
Positionnement du curseur
Les tableaux suivants englobent les séquences de type CSI (Control Sequence Introducer). Toutes les séquences CSI commencent par ESC (0x1B) suivie de [ (crochet gauche, 0x5B) et peuvent contenir des paramètres de longueur variable pour spécifier plus d’informations pour chaque opération. Cela sera représenté par le raccourci <n>. Chaque tableau ci-dessous est regroupé par fonctionnalité avec des notes ci-dessous pour expliquer le fonctionnement du groupe.
Pour tous les paramètres, les règles suivantes s’appliquent, sauf indication contraire :
- <n> représente la distance à déplacer et est un paramètre facultatif
- Si <n> est omis ou égal à 0, il sera 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 sont généralement équivalentes à l’appel de 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 (s’il est disponible) ne se produit pas.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| Échap [ <n> A | CUU | Curseur vers le haut | Curseur vers le haut par <n> |
| ÉCHAP [ <n> B | CUD | Curseur vers le bas | Curseur vers le bas par <n> |
| ESC [ <n> C | CUF | Curseur vers l’avant | Curseur vers l’avant (droite) par <n> |
| Échap [ <n> D | LOUVETEAU | Curseur vers l’arrière | Curseur vers l’arrière (gauche) par <n> |
| ÉCHAP [ <n> E | CNL | Ligne suivante du curseur | Curseur vers le bas <n> lignes de la position actuelle |
| ÉCHAP [ <n> F | CPL | Ligne précédente du curseur | Curseur vers le haut <n> lignes à partir de la position actuelle |
| Échap [ <n> G | CHA | Curseur horizontal absolu | Le curseur se déplace vers <la nième>position horizontalement dans la ligne actuelle |
| ÉCHAP [ <n> d | VPA | Position verticale absolue de la ligne | Le curseur se déplace vers la <nième>position verticalement dans la colonne actuelle |
| ESC [ <y> ; <x> H | COUPE | Position du curseur | *Le curseur passe à <x> ; <coordonnée y> dans la fenêtre d’affichage, où <x> est la colonne de la <ligne y> |
| ESC [ <y> ; <x> f | HVP | Position verticale horizontale | *Le curseur passe à <x> ; <coordonnée y> dans la fenêtre d’affichage, où <x> est la colonne de la <ligne y> |
| ÉCHAP [ s | ANSISYSSC | Enregistrer le curseur – émulation Ansi.sys | **Sans paramètre, effectue une opération de curseur d’enregistrement comme DECSC |
| Échap [ u | ANSISYSRC | Curseur de restauration : émulation Ansi.sys | **Sans paramètre, effectue une opération de curseur de restauration comme DECRC |
Remarque
*les< paramètres x> et <y> ont les mêmes limitations que <n> ci-dessus. Si <x> et <y> sont omis, ils sont définis sur 1;1.
**ANSI.sys documentation historique est disponible https://msdn.microsoft.com/library/cc722862.aspx et est implémentée à des fins de commodité/compatibilité.
Visibilité du curseur
Les commandes suivantes contrôlent la visibilité du curseur et son état de clignotement. Les séquences DECTCEM sont généralement équivalentes à l’appel de l’API de console SetConsoleCursorInfo pour activer la visibilité du curseur.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ESC [ ? 12 h | ATT160 | Curseur de texte Activer le clignotement | Démarrer le curseur clignote |
| ESC [ ? 12 l | ATT160 | Curseur de texte Désactiver le clignotement | Arrêter de clignoter le curseur |
| ESC [ ? 25 h | DECTCEM | Afficher le mode d’activation du curseur de texte | Afficher le curseur |
| ESC [ ? 25 l | DECTCEM | Masquer le mode d’activation du curseur de texte | Masquer le curseur |
Conseil / Astuce
Les séquences d’activation se terminent par un caractère H minuscule (h) et la fin de la désactivation des séquences dans un caractère L minuscule (l).
Forme du curseur
Les commandes suivantes contrôlent et autorisent la personnalisation de la forme du curseur.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ÉCHAP [ 0 SP q | DECSCUSR | Forme utilisateur | Forme de curseur par défaut configurée par l’utilisateur |
| ÉCHAP [ 1 SP q | DECSCUSR | Bloc de clignotement | Forme de curseur de bloc de clignotement |
| ÉCHAP [ 2 SP q | DECSCUSR | Bloc stable | Forme de curseur de bloc stable |
| ÉCHAP [ 3 SP q | DECSCUSR | Soulignement de clignotement | Forme de curseur de soulignement de clignotement |
| ÉCHAP [ 4 SP q | DECSCUSR | Trait de soulignement stable | Forme de curseur de soulignement stable |
| Échap [ 5 SP q | DECSCUSR | Barre de clignotement | Forme de curseur de barre de clignotement |
| ÉCHAP [ 6 SP q | DECSCUSR | Barre stable | Forme de curseur de barre stable |
Remarque
SP est un caractère d’espace littéral (0x20) à la position intermédiaire, suivi de q (0x71) à la position finale.
Positionnement de la fenêtre d’affichage
Toutes les commandes de cette section sont généralement équivalentes à l’appel de l’API de console ScrollConsoleScreenBuffer pour déplacer le contenu de la mémoire tampon de la console.
Prudence Les noms de commandes sont trompeurs. Le défilement fait référence à la direction dans laquelle le texte se déplace pendant l’opération, et non à quel point la fenêtre d’affichage semble se déplacer.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ESC [ <n> S | SU | Faire défiler vers le haut | Faites défiler le texte vers le haut par <n>. Également connu sous le nom de panoramique, de nouvelles lignes remplissent à partir du bas de l’écran |
| ÉCHAP [ <n> T | SD | Faites défiler vers le bas | Faites défiler vers le bas par <n>. Également appelé panoramique, de nouvelles lignes se remplissent en haut de l’écran |
Le texte est déplacé à partir de la ligne sur laquelle le curseur est activé. Si le curseur se trouve sur la ligne centrale de la fenêtre d’affichage, faites défiler vers le haut la moitié inférieure de la fenêtre d’affichage et insérez des lignes vides en bas. Faites défiler vers le bas la moitié supérieure des lignes de la fenêtre d’affichage et insérez de nouvelles lignes en haut.
Il est également important de noter que le défilement vers le haut et le bas sont également affectés par les marges de défilement. Faire défiler vers le haut et le bas n’affecte aucune ligne en dehors des marges de défilement.
La valeur par défaut de <n> est 1 et la valeur peut éventuellement être omise.
Modification de texte
Toutes les commandes de cette section sont généralement équivalentes à l’appel des API de console FillConsoleOutputCharacter, FillConsoleOutputAttribute et ScrollConsoleScreenBuffer pour modifier le contenu de la mémoire tampon de texte.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ÉCHAP [ <n> @ | ICH | Insérer un caractère | Insérez <n> espaces à la position actuelle du curseur, en déplaçant tout le texte existant vers la droite. Le texte sortant de l’écran à droite est supprimé. |
| Échap [ <n> P | MPC | Supprimer le caractère | Supprimez <n> caractères à la position actuelle du curseur, en déplaçant les caractères d’espace du bord droit de l’écran. |
| Échap [ <n> X | ECH | Effacer le caractère | Effacez <n> caractères de la position actuelle du curseur en les remplaçant par un espace. |
| ÉCHAP [ <n> L | IL | Insérer une ligne | Insère <n> lignes dans la mémoire tampon à la position du curseur. La ligne sur laquelle se trouve le curseur, et les lignes situées en dessous, seront décalées vers le bas. |
| Échap [ <n> M | DL | Supprimer la ligne | <Supprime n> lignes de la mémoire tampon, en commençant par la ligne sur laquelle le curseur est activé. |
Remarque
Pour il et DL, seules les lignes des 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 les lignes sont décalées sous les marges, elles sont ignorées. Lorsque des lignes sont supprimées, les lignes vides sont insérées au bas des marges, les lignes de l’extérieur de la fenêtre d’affichage ne sont jamais affectées.
Pour chacune des séquences, la valeur par défaut pour <n> si elle est omise est 0.
Pour les commandes suivantes, le paramètre <n> a 3 valeurs valides :
- 0 efface de la position actuelle du curseur (inclus) à la fin de la ligne/de l’affichage
- 1 efface le début de la ligne/de l’affichage jusqu’à la position actuelle du curseur
- 2 efface toute la ligne/l’affichage
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ESC [ <n> J | ED | Effacer dans l’affichage | Remplacez tout le texte dans la fenêtre d’affichage/écran actuelle spécifiée par <n> par des caractères d’espace |
| ÉCHAP [ <n> K | EL | Effacer en ligne | Remplacez tout le texte sur la ligne par le curseur spécifié par <n> par des caractères d’espace |
Mise en forme du texte
Toutes les commandes de cette section sont généralement équivalentes à l’appel des API de console SetConsoleTextAttribute pour ajuster la mise en forme de toutes les futures écritures 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.
Lorsqu’aucun paramètre n’est spécifié, il est traité comme un seul paramètre 0.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ÉCHAP [ <n> m | SGR | Définir le rendu graphique | Définir le format de l’écran et du texte comme 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 sont appliqués de gauche à droite. L’application d’options de mise en forme concurrentes entraîne la priorité de l’option la plus appropriée.
Pour les options qui spécifient des couleurs, les couleurs seront utilisées comme définies 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 pour faire en sorte que la position « bleue » dans le tableau affiche une nuance RVB de rouge, tous les appels au bleu de premier plan affichent cette couleur rouge jusqu’à ce qu’elles ne changent pas.
| Valeur | Descriptif | Comportement |
|---|---|---|
| 0 | Par défaut | Retourne tous les attributs à l’état par défaut avant la modification |
| 1 | Gras/Lumineux | Applique l’indicateur de luminosité/intensité à la couleur de premier plan |
| 22 | Pas de gras/lumineux | Supprime l’indicateur de luminosité/intensité de la couleur de premier plan |
| 4 | Souligner | Ajoute un soulignement |
| Vingt-quatre | Aucun trait de soulignement | Supprime le soulignement |
| 7 | Négatif | Échange les couleurs de premier plan et d’arrière-plan |
| 27 | Positif (pas négatif) | Retourne le premier plan/arrière-plan à normal |
| 30 | Noir de premier plan | Applique le noir non gras/lumineux au premier plan |
| 31 | Rouge de premier plan | Applique le rouge non gras/lumineux au premier plan |
| 32 | Vert de premier plan | Applique un vert non gras/lumineux au premier plan |
| 33 | Jaune de premier plan | Applique le jaune non gras/lumineux au premier plan |
| 34 | Bleu de premier plan | Applique le bleu non gras/lumineux au premier plan |
| 35 | Magenta de premier plan | Applique un magenta non gras/lumineux au premier plan |
| 36 | Cyan de premier plan | Applique le cyan non gras/lumineux au premier plan |
| 37 | Blanc de premier plan | Applique le blanc non gras/lumineux au premier plan |
| 38 | Premier plan étendu | Applique la valeur de couleur étendue au premier plan (voir les détails ci-dessous) |
| 39 | Valeur par défaut du premier plan | Applique uniquement la partie de premier plan des valeurs par défaut (voir 0) |
| 40 | Arrière-plan noir | Applique le noir non gras/lumineux à l’arrière-plan |
| 41 | Rouge d’arrière-plan | Applique le rouge non gras/lumineux à l’arrière-plan |
| 42 | Vert d’arrière-plan | Applique un vert non gras/lumineux à l’arrière-plan |
| 43 | Jaune d’arrière-plan | Applique le jaune non gras/lumineux à l’arrière-plan |
| 44 | Bleu d’arrière-plan | Applique le bleu non gras/lumineux à l’arrière-plan |
| 45 | Arrière-plan Magenta | Applique un magenta non gras/lumineux à l’arrière-plan |
| 46 | Cyan d’arrière-plan | Applique le cyan non gras/lumineux à l’arrière-plan |
| 47 | Blanc d’arrière-plan | Applique le blanc non gras/lumineux à l’arrière-plan |
| 48 | Arrière-plan étendu | Applique la valeur de couleur étendue à l’arrière-plan (voir les détails ci-dessous) |
| 49 | Arrière-plan par défaut | Applique uniquement la partie en arrière-plan des valeurs par défaut (voir 0) |
| 90 | Noir de premier plan lumineux | Applique le noir gras/lumineux au premier plan |
| 91 | Rouge de premier plan lumineux | Applique le rouge gras/lumineux au premier plan |
| 92 | Vert de premier plan lumineux | Applique le vert gras/lumineux au premier plan |
| 93 | Jaune de premier plan lumineux | Applique le jaune gras/lumineux au premier plan |
| 94 | Bleu de premier plan lumineux | Applique le bleu gras/lumineux au premier plan |
| 95 | Magenta de premier plan lumineux | Applique un magenta gras/lumineux au premier plan |
| 96 | Cyan de premier plan lumineux | Applique le cyan gras/lumineux au premier plan |
| 97 | Blanc de premier plan lumineux | Applique le blanc gras/lumineux au premier plan |
| 100 | Arrière-plan lumineux noir | Applique le noir gras/lumineux à l’arrière-plan |
| 101 | Arrière-plan clair rouge | Applique le rouge gras/lumineux à l’arrière-plan |
| 102 | Arrière-plan lumineux vert | Applique le vert gras/lumineux à l’arrière-plan |
| 1:03 | Jaune d’arrière-plan lumineux | Applique le jaune gras/lumineux à l’arrière-plan |
| 104 | Arrière-plan lumineux bleu | Applique le bleu gras/lumineux à l’arrière-plan |
| 105 | Arrière-plan lumineux Magenta | Applique un magenta gras/lumineux à l’arrière-plan |
| 01:23:06 AM | Cyan d’arrière-plan lumineux | Applique le cyan gras/lumineux à l’arrière-plan |
| 107 | Arrière-plan clair blanc | Applique le blanc gras/lumineux à l’arrière-plan |
Couleurs étendues
Certains émulateurs de terminal virtuel prennent en charge une palette de couleurs supérieures aux 16 couleurs fournies par la console Windows. Pour ces couleurs étendues, la console Windows choisit la couleur appropriée la plus proche de la table de couleurs 16 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 | Descriptif |
|---|---|
| 38 ; 2 ; <r> ; <g> ; <b> | Définir la couleur de premier plan sur la valeur RVB spécifiée dans <r>, <g>, <b> parameters* |
| 48 ; 2 ; <r> ; <g> ; <b> | Définir la couleur d’arrière-plan sur la valeur RVB spécifiée dans <r>, <g>, <b> parameters* |
| 38 ; 5 ; <s> | Définir la couleur de premier plan sur l’index <de> la table de couleurs 88 ou 256* |
| 48 ; 5 ; <s> | Définir la couleur d’arrière-plan sur l’index <de> 88 ou 256 couleurs* |
*Les palettes de couleurs 88 et 256 conservées en interne pour la comparaison sont basées sur l’émulateur de terminal xterm. Les tables de comparaison/arrondi ne peuvent pas être modifiées pour l’instant.
Couleurs de l’écran
La commande suivante permet à l’application de définir les valeurs de palette de couleurs d’écran sur n’importe quelle valeur RVB.
Les valeurs RVB doivent être des valeurs hexadécimales entre 0 et ff, et séparées par le caractère de barre oblique (par exemple rgb:1/24/86).
Notez que cette séquence est une séquence « Commande du système d’exploitation » OSC, et non pas un CSI comme la plupart des autres séquences répertoriées, et que, par exemple, commencent par « \x1b] », et non « \x1b[ ». En tant que séquences OSC, elles se terminent par un terminateur de chaîne représenté comme <ST> et transmis avec ESC \ (0x1B 0x5C).
BEL (0x7) peut être utilisé à la place comme terminateur, mais le formulaire plus long est préféré.
| Séquence | Descriptif | Comportement |
|---|---|---|
| ÉCHAP ] 4 ; <i> ; rgb : <r> / g> / <<b><ST> | Modifier les couleurs de l’écran | Définit l’index <de palette de couleurs d’écran i> sur les valeurs RVB spécifiées dans <r>, <g>, <b> |
Modifications du 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 curseur et le mode Touches du pavé tactile. Le mode Touches de curseur contrôle les séquences émises par les touches de direction, ainsi que l’accueil et la fin, tandis que le mode touches de touches contrôle les séquences émises par les touches du numpad principalement, ainsi que les touches de fonction.
Chacun de ces modes est des paramètres booléens simples : le mode Touches de curseur est Normal (par défaut) ou Application, et le mode Touches du pavé numérique (par défaut) ou Application.
Consultez les sections Touches de curseur et Touches de fonction pour les séquences émises dans ces modes.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ÉCHAP = | DECKPAM | Activer le mode d’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 d’application des clés de curseur | Les touches du pavé numérique émettent leurs séquences en mode Application. |
| ESC [ ? 1 l | DECCKM | Désactiver le mode d’application clés de curseur (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 sont généralement équivalentes à l’appel des API de console Get* pour récupérer des informations d’état 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 pendant que ENABLE_VIRTUAL_TERMINAL_PROCESSING est définie. L’indicateur ENABLE_VIRTUAL_TERMINAL_INPUT ne s’applique pas aux commandes de requête, car il est supposé qu’une application effectuant la requête souhaite toujours recevoir la réponse.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ÉCHAP [ 6 n | DECXCPR | Position du curseur de rapport | Émettre la position du curseur comme suit : ÉCHAP [ <r> ; <c> R Where <r> = cursor row and <c> = cursor column |
| ÉCHAP [ 0 c | DA | Attributs d’appareil | Signalez l’identité du terminal. Émettra "\x1b[ ?1 ; 0c », indiquant « VT101 sans options ». |
Onglets
Bien que la console Windows s’attend traditionnellement à ce que les onglets soient exclusivement huit caractères larges, *nix applications utilisant certaines séquences peuvent manipuler l’emplacement où les taquets de tabulation se trouvent 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 emplacements de taquet de tabulation dans la fenêtre de console, de les supprimer et de naviguer entre eux.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ÉCHAP H | HTS | Jeu d’onglets horizontaux | Définit un taquet de tabulation dans la colonne active dans laquelle se trouve le curseur. |
| ESC [ <n> I | CHT | Onglet Curseur horizontal (avant) | Avancez le curseur vers la colonne suivante (dans la même ligne) avec un taquet de tabulation. S’il n’y a plus d’taquets de tabulation, passez à la dernière colonne de la ligne. Si le curseur se trouve dans la dernière colonne, accédez à la première colonne de la ligne suivante. |
| ÉCHAP [ <n> Z | CBT | Onglet Curseur vers l’arrière | Déplacez le curseur vers la colonne précédente (dans la même ligne) avec un taquet de tabulation. S’il n’y a plus d’taquets de tabulation, déplace le curseur vers la première colonne. Si le curseur se trouve dans la première colonne, ne déplace pas le curseur. |
| ÉCHAP [ 0 g | TBC | Tab Clear (colonne active) | Efface le taquet de tabulation dans la colonne active, s’il en existe un. Sinon, rien ne fait. |
| ÉCHAP [ 3 g | TBC | Tab Clear (toutes les colonnes) | Efface tous les taquets de tabulation actuellement définis. |
- Pour CHT et CBT, <n> est un paramètre facultatif qui (default=1) indiquant le nombre de fois d’avance du curseur dans la direction spécifiée.
- S’il n’existe aucun taquet de tabulation défini via HTS, CHT et CBT traitent les premières et dernières colonnes de la fenêtre comme les deux seuls taquets de tabulation.
- L’utilisation de HTS pour définir un taquet de tabulation entraîne également la navigation dans la console jusqu’à l’arrêt de tabulation suivant dans la sortie d’un caractère TAB (0x09, '\t'), de la même manière que CHT.
Désigner un jeu de caractères
Les séquences suivantes permettent à un programme de modifier le mappage de jeu de caractères actif. Cela permet à un programme d’émettre des caractères ASCII 7 bits, mais qu’ils s’affichent comme d’autres glyphes sur l’écran de terminal lui-même. Actuellement, les deux seuls jeux de caractères pris en charge sont ASCII (valeur par défaut) et le jeu de caractères graphiques spéciaux DEC. Consultez http://vt100.net/docs/vt220-rm/table2-4.html la liste de tous les caractères représentés par le jeu de caractères graphiques spéciaux DEC.
| Séquence | Descriptif | Comportement |
|---|---|---|
| ÉCHAP ( 0) | Désigner un jeu de caractères – Dessin de trait DEC | Active le mode dessin de ligne DEC |
| ESC ( B | Définir un jeu de caractères – US ASCII | Active le mode ASCII (par défaut) |
Notamment, le mode dessin de ligne DEC est utilisé pour dessiner des bordures dans les applications console. Le tableau suivant montre ce que le caractère ASCII mappe au caractère de dessin de trait.
| 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 « région de défilement » de l’écran affectée par les opérations de défilement. Il s’agit d’un sous-ensemble des lignes qui sont ajustées lorsque l’écran défile autrement, par exemple, sur un «\n» ou un ri. Ces marges affectent également les lignes modifiées par insérer une ligne (IL) et supprimer une ligne (DL), faire défiler vers le haut (SU) et faire défiler vers le bas (SD).
Les marges de défilement peuvent être particulièrement utiles pour avoir une partie de l’écran qui ne fait pas défiler lorsque le reste de l’écran est rempli, par exemple avoir 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 sont utilisés pour spécifier les lignes qui représentent les lignes supérieures et inférieures de la région de défilement, inclus. Si les paramètres sont omis, <la valeur par> défaut est 1 et <b> est définie par défaut sur la hauteur actuelle de la fenêtre d’affichage.
Les marges de défilement sont par mémoire tampon. Par conséquent, la mémoire tampon secondaire et la mémoire tampon principale conservent des paramètres de marges de défilement distinctes (par conséquent, une application en plein écran dans la mémoire tampon de remplacement n’empoisonne pas les marges de la mémoire tampon principale).
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ESC [ <t> ; <b r> | DECSTBM | Définir la région de défilement | Définit les marges de défilement VT de la fenêtre d’affichage. |
Titre de la fenêtre
Les commandes suivantes permettent à l’application de définir le titre de la fenêtre de console sur le paramètre de chaîne> donné<. La chaîne doit être inférieure à 255 caractères à accepter. Cela équivaut à appeler SetConsoleTitle avec la chaîne donnée.
Notez que ces séquences sont des séquences « Commande du système d’exploitation » OSC, et non pas un CSI comme bon nombre des autres séquences répertoriées, et comme tel commence par « \x1b] », et non « \x1b[ ». En tant que séquences OSC, elles se terminent par un terminateur de chaîne représenté comme <ST> et transmis avec ESC \ (0x1B 0x5C).
BEL (0x7) peut être utilisé à la place comme terminateur, mais le formulaire plus long est préféré.
| Séquence | Descriptif | Comportement |
|---|---|---|
| ÉCHAP ] 0 ; <corde><ST> | Définir le titre de la fenêtre | Définit le titre de la fenêtre de console sur <chaîne>. |
| ÉCHAP ] 2 ; <corde><ST> | Définir le titre de la fenêtre | Définit le titre de la fenêtre de console sur <chaîne>. |
Le caractère de fin ici est le caractère « Bell », « \x07 »
Mémoire tampon d’écran de remplacement
*Les applications de style Nix utilisent souvent une autre mémoire tampon d’écran, afin qu’elles puissent modifier l’intégralité du contenu de la mémoire tampon, sans affecter l’application qui les a démarrées. La mémoire tampon alternative est exactement les dimensions de la fenêtre, sans aucune région de défilement.
Pour obtenir un exemple de ce comportement, envisagez quand vim est lancé à partir de bash. Vim utilise l’intégralité de l’écran pour modifier le fichier, puis retourne à bash laisse la mémoire tampon d’origine inchangée.
| Séquence | Descriptif | Comportement |
|---|---|---|
| ESC [ ? 1 0 4 9 h | Utiliser une mémoire tampon d’écran de remplacement | Bascule vers une nouvelle mémoire tampon d’écran secondaire. |
| ESC [ ? 1 0 4 9 l | Utiliser la mémoire tampon de l’écran principal | 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. Ils sont approximativement équivalents à l’appel de l’API de console SetConsoleScreenBufferInfoEx pour définir la largeur de la fenêtre.
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ESC [ ? 3 h | DECCOLM | Définir le nombre de colonnes sur 132 | Définit la largeur de la console sur 132 colonnes de large. |
| ESC [ ? 3 l | DECCOLM | Définir le nombre de colonnes sur 80 | Définit la largeur de la console sur 80 colonnes de large. |
Réinitialisation réversible
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 suivantes (également répertoriées sont les séquences qui contrôlent ces propriétés) :
- Visibilité du curseur : visible (DECTEM)
- Pavé numérique : Mode numérique (DECNKM)
- Mode Clés de curseur : Mode normal (DECCKM)
- Marges supérieures et inférieures : Top=1, Bottom=Console height (DECSTBM)
- Jeu de caractères : US ASCII
- Rendu graphique : Default/Off (SGR)
- Enregistrer l’état du curseur : position d’accueil (0,0) (DECSC)
| Séquence | Code | Descriptif | Comportement |
|---|---|---|---|
| ESC [ ! p | DECSTR | Réinitialisation réversible | Réinitialisez certains paramètres de terminal sur leurs valeurs par défaut. |
Séquences d’entrée
Les séquences de terminal suivantes sont émises par l’hôte de console sur le flux d’entrée si l’indicateur ENABLE_VIRTUAL_TERMINAL_INPUT est défini sur le handle de mémoire tampon d’entrée à l’aide de l’indicateur SetConsoleMode.
Il existe deux modes internes qui contrôlent les séquences émises pour les touches d’entrée données, le mode touches de curseur et le mode touches du pavé numérique. Celles-ci sont décrites dans la section Modifications du mode.
Touches de curseur
| Clé | Normal Mode | Mode d’application |
|---|---|---|
| Haut | ÉCHAP [ A | ÉCHAP O A |
| Flèche bas | ÉCHAP [ B | ÉCHAP O B |
| Droite | ÉCHAP [ C | ÉCHAP C |
| Gauche | Échap [ D | ÉCHAP D |
| Domicile | ÉCHAP [ H | ÉCHAP O H |
| Fin | ÉCHAP [ F | ÉCHAP O F |
En outre, si Ctrl est enfoncée avec l’une de ces touches, les séquences suivantes sont émises à la place, quel que soit le mode touches de curseur :
| Clé | N’importe quel mode |
|---|---|
| Ctrl + Flèche vers le haut | ÉCHAP [ 1 ; 5 A |
| Ctrl + Flèche vers le bas | ESC [ 1 ; 5 B |
| Ctrl + Flèche droite | ÉCHAP [ 1 ; 5 C |
| Ctrl + Flèche gauche | ESC [ 1 ; 5 D |
Touches numpad &fonction
| Clé | Séquence |
|---|---|
| Retour arrière | 0x7f (DEL) |
| Pause | 0x1a (SUB) |
| Échapper | 0x1b (ÉCHAP) |
| Insérer | ÉCHAP [ 2 ~ |
| Supprimer | ÉCHAP [ 3 ~ |
| Page précédente | ÉCHAP [ 5 ~ |
| Page vers le bas | ÉCHAP [ 6 ~ |
| Formule 1 | ÉCHAP |
| F2 | ÉCHAP O Q |
| F3 | ÉCHAP O R |
| F4 | ÉCHAP S |
| F5 | ÉCHAP [ 1 5 ~ |
| F6 | ÉCHAP [ 1 7 ~ |
| F7 | ÉCHAP [ 1 8 ~ |
| F8 | ÉCHAP [ 1 9 ~ |
| F9 | ÉCHAP [ 2 0 ~ |
| F10 | ÉCHAP [ 2 1 ~ |
| F11 | ÉCHAP [ 2 3 ~ |
| F12 | ESC [ 2 4 ~ |
Modificateurs
Alt est traitée en préfixant la séquence avec une séquence d’échappement : ÉCHAP <c où <c>> est le caractère transmis par le système d’exploitation. Alt+Ctrl est gérée de la même façon, sauf que le système d’exploitation aura pré-décalé la <touche c> vers le caractère de contrôle approprié qui sera relayé à l’application.
Ctrl est généralement transmise exactement comme reçu du système. Il s’agit généralement d’un caractère unique déplacé vers le bas dans l’espace réservé du caractère de contrôle (0x0-0x1f). Par exemple, Ctrl+@ (0x40) devient NUL (0x00), Ctrl+[ (0x5b) devient ÉCHAP (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 vers le haut | ÉCHAP [ 1 ; 5 A |
| Ctrl + Flèche vers le bas | ESC [ 1 ; 5 B |
| Ctrl + Flèche droite | ÉCHAP [ 1 ; 5 C |
| Ctrl + Flèche gauche | ESC [ 1 ; 5 D |
Remarque
Ctrl gauche + Alt droite est traitée comme AltGr. Lorsque les deux sont vus ensemble, ils seront supprimés et la valeur Unicode du caractère présenté par le système sera transmise à la cible. Le système traduit les valeurs AltGr en fonction des paramètres d’entrée système actuels.
Échantillons
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' est l’implémentation d’ESC [ <n> m avec <n> étant 31.
Le graphique suivant montre la sortie de l’exemple de code précédent.
Exemple d’activation du 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’intention de l’exemple est de démontrer :
Le mode existant doit toujours être récupéré via GetConsoleMode et analysé avant d’être défini avec SetConsoleMode.
Vérifiez si SetConsoleMode retourne
0et GetLastError retourne ERROR_INVALID_PARAMETER est le mécanisme actuel pour déterminer lors de l’exécution sur un système de bas niveau. Une application recevant ERROR_INVALID_PARAMETER avec l’un des indicateurs de mode console les plus récents dans le champ bit doit dégrader correctement le comportement et 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 sélection des fonctionnalités de mise à jour anniversaire
L’exemple suivant est destiné à être un exemple de code plus robuste à l’aide d’une variété de séquences d’échappement pour manipuler la mémoire tampon, en mettant 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 de remplacement, la manipulation des taquets de tabulation, la définition des marges de défilement et la modification 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");
}