Solarized, mais ANSI

Ce billet va rentrer dans les détails techniques et profonds de l'évolution de la configuration de la couleur dans mon émulateur de terminal. Et pour ne rien arranger, c'est la suite directe de billets passés, que je ne vais résumer que très succinctement. Il est possible que personne ne trouve le moindre intérêt à ce billet.

Dans les épisodes précédents

Comme je l'ai écrit dans mon billet Ricing, j'utilise l'ensemble de couleurs Solarized depuis 15 ans, et j'en ai été très contente pendant très longtemps, malgré ses défauts mineurs.

Et comme je l'ai écrit dans mon billet Désolarisation, ces défauts mineurs commencent à me saouler gravement, au point de me décider à essayer d'y faire quelque chose. Sauf que ce n'est pas facile de tout changer sans se sentir submergée par un sentiment de « beurk ce n'est pas comme d'habitude », et le statu quo s'est maintenu faute d'alternative suffisamment meilleure pour justifier l'effort de transition.

Par une analyse qui vaut ce qu'elle vaut, j'ai estimé que tous les problèmes que j'ai avec Solarized découlent du choix initial de mettre 8 couleurs d'accent et 8 niveaux de gris dans les 16 couleurs du terminal ANSI qui sont traditionnellement 2 nuances de 6 couleurs et 4 niveaux de gris.

Stratégie

Comme mon insatisfaction envers ledit statu quo n'a pas l'air partie pour se calmer, je prends le problème par l'autre bout, en essayant de préparer le terrain pour faciliter de futurs changements, tout en changeant le moins possible pour l'instant, pour ne pas déclencher l'effet « beurk ce n'est pas comme d'habitude ».

Donc dans ce billet, je vais décrire comment j'ai retrouvé la sémantique ANSI tout restant au plus proche du Solarized qui fait partie de ma vie depuis si longtemps.

Comme ma configuration actuelle fonctionne parce que la configuration de mes outils en mode texte est fortement couplée aux particularités de la palette de couleur, il va falloir faire évoluer les deux simultanément.

Solarized version ANSI

Démarche

La première étape a été d'inventer une palette de 16 couleurs dans la logique ANSI, qui reprend Solarized.

Les 6 couleurs de base Solarized (rouge, vert, jaune, bleu, magenta, et cyan) sont en face de la couleur de base ANSI, donc pas de difficulté à ce niveau.

Je pourrais garder l'orange et le violet à leur place, comme « rouge clair » et « magenta clair », sauf que ce n'est pas du tout plus clair ou plus emphatique que la couleur de base, et il faudra de toute façon faire quelque chose pour les autres couleurs claires, autant fabriquer 6 nouvelles couleurs claires et cohérentes.

Et il faut aussi trouver une façon de faire rentrer toutes les nuances de gris de Solarized dans l'espace ANSI plus petit.

Comme je l'avais expliqué dans Désolarisation, Solarized n'utilise en fait que 5 niveaux de gris : texte et fond normaux, texte et fond en emphase, et texte secondaire. Les 8 niveaux ne servent qu'à couvrir les variantes clair‐sur‐sombre et sombre‐sur‐clair avec la même palette, ce qui ne m'a l'air d'être d'absolument aucune utilité dans ma vie.

Pour le faire tenir 5 niveaux de gris dans l'espace ANSI, j'utilise l'astuce qu'en fait le standard ANSI définit implicitement une dix-septième couleur dans l'état par défaut du terminal.

J'ai donc décidé de mettre le texte et le fond normaux sur les couleurs par défaut, l'emphase un peu plus claire (aussi bien sur le texte que sur le fond) en gris clair sur noir (couleurs 7 et 0), le texte secondaire en gris foncé (couleur 8), et ça laisse la couleur 15 pour le blanc‐brillant‐qui‐pique‐les‐yeux.

Pour les couleurs claires, j'ai suivi la démarche de Dimidium, mais dans l'espace colorimétrique OKLCh, et en partant de OKsolar (qui ressemble suffisamment à Solarized pour mes habitudes). Concrètement, j'ai pris les couleurs de base OKsolar, j'ai poussé leur L de 0.631 à 0.7, et j'ai tourné la teinte de 14°.

Le résultat est clairement un premier jet perfectible, mais il a le mérite d'être tout à fait supportable. C'est donc exactement ce que j'attendais d'un premier petit pas vers une meilleure palette.

Les valeurs

Même si c'est un premier largement perfectible, autant partager avec le monde entier le résultat de cette démarche.

Couleur Solarized OK-ANSIfié
Fond par défaut #002b36 #002d38
Texte par défaut #839496 #98a8a8
Noir #073642 #093946
Rouge #dc322f #e64c53
Vert #859900 #819500
Jaune #b58900 #ac8300
Bleu #268bd2 #2b90d8
Magenta #d33682 #dd459d
Cyan #2aa198 #259d94
Gris clair #eee8d5 #8faaab
Gris foncé #002b36 #657377
Rouge clair #cb4b16 #fb6188
Vert clair #586e75 #ada201
Jaune clair #657b83 #cf9034
Bleu clair #839496 #16ace7
Magenta clair #6c71c4 #ea62cc
Cyan clair #93a1a1 #50b399
Blanc #fdf6e3 #fbf7ef

Adaptation des configurations

Je ne me souviens plus exactement si je suis passée par une phase de découragement devant le nombre de configurations à reprendre, mais je me suis rapidement convaincue qu'en fait les principales applications à ajuster sont irssi, mutt, newsboat, et vim. Et les premières n'ont pas tant d'éléments que ça, donc je m'attendais à pouvoir les ajuster facilement, il n'y avait que la coloration syntaxique de vim qui m'inquiétait vraiment.

Vim

Je ne sais plus trop comment je me suis convaincue que la configuration de la coloration syntaxique dans vim est d'une complexité qui me dépasse, ni que la variation Solarized est inutilement compliquée dans ce domaine. J'imagine que tomber sur un dépôt qui prétend proposer la même configuration mais sans bullshit, puis un autre qui n'enlève qu'une partie du bullshit, conforte ces impressions.

Je ne me souviens plus si j'ai essayé la version « sans bullshit » avant ou après avoir écrit Désolarisation, mais ma première réaction a été « beurk, ce n'est pas mon Solarized » et supprimer le fichier.

Comme ça reste une base extrêmement pratique pour ce que je veux faire, j'ai regardé de plus près pourquoi un truc qui prétend être identique ne l'est pas. J'ai découvert avec une certaine surprise que le thème Solarized que j'utilise depuis tant d'années n'a existé que pendant quelques jours en avril 2011, et que toutes les différences qui me déchirent les yeux viennent d'Ethan Schoonover lui-même.

Donc j'ai commencé par fabriquer mon propre “Solarized flattened” pour mesurer exactement l'étendue des dégâts. Je n'ai pas trop cherché à faire un thème utilisable, je voulais surtout de quoi faire un diff de l'apparence dans un terminal.

Voici les commandes que j'ai utilisées pour ce faire :

:put =execute('hi')
:%s/\n  */ /g
:%!sort
:%!sed '/links/{;H;$x;$p;d;};$G'
:%s/ *gui[a-z]*=[^ ]*//g
:%s/xxx //
:%s/^\([^ ]*\) *links to \([^ ]*\)$/hi link \1 \2/
:'<,'>s/^/hi /
(remonter `hi Normal`)
:%s/  */ /g
:w txt-empty-hi.vim

En gros, la première ligne remplit le buffer initial avec la coloration courante, les suivantes trient les entrées et séparent les liens des configurations, puis virent les parties qui ne m'intéressent pas.

J'ai ensuite analysé « avec les yeux » le diff :

Ça ne fait pas beaucoup de changement en quinze ans, et je crois que ma première réaction a été trop violente à cause du préprocesseur, devenu rouge agressif, des caractères spéciaux qui ressortent beaucoup moins, et du diff qui noie les différences dans la coloration syntaxique de base du fichier.

Après avoir fait la liste des différences supportables et de celles que je vais refuser, j'ai fait un script sed pour convertir un flattened pour Solarized en une configuration de couleurs pour ma variante ANSIfiée.

Irssi, Mutt, et Newsboat

Pour les autres applications, j'ai constaté au passage le manque de cohérence dans la coloration, alors qu'il n'y en que trois et que les plus grosses différences sont entre les deux configurations qui viennent de l'auteur de Solarized.

Je n'arrête pas de parler de newsboat, mais ma configuration a été reprise directement du newsbeuter que j'utilisais avant, et je ne sais du tout d'où j'ai recopié les sept lignes de thème. Je suis à peu près sûre que je les ai recopiées et non pas inventées, parce que je n'aurais pas choisi le magenta pour la majorité du texte sur mon écran.

Donc en parallèle de l'ajustement de ces applications, j'ai cherché à mettre en place un certain « langage graphique ». J'ai la flemme de faire des captures d'écran (en m'assurant qu'elles ne dévoilent pas trop de choses, alors que je n'ai pas les idées complètement claires sur ce que je suis prête à dévoiler ici), alors je vais le décrire avec des mots.

J'ai touillé un peu plus les couleurs d'irssi, notamment l'activité dans la barre de statut (jaune pour le texte normal, gris pour les trucs moins importants, rouge pour les trucs plus important).

J'ai aussi un peu touillé la configuration de mutt, qui est beaucoup plus détaillée que ce à quoi je m'attendais, et j'ai découvert au passage qu'elle était subtilement cassée depuis tout ce temps : ce qui était censé être bright (surtout les différents niveaux de gris) est rendu en gras dans la couleur de base.

Finalement je n'ai que traduit les niveaux de gris qui marchent, et j'ai gardé les couleurs anormales dont j'ai l'habitude, mais en les dégraissant. Le résultat est suffisamment « comme d'habitude » pour me plaire, et nettement plus reposant maintenant que le gras n'est plus généralisé.

Bilan

Ça ne fait que quelques semaines que j'ai fait cette rénovation de configuration, et je me demande si ce n'est pas encore un peu trop tôt pour juger. D'un autre côté, les changements visibles sont tellement subtils que je ne suis pas sûre d'avoir besoin de plus de temps pour me faire un avis.

Dans l'ensemble, je suis assez contente du changement. C'est assez peu intrusif pour ne pas y penser souvent, ce qui était un objectif initial.

La nouvelle palette est légèrement plus contrastée que le Solarized de base, et je trouve que c'est une bonne chose. Une conséquence négative est le peu de différence entre les couleurs de base et les variantes claires.

Je regrette un peu d'avoir fait ma rotation de teinte dans le sens ou le rouge clair tire sur le magenta, à l'opposé de l'orange de Solarized. D'un autre côté, ça m'a permis de voir la quantité de « rouge clair » dans mon terminal. Et aussi de voir que j'arrive à remarquer quand il y a du rouge qui tire sur le magenta là où j'avais l'habitude de voir de l'orange ; je ne m'y attendais pas étant donné le mal que j'avais à distinguer le rouge de l'orange sans les avoir côte à côte.

Je ne suis pas sûre que c'est une super-idée de mettre toutes les couleurs de base à la même luminosité, comme l'a fait OKsolar, ça réduit l'espace dans lequel les variations claires peuvent être placées. L'approche de Dimidium est peut-être plus saine, mais je ne sais pas dans quelle mesure les configurations à base de Solarized s'attendent à une luminosité uniforme.

Sur les différences visibles, j'aime beaucoup la nouvelle uniformisation entre mes applications. Je n'ai pas trop d'avis sur les changements dans vim, je me suis adaptée assez rapidement à la plupart d'entre eux, j'ai refusé le changement sur les diff, et j'hésite à refuser aussi des caractères spéciaux ; au total il n'y a rien de positif sur vim, que du neutre ou du négatif.

Le retour dans la sémantique ANSI est très satisfaisant intellectuellement, même si je n'en ai pas encore vu les conséquences concrètes (à part sur #gcufeed). Il est probable que je me rende pas compte de tous les ennuis que j'éviterai à l'avenir en essayant de nouvelles applications de terminal.

Bref, l'objectif de « petit pas qui ne se voit pas trop » est parfaitement rempli, et c'est peut-être suffisant pour calmer mes insatisfactions. Et si ça ne l'est pas, les bases sont posées pour essayer des choses petit à petit, individuellement sur chaque application et sur chaque terminal.

J'ai prévu la possibilité d'essayer d'autres palettes, avec Catppuccin et Gruvbox pour commencer. Je ne sais pas à quel point ce sont des rationalisations de « beurk ce n'est pas comme d'habitude », mais je trouve Catppuccin trop « pastel » au point d'avoir du mal à distinguer les couleurs entre elles, et Gruvbox trop « chaud », j'aime bien le bleu et les nuances bleutées.

Dans toutes les autres palettes que j'ai croisées par le passé, j'ai aussi souvent été rebutée par une trop forte luminosité du fond, je trouve que c'est un peu dommage de considérer un tel détail comme rédhibitoire, mais je ne comprends pas du tout l'intérêt, je n'y vois que des inconvénients.

Au moins, le champ expérimental est ouvert, et je pourrais l'explorer dans les prochains mois et les prochaines années. On verra bien après coup quel sera le prochain état stable que j'atteindrai.

Commentaires

Pas de commentaire pour le moment.

Poster un commentaire

Mise en forme historique : pour mettre en valeur un mot ou un groupe de mot, tapez une étoile de part et d'autre, sans mettre d'espace entre l'étoile et le mot, comme ceci : *mise en valeur*. Pour insérer un lien, mettez le entre crochets, comme ceci : [http://instinctive.eu/].

Mise en forme markdown : voir le guide détaillé, en résumé c'est le Markdown traditionnel, sans HTML ni titres, mais avec les tables PHP-Markdown-Extra.

Attention : les balises HTML entrées dans les commentaires seront affichées telles quelles, et non pas interprétées.

Autour de cette page

 

Autour de cet article

  • Publié le 30 septembre 2025 à 13h17
  • État de la bête : avance à petits pas
  • Pas de commentaire
  • Tag : Geek
  • Tag : Évènement
  • Tag : Suite

Derniers commentaires

Tags

Archives

Site-level navigation and features

 

Instinctive.eu

Contact

Sections

Validation

Copyright © 2008-2025 Natacha Kerensikova

Butterfly images are copyright © 2008 Shoofly