Le plan maître ANSI pour le stylage du texte de terminal et la composition des couleurs

Le plan maître ANSI pour le stylage du texte de terminal et la composition des couleurs

Table des matières

Dans mon guide de base sur les couleurs ANSI, j’utilisais un modèle simple :

1\x1b[<style>;<text_color>;<bg_color>m

Dès que vous commencez à utiliser des couleurs étendues, comme \x1b[38;5;67m ou des valeurs RGB complètes, vous remarquez que ce modèle à “cases fixes” ne fonctionne plus.

C’est parce que les terminaux n’interprètent pas ces séquences comme des positions fixes. Ils traitent plutôt une séquence de paramètres, un paramètre après l’autre.

Ce mécanisme s’appelle Select Graphic Rendition (SGR).

Ce modèle permet de combiner styles, couleurs 256, et RGB TrueColor dans une seule séquence.

Modèle de paramètres SGR

La forme générale est :

\x1b[ <param> ; <param> ; <param> ... m
└─┬─┘ └──────────────┬──────────────┘└┬┘
Préfixe              |              octet final
                     |    
zéro ou plusieurs paramètres numériques séparés par des points-virgules (vide = 0)

Le préfixe \x1b[ signale le début de la séquence. Il est composé du caractère ESC (ASCII 27, représenté par \x1b) suivi de [, ce qui forme ensemble le Control Sequence Introducer (CSI).

L’octet final m indique que les paramètres concernent le style du texte.

Tout ce qui se trouve entre [ et m est interprété comme une liste de paramètres numériques, séparés par des points-virgules.

Le terminal les lit de gauche à droite, en combinant leurs effets dans un seul état de style. Les paramètres suivants écrasent les précédents lorsqu’ils modifient le même attribut. Cela rend SGR flexible dans l’ordre pour les paramètres indépendants, mais strictement séquentiel pour les instructions multi-parties comme les modes couleur.

La majorité des usages réels se répartissent en quatre catégories pratiques :

  1. 0Réinitialisation / Normal (commande globale de reset)

  2. 1 - 9Paramètres de style du texte (gras, faible, italique, etc.)

  3. Couleur de premier plan (texte) → Définit la couleur du texte via trois niveaux :

  4. Couleur d’arrière-plan → Définit le fond du texte via trois niveaux :

Si vous avez besoin de la spécification complète, y compris les paramètres rares ou peu utilisés, la documentation des séquences de contrôle xterm est l’une des références les plus complètes et les plus utilisées.

Tip

Règles d’ordre des paramètres vs regroupement

Le terminal n’impose pas un ordre fixe pour les attributs indépendants.

Tant que vos paramètres n’entrent pas en conflit direct, ils peuvent être réordonnés librement. Tous les exemples suivants produisent exactement le même résultat (texte gras rouge sur fond bleu) :

  • \x1b[1;31;44m (style en premier)
  • \x1b[44;31;1m (fond en premier)
  • \x1b[31;1;44m (couleur en premier)

Cependant, il existe une exception stricte à cette flexibilité :

👉 Les paramètres multi-parties doivent rester groupés et dans le bon ordre.

Par exemple :

  • 38;5;<n> (mode 256 couleurs)
  • 38;2;<r>;<g>;<b> (mode RGB)

Ils sont interprétés comme des instructions uniques avec sous-paramètres. Les séparer ou les réordonner casse la séquence.

Notes de compatibilité des terminaux

Tous les terminaux n’implémentent pas SGR de manière cohérente :

  • Certains ignorent italique (3) ou clignotement (5) (ex : PowerShell Windows ancien).
  • gras (1) peut s’afficher comme une couleur plus lumineuse au lieu d’un poids de police plus fort (ex : anciens consoles Windows).
  • TrueColor (38;2) n’est pas garanti sur les anciens environnements.

Ces différences viennent des variations entre émulateurs de terminal et leur niveau de support ANSI.

Si vous écrivez des outils CLI, supposez toujours un support partiel et testez sur :

  • terminaux compatibles xterm
  • Terminal macOS / iTerm2
  • Windows Terminal / console héritée

Pour la portabilité, privilégiez :

  • modes 16 couleurs ou 256 couleurs
  • réinitialisations explicites (0, 22, 24, etc.)

Warning

Dans certains environnements de programmation, le caractère ESC utilisé dans les séquences ANSI n’est pas écrit sous forme d’échappement littéral \x1b.

Il peut être généré explicitement comme une valeur de caractère.

Par exemple :

  • PowerShell Windows n’interprète pas \x1b dans les chaînes. Utilisez $([char]27) à la place.
  • C et Bash peuvent aussi utiliser \033 (octal) ou \e (fréquent dans les scripts shell).
  • JavaScript peut utiliser \u001b (Unicode).

Cela impacte la construction des séquences ANSI dans le code, mais pas leur interprétation par le terminal une fois émises.

Le rendu ANSI dépend toujours de l’émulateur de terminal, et les anciens terminaux peuvent avoir un support limité ou inexistant des séquences SGR.

1. Commande de réinitialisation globale

Le paramètre le plus critique de tout le système SGR est le numéro 0. Ce code ne modifie pas un style spécifique ; il efface complètement l’état de rendu interne du terminal.

  • 0 : Réinitialisation / Normal — supprime instantanément toutes les couleurs de premier plan, arrière-plans, graisses de texte et décorations, et restaure le profil par défaut du terminal.

Notez qu’une séquence sans paramètre (\x1b[m) équivaut à utiliser uniquement 0 (\x1b[0m).

Warning

Règle cruciale : l’écrasement de gauche à droite

Comme le terminal lit les paramètres séquentiellement de gauche à droite, la position de 0 change tout :

  • Reset sûr + style : \x1b[0;1;31m efface d’abord l’état précédent, puis applique du texte rouge gras.
  • Reset destructeur : \x1b[1;31;0m active gras et rouge, puis exécute immédiatement 0, ce qui annule tout et produit du texte brut.

Note : 0 réinitialise tous les attributs, mais les codes individuels (22, 24, etc.) sont souvent plus sûrs si vous voulez préserver certaines propriétés.

2. Paramètres de style du texte (poids et effets)

Ces valeurs à un seul chiffre modifient l’apparence structurelle de la police. Vous pouvez les placer n’importe où dans la séquence.

ValeurEffet de styleContexte technique
1GrasAugmente le poids ou l’intensité
2Faible / atténuéDiminue l’intensité ; utile pour logs secondaires
3ItaliqueIncline le texte (nécessite une police supportant l’italique)
4SoulignéAjoute une ligne sous le texte
5Clignotement lentFait clignoter le texte (moins de 150 fois/minute)
7Inversé / négatifInverse la couleur du texte et du fond
8Masqué / cachéCache le texte (utile pour mots de passe ou spoilers)
9BarréTrace une ligne au milieu du texte

Vous pouvez facilement combiner les styles :

1\x1b[1;3;4m

donnera un texte gras, italique et souligné*.

Cependant, attention aux combinaisons modifiant l’intensité. Par exemple, 2 (atténué) combiné avec 5 (clignotement) échoue souvent. Les terminaux donnent généralement priorité à 2, ce qui désactive le clignotement.

Réinitialisations ciblées : Pour désactiver un style sans tout réinitialiser (0), le standard SGR fournit des codes dédiés :

  • 22 : intensité normale (désactive gras 1 et atténué 2)
  • 23 : désactive italique (3)
  • 24 : désactive soulignement (4)
  • 29 : désactive barré (9)

3. Paramètres de couleur de premier plan et d’arrière-plan

3.1. Paramètres 16 couleurs standard

Ces codes donnent accès rapidement à la palette système par défaut du terminal.

Couleurs standard :

  • 3037 : couleurs de texte (premier plan)
  • 4047 : couleurs de fond
30 (40)
Noir
31 (41)
Rouge
32 (42)
Vert
33 (43)
Jaune
34 (44)
Bleu
35 (45)
Magenta
36 (46)
Cyan
37 (47)
Blanc

Couleurs haute intensité (extensions aixterm) : Bien que non présentes dans le standard d’origine, ces extensions sont largement supportées.

  • 9097 : couleurs de texte brillantes
  • 100107 : couleurs de fond brillantes
90 (100)
Noir brillant
91 (101)
Rouge brillant
92 (102)
Vert brillant
93 (103)
Jaune brillant
94 (104)
Bleu brillant
95 (105)
Magenta brillant
96 (106)
Cyan brillant
97 (107)
Blanc brillant

3.2. Palette 256 couleurs (mode 8 bits)

Pour accéder à davantage de nuances, vous devez indiquer au terminal que vous entrez dans un mode palette étendue via l’identifiant 5.

Cela consomme exactement trois paramètres :

  • Couleur de texte : 38;5;<color_id>
  • Couleur de fond : 48;5;<color_id>

Répartition des identifiants de couleur (0 à 255)

  • 015 : couleurs système standard
  • 16231 : cube RGB 6×6×6 (216 nuances)
  • 232255 : dégradé de gris progressif du sombre au quasi-blanc

Voir la documentation de la palette 256 couleurs pour la répartition complète.

Décodage par le terminal :

\x1b[38;5;67m
     |  |  └── 67 : récupère la couleur ID 67 (teinte bleu ardoise)
     |  └── 5 : active le mode couleur 8 bits
     └── 38 : cible le premier plan (texte)

3.3. Palette TrueColor RGB (mode 24 bits)

Si vous développez un outil CLI moderne et avez besoin d’une précision absolue des couleurs pour respecter une charte graphique, vous pouvez fournir directement des canaux RGB bruts. Cela utilise l’identifiant de mode 2 et consomme cinq paramètres :

  • Couleur de texte : 38;2;<r>;<g>;<b>
  • Couleur de fond : 48;2;<r>;<g>;<b>

Chaque paramètre <r>, <g>, <b> accepte une valeur de 0 à 255.

\x1b[38;2;255;100;0m
     |  |  └── 255;100;0 : rouge pur (255), vert moyen (100), bleu nul (0)
     |  └── 2 : mode couleur 24 bits TrueColor
     └── 38 : cible le premier plan (texte)

Voir le sélecteur de couleurs RGB pour référence.

Combinaison et chaînage de séquences complexes

Les paramètres SGR étant interprétés comme une seule séquence, vous pouvez combiner styles, couleurs de texte et d’arrière-plan dans un seul tag d’ouverture.

Modèle pratique : wrapper de style sécurisé

Un modèle courant dans les outils CLI est :

1\x1b[0;<styles>mVotre texte\x1b[0m

Cela garantit :

  • aucune fuite de style depuis une sortie précédente
  • aucune propagation vers le shell

Exemple

1\x1b[1;4;38;2;255;100;0;48;5;235m

Lecture de gauche à droite :

  1. 1;4; → active gras et souligné
  2. 38;2;255;100;0; → définit une couleur de texte orange en TrueColor
  3. 48;5;235 → définit un fond gris foncé via la palette 256 couleurs (index 235)

Erreur fréquente

1\x1b[31mErreur:

Sans réinitialisation, tout le texte suivant sera coloré.

Terminez toujours avec :

1\x1b[31mErreur:\x1b[0m

L’état SGR persiste jusqu’à modification explicite. Réinitialisez toujours (\x1b[0m) pour éviter les fuites de style.

Articles Connexes

Vous Devriez Soigner la Mise en Forme des Noms dans Votre Code

Vous Devriez Soigner la Mise en Forme des Noms dans Votre Code

Dans mon code, je dois créer une variable qui représente mon nouvel item. Mais comment la nommer ? Est-ce que la façon de la formater — ou de formater …

Lire la suite
Fatigué de Débattre du Style de Code ? Automatisez Votre Chemin vers la Cohérence

Fatigué de Débattre du Style de Code ? Automatisez Votre Chemin vers la Cohérence

Fatigué de discuter du style de code ? Apprenez à automatiser votre chemin vers la cohérence en utilisant des outils de formatage de code. Découvrez …

Lire la suite
Outils de Développement de Logiciels: Une Vue d'Ensemble

Outils de Développement de Logiciels: Une Vue d’Ensemble

Lorsque j’apprends un langage de programmation, l’une des premières choses que j’essaie de comprendre est comment transformer le …

Lire la suite