2 points par GN⁺ 2024-01-31 | 1 commentaires | Partager sur WhatsApp
  • Pour afficher correctement dans Emacs en terminal des thèmes comme Solarized, l’important n’est pas tant la couleur 24 bits elle-même que le fait que le terminal, terminfo, tmux et mosh comprennent tous la même capacité couleur d’un bout à l’autre
  • Les couleurs RGB sont largement utilisées sous la forme ESC[38;2;<r>;<g>;<b>m, mais la syntaxe avec deux-points, plus proche du standard, coexiste toujours avec la syntaxe à points-virgules répandue dans les implémentations réelles, ce qui complique la compatibilité
  • xterm-256color et xterm-direct annoncent respectivement une palette de 256 couleurs et 16 777 216 couleurs, mais le modèle centré sur les palettes de terminfo ne parvient pas à représenter proprement les couleurs RGB directes
  • En pratique, il peut falloir des valeurs alternatives de TERM comme les entrées -direct de ncurses-term, tmux-direct, la série mosh 1.4, ou vscode-direct, et certaines couches n’acceptent encore que la syntaxe à points-virgules
  • Pour utiliser de façon fiable les fonctionnalités des terminaux modernes, TERM et terminfo ne suffisent pas : il faudrait un mode de description séparé, mis à jour plus vite selon le nom et la version du terminal

Pourquoi la couleur 24 bits est nécessaire dans Emacs en terminal

  • Emacs en environnement graphique prend automatiquement en charge la couleur 24 bits, ce qui permet d’afficher correctement des thèmes comme Solarized et les polices
  • Si l’on utilise le même thème dans un terminal, l’expression des couleurs est plus limitée et l’affichage peut être moins agréable
  • Les terminaux populaires prennent en charge la couleur 24 bits depuis longtemps, mais pour qu’un programme l’utilise, il faut que la détection des capacités et la configuration soient toutes deux correctes
  • L’objectif est double
    • trouver comment activer la prise en charge du truecolor dans l’environnement terminal actuel
    • comprendre comment les problèmes de couleur d’Emacs se rattachent aux standards de terminaux des années 1970 à 1990

Codes d’échappement ANSI et histoire des extensions de couleur

  • Les premiers terminaux matériels utilisaient des systèmes de codes de contrôle différents, et la normalisation ANSI était nécessaire pour créer des logiciels portables
  • Les codes d’échappement ANSI existent depuis les années 1970, et pour la couleur, le point clé est SGR (Select Graphics Rendition)
    • gras ou intensité
    • italique
    • clignotement
    • couleur de premier plan et d’arrière-plan
    • autres attributs d’affichage des caractères
  • Au départ, la couleur était une couleur 3 bits correspondant aux 8 sommets du cube RGB
    • avec le noir, le blanc, les primaires additives et les primaires soustractives
  • Ensuite, l’ajout d’un bit pour les couleurs vives ou le gras a permis de passer à 16 couleurs
    • « bright black » correspond à un gris foncé
  • En 1999, Todd Larason a ajouté à xterm un patch de prise en charge des 256 couleurs
    • échantillonnage d’un cube RGB 6x6x6
    • rampe de niveaux de gris sur 24 niveaux
    • il existe aussi une variante 88 couleurs, rare mais encore prise en charge

Comment la syntaxe de la couleur 24 bits est apparue

  • Dans les terminaux compatibles, les couleurs 8 bits et 24 bits se définissent ainsi
    • ESC[38;5;<n>m : définit comme couleur de premier plan le numéro n de la palette
    • ESC[38;2;<r>;<g>;<b>m : définit comme couleur de premier plan les valeurs RGB r, g, b
  • Les nombres 5 et 2 sont liés au mode de couleur étendu de l’ISO 8613-6, c’est-à-dire ITU T.416
    • 2 : couleur directe dans l’espace RGB
    • 5 : couleur indexée
  • La normalisation a suivi cette chronologie
    • années 1970 : ANSI standardise les séquences d’échappement des terminaux, ce qui mène à ANSI X3.64 et ECMA-48
    • 1979 : la 2e édition d’ECMA-48 assigne SGR 30~37 et 40~47 aux couleurs de premier plan et d’arrière-plan en 3 bits
    • 1984 : la 3e édition d’ECMA-48 introduit la notion de couleur de premier plan et d’arrière-plan par défaut, et assigne 39 et 49
    • 1991 : la 5e édition d’ECMA-48 laisse 38 et 48 « pour une normalisation future » avec une référence à l’ISO 8613-6
    • 1993 : l’ISO 8613-6 définit 38 et 48 comme modes étendus de couleur de premier plan et d’arrière-plan
  • Pour séparer les sous-paramètres, l’usage des deux-points est plus proche du standard, mais dans les implémentations réelles, les points-virgules se sont largement imposés
    • ESC[38;5;3m peut être interprété, sur un terminal qui ne connaît pas SGR 38, comme trois paramètres distincts 38, 5, 3
    • La FAQ de xterm par Thomas Dickey explique qu’à l’époque, une copie de l’ITU T.416 coûtait cher, et que séparer les valeurs RGB par des points-virgules comme les autres paramètres SGR était une erreur
  • Chronologie associée
    • 1999 : Thomas Dickey intègre dans xterm le patch 256 couleurs de Todd Larason, avec la syntaxe ambiguë à points-virgules
    • 2006 : Konsole prend en charge les 256 couleurs et le truecolor 24 bits avec la même syntaxe à points-virgules que xterm
    • 2012 : xterm est modifié pour accepter aussi la syntaxe à deux-points, plus proche du standard
    • 2016 : la console intégrée de Windows 10 prend en charge les codes d’échappement ANSI et la couleur 24 bits, mais utilise la syntaxe à points-virgules
    • 2019 : Windows Terminal prend aussi en charge les codes d’échappement ANSI, mais utilise la syntaxe à points-virgules
    • 2022 : Microsoft annonce la transition de l’écosystème, du sous-système de console historique de style VGA vers l’émulation de terminal ANSI
    • 2022 : Konsole ajoute la prise en charge de la syntaxe à deux-points conforme au standard

Comment terminfo représente les capacités de couleur

  • terminfo fournit une base de données de capacités de terminaux et un mécanisme pour générer les séquences d’échappement adaptées
  • La variable d’environnement TERM indique l’entrée terminfo à utiliser par le programme, et elle est aussi transmise automatiquement lors d’une connexion ssh
  • toe affiche la liste des entrées terminfo installées, et infocmp permet d’inspecter les capacités d’une entrée donnée
  • Pour la couleur, trois capacités sont importantes
    • colors : nombre de couleurs prises en charge par le terminal
    • setaf : définition de la couleur de premier plan
    • setab : définition de la couleur d’arrière-plan
  • Dans xterm-256color, setaf produit des séquences différentes selon le numéro de couleur
    • 0~7 : utilise les paramètres ANSI SGR 30~37
    • 8~15 : utilise les couleurs vives non standard 90~97
    • au-delà : utilise la palette 256 couleurs sous la forme 38;5;<n>
  • xterm-direct est une entrée terminfo pour le RGB 24 bits qui annonce colors à 16 777 216
    • ccc est désactivé, ce qui indique qu’on ne peut pas assigner une nouvelle valeur RGB à un index de couleur
    • les entrées liées à la modification dynamique des couleurs à l’exécution, comme initc, oc, rs1, sont aussi absentes
    • setaf et setab utilisent la forme à deux-points 38:2::...

Les limites du modèle de couleur directe de terminfo

  • Le modèle de programmation de terminfo et de ncurses est fondamentalement centré sur les entrées de palette
    • il y a N entrées de palette
    • chaque entrée possède une valeur RGB par défaut
    • le modèle suppose que le terminal peut modifier ces valeurs
  • Les terminaux -direct représentent la couleur 24 bits comme s’il existait 16 777 216 entrées de palette
    • chaque entrée correspond à un cube RGB 8:8:8
    • ces valeurs ne peuvent pas être modifiées
  • Pour des raisons de compatibilité, l’approche xterm-direct réserve les 7 bleus les plus sombres pour rester compatible avec les 8 couleurs ANSI de base
    • le noir est exclu
    • cela évite que des programmes existants, supposant une certaine sémantique de setaf, n’affichent un bleu très foncé presque illisible
  • Pour cette raison, l’approche -direct n’est pas compatible avec l’approche -256color
    • les programmes doivent savoir que 256 couleurs signifie couleurs indexées, et 16 777 216 couleurs signifie couleur directe
    • il existe aussi l’exception consistant à éviter les 7 bleus les plus sombres
  • Dans un problème lié à termwiz, le programme s’attendait à la palette xterm-256color, mais produisait en réalité des bleus très foncés difficiles à lire
    • l’issue était encore ouverte au moment de la rédaction, mais @quark-zju a intégré une correction, et termwiz se comporte maintenant de façon raisonnable
  • Le cœur du problème relève moins du terminal lui-même que des contraintes de terminfo
    • un terminal prenant en charge la couleur 24 bits semble aussi prendre en charge la palette 256 couleurs de xterm et la modification dynamique des valeurs RGB
    • terminfo n’est pas suffisant pour représenter précisément et rapidement l’écosystème moderne des émulateurs de terminaux

Réglage de TERM et compatibilité avec les points-virgules

  • Comme beaucoup de programmes utilisent terminfo, la valeur de TERM doit être correctement définie
  • Même si l’on souhaite uniformiser l’usage de la syntaxe SGR à deux-points, de nombreux environnements n’acceptent encore que la syntaxe à points-virgules
    • la console intégrée de Windows, Conhost
    • certains comportements de Mintty et de l’environnement Cygwin
    • Mosh
    • PuTTY
    • la version de Konsole incluse dans Ubuntu 22.04 LTS
  • Les entrées terminfo sont composées de briques de base
    • xterm+direct : syntaxe à deux-points proche du standard
    • xterm+indirect : pour les anciens terminaux ne prenant en charge que les points-virgules
  • Après recherche sur xterm+indirect, vscode-direct semblait le meilleur choix
    • comme il cible les terminaux Microsoft, il a été jugé suffisamment proche de Windows Terminal et de Windows Console
    • toutes les fonctions n’ont pas été auditées, mais cela fonctionne
  • Sur beaucoup de serveurs, les entrées terminfo -direct peuvent ne pas être installées
    • sur la plupart des systèmes, la base terminfo par défaut se trouve dans le paquet ncurses-base
    • les entrées de terminaux étendues nécessitent le paquet ncurses-term
  • Une entrée terminfo winconsole a été ajoutée à ncurses pendant la rédaction, mais elle ne prend pas en charge la couleur 24 bits et n’a encore été publiée dans aucune version de ncurses

Comment Emacs détecte le truecolor

  • Emacs documente sa manière de détecter la prise en charge du truecolor sur un TTY
  • En lançant (display-color-cells) via M-x eval-expression, on peut vérifier si Emacs reconnaît 16 777 216 couleurs
  • La documentation d’Emacs traite aussi des limites terminfo du mode -direct
    • sur les terminaux disposant de la capacité RGB, les couleurs de #000001 à #000007 peuvent être traitées comme des couleurs indexées plutôt que comme du RGB direct
    • cela sert à conserver la compatibilité descendante avec les applications qui ne connaissent pas la couleur directe
    • si cela pose problème, on peut utiliser une définition de terminal personnalisée avec setb24 et setf24
  • Emacs cherche d’abord les chaînes setf24 et setb24, puis utilise RGB comme solution de repli
  • Dans les entrées terminfo observées sur le système, setf24 n’était pas présent

Dans des terminaux imbriqués, toutes les couches doivent être correctes

  • Un flux de travail courant empile plusieurs couches de terminal
    • ouvrir un émulateur de terminal graphique sur le poste local
    • se connecter à une machine distante ou à une VM via mosh
    • démarrer tmux
    • ajouter ensuite un terminal interne à Emacs, Asciinema, GNU Screen, etc.
  • Chaque couche implémente sa propre machine à états de séquences d’échappement ANSI
  • Pour que la couleur 24 bits fonctionne, toutes les couches doivent comprendre les séquences d’échappement générées à partir du terminfo de la valeur TERM interne, et les transmettre correctement en fonction du terminfo externe
  • Les logiciels concernés doivent donc être suffisamment récents
    • Ubuntu LTS fournit actuellement mosh 1.3, il a donc fallu activer le PPA mosh-dev
  • La valeur de TERM à l’intérieur de chaque couche doit aussi être exacte
    • à l’intérieur de tmux, on utilise tmux-direct
    • mosh n’a pas de terminfo standard, il faut donc choisir une valeur suffisamment proche

Réglages selon l’environnement

  • Émulateur de terminal graphique

    • la plupart des terminaux définissent un TERM adapté par défaut, ou permettent à l’utilisateur de le surcharger
    • Konsole propose une option pour choisir la valeur de TERM
  • ssh

    • ssh transmet la valeur de TERM au nouveau shell
    • si l’hôte distant possède la même entrée terminfo, la configuration reste relativement simple
  • tmux

    • lorsque tmux démarre, TERM peut être défini sur screen
    • on corrige cela en changeant le terminal par défaut dans ~/.tmux.conf
    set -g default-terminal "tmux-direct"
    
    • on peut aussi envisager de définir tmux-direct uniquement si le TERM extérieur prend en charge la couleur 24 bits, et sinon conserver screen ou tmux-256color
  • mosh

    • les versions récentes de mosh prennent en charge la couleur 24 bits, mais n’annoncent d’elles-mêmes que 8 ou 256 couleurs
    • l’utilisateur doit donc définir TERM de façon appropriée
    • mosh vise la compatibilité xterm, mais dans SGR 38 et 48, il ne prend en charge que la syntaxe à points-virgules
    • TERM=xterm-direct ne fonctionne pas
    • vscode-direct a été utilisé comme alternative la plus proche de xterm-direct
    • comme il n’existe pas de variable simple pour indiquer que mosh est en cours d’utilisation, un script detect-mosh.rs a été écrit puis appelé depuis .bashrc
    • il vérifie si le processus shell est un enfant de mosh-server
    • il n’a pas été établi avec certitude si compiler du Rust pendant le chemin de connexion convient aux hôtes peu puissants

Résultat final et problèmes restants

  • Après configuration, le thème s’affiche en couleur 24 bits dans Emacs, y compris à l’intérieur de tmux et de mosh
  • Il reste trois problèmes principaux
    • les terminaux ne sont pas totalement d’accord sur la syntaxe et les fonctionnalités
    • terminfo est la voie standard pour interroger les capacités
    • terminfo est limité, parfois inexact, et les nouvelles versions sortent peu fréquemment

Quelle suite après terminfo

  • Les logiciels qui veulent exploiter pleinement les fonctionnalités des terminaux modernes doivent dépasser terminfo
  • Directions possibles
    • continuer à utiliser la variable TERM, largement prise en charge
    • ne pas dépendre uniquement du terminfo ancien fourni par l’OS ou la distribution, et permettre au programme de connaître les capacités du terminal indépendamment
    • intégrer dans une bibliothèque mise à jour fréquemment des informations sur les émulateurs de terminaux d’environ la dernière décennie, classées par nom et version
    • ne plus inclure la prise en charge des terminaux matériels devenus difficilement utilisables
    • continuer à prendre en charge les fichiers terminfo fournis par l’OS et leur format, mais avec un protocole permettant de savoir quelle information est la plus récente
    • ajouter un TERMVERSION optionnel pour distinguer, par exemple, les différences de capacités entre Konsole 2022 et Konsole 2023
    • représenter sans ambiguïté des fonctions modernes comme la couleur 24 bits, l’animation de palette 256 couleurs, les liens URL, ou le protocole graphique Kitty
  • Une approche rétrocompatible pour les programmes legacy est aussi possible
    • un programme lancé depuis .bashrc utiliserait TERM et TERMVERSION pour générer dans $HOME/.terminfo/ un fichier terminfo binaire
    • il générerait des capacités 24 bits explicites comme RGB, setf24, setb24
    • les programmes qui ne connaissent pas RGB pourraient supposer une palette 256 couleurs, avec conservation de colors#0x100, initc, oc

1 commentaires

 
GN⁺ 2024-01-31
Avis de Hacker News
  • Fouiller dans terminfo, c’est comme éclairer des hiéroglyphes avec une torche vacillante au fond de catacombes
    C’est presque étrange quand on pense à toute la complexité que contient une simple application de terminal, et cela rend encore plus reconnaissant envers les développeurs de terminaux comme iTerm et Kitty
    J’ai regroupé des fonctions pour définir la couleur des onglets dans iTerm+zsh : https://gist.github.com/aclarknexient/84ebe33c1879f921685304...
    Comparé à l’ancienne façon de se connecter à HTTP ou SMTP avec telnet, le texte lui-même est simple, mais ce qui l’affiche est une application complexe qui prend en charge toutes sortes de fonctionnalités

    • En utilisant mon propre terminal, j’ai décidé au début de ne pas me préoccuper de terminfo et de faire semblant d’être rxvt, en acceptant les problèmes qui en découleraient
      Aujourd’hui, c’est un choix possible parce que je suis pratiquement le seul utilisateur de ce terminal, mais les terminaux modernes prennent en charge un sous-ensemble commun assez large, ce qui est moins pénible que de voir les applications ne pas reconnaître une valeur TERM inconnue et partir en vrille
      Bien sûr, si l’on ne se connecte pas souvent en SSH à de nouvelles machines, c’est un problème moins important
    • Ce serait bien de pouvoir partager une capture d’écran où la couleur des onglets est réellement appliquée
    • Le logiciel qui me manque le plus sur Mac, c’est iTerm
      Ce n’est pas l’émulateur de terminal le plus rapide, mais visuellement, c’est de très loin le meilleur
  • Il était plus simple d’ajuster la palette 16 couleurs de chaque application de terminal que d’aligner précisément le code terminal côté application
    Je définis les couleurs de rxvt-unicode dans ~/.Xdefaults, puis, dans le thème Emacs .el, je choisis des noms de couleurs différents selon qu’il s’agit d’un affichage graphique ou non, avant de les appliquer à plusieurs faces
    En bonus, la sortie colorée de ls devient aussi plus agréable à lire. La palette 16 couleurs par défaut est souvent trop saturée et offre un mauvais contraste

    • C’est précisément (if (display-graphic-p) qui est essentiel
      Emacs prend en charge une vraie sortie graphique et, sous X11/Cocoa/Win32, Esc se comporte vraiment comme Esc ; les raccourcis Ctrl+Shift ou Cmd, l’utilisation simultanée de plusieurs polices, l’affichage d’images, le changement de forme du curseur, etc. sont possibles
      C’est comme une machine à remonter le temps qui nous emmènerait 20 ans plus tard, en 1989
    • Sur les anciens écrans TTL, il n’était pas possible de faire mieux, d’où des couleurs aussi saturées
      Une ligne rouge était soit rouge intense, soit éteinte, et avec l’ajout de la ligne d’intensité, cela donnait du rouge à 100 %
    • Si l’on met des séquences dans DIRCOLORS, ls prend lui aussi réellement en charge les couleurs 24 bits
    • Moi aussi, j’ajuste la palette 16 couleurs de Terminology dans un fichier INI selon mon thème préféré, afin d’utiliser le même style dans la console et dans les applications de terminal (vim)
    • J’utilise une approche presque identique
      Les couleurs par défaut sont trop sombres par rapport à un fond sombre, donc j’ai augmenté la luminance de toutes les couleurs
  • L’auteur aurait probablement eu beaucoup moins de mal s’il avait connu export COLORTERM=truecolor
    Cela apparaît aussi dans la note de bas de page de la documentation Emacs liée sur la détection du truecolor, ainsi que dans la capture d’écran de Konsole, mais il est possible que la variable ait disparu à travers plusieurs couches de multiplexeurs de terminal
    En définissant cette valeur, l’application comprend immédiatement que l’on veut du truecolor, ce qui permet de contourner la partie difficile, sans même avoir besoin de la base de données terminfo

    • Oui. Il aurait fallu inclure dans cette histoire les tâtonnements autour de COLORTERM et de fonctionnalités terminfo comme RGB
      Cela dit, tous les programmes ne respectent pas COLORTERM ; j’ai donc déjà eu, dans .bashrc, une configuration qui faisait un unset de COLORTERM pour linux | screen* et exportait COLORTERM=truecolor dans les autres cas
      Aujourd’hui, Screen prend en charge les couleurs 24 bits, donc c’était probablement une configuration de l’époque d’Ubuntu 18
    • Ou bien utiliser son GUI Emacs préféré avec tramp ou sshfs
    • Exact. Si l’on descend le chemin de terminfo, seule la folie nous attend
      D’un autre côté, c’est aussi parce que les mainteneurs de ncurses sont assez conservateurs, tandis que les nouveaux développeurs de terminaux veulent avancer vite
    • C’est à partir d’Emacs 28 que la base de données terminfo n’est plus nécessaire
      Avec les versions plus anciennes d’Emacs, elle reste nécessaire
    • COLORTERM est aussi assez bizarre
      La plupart du temps, il n’est pas nécessaire de le définir, mais si COLORTERM=truecolor est défini dans une session screen, l’affichage devient soudain très étrange, puis redevient normal quand on supprime la variable d’environnement
  • Il n’est pas indispensable d’utiliser un terminal pour interagir avec Emacs
    On peut utiliser des frontends graphiques pour macOS, Windows, X.org et Wayland
    Avec la barre d’outils désactivée, Emacs graphique ressemble tellement à Emacs tournant dans un terminal que quelqu’un qui ne connaît pas Emacs peut facilement prendre la fenêtre Emacs graphique sur l’ordinateur d’un collègue pour une fenêtre de terminal
    Dans une enquête auprès des utilisateurs d’Emacs, 80 % ont répondu utiliser un frontend graphique

    • En contre-argument, si l’on veut utiliser le terminal sans la lourdeur d’une GUI complète, xterm-mouse-mode suffit déjà à obtenir 80 % des avantages
      Avec mouse, xterm-mouse-mode, mouse-wheel-mode, des réglages de défilement, etc., cela devient tout à fait utilisable, et auto-save-default reste, par la volonté divine, à nil
    • Je ne fais pas tourner Emacs dans un émulateur de terminal. Emacs est l’émulateur de terminal
      Tous les programmes de terminal sont exécutés dans des buffers shell-mode d’Emacs graphique, et je n’utilise term-mode que pour les rares programmes qui ont besoin d’un contrôle plein écran
      Ce n’est pas le plus riche en fonctionnalités ni le plus rapide, mais on peut s’y déplacer comme dans n’importe quel autre buffer et le manipuler de façon fluide avec le contenu en cours d’édition
      Si je ne peux pas lancer Emacs graphique sur une machine distante, j’édite les fichiers distants avec tramp, ou je lance un serveur Emacs headless puis je m’y connecte avec un emacsclient graphique
    • C’est une bonne remarque
      Je n’avais jamais envisagé que les gens puissent penser que je fais tourner Emacs dans le terminal
      Emacs graphique est nettement meilleur, mais le fait que, même dans le terminal, 90 % fonctionnent et s’affichent encore de la même manière reste excellent
    • J’utilise Emacs basé sur X, et le protocole est efficace
      À l’usage, c’est aussi léger qu’un terminal, pas du tout comme VNC
      On bénéficie des polices, de l’utilisation simultanée de plusieurs polices, des menus, de la souris, des couleurs et de plusieurs frames/fenêtres
      En faisant tourner la partie graphique en local et en accédant aux systèmes distants avec tramp, on peut en pratique éditer même les fichiers de configuration d’un routeur Linux distant qui n’a quasiment que busybox, avec toutes sortes de fonctions de confort
    • Au final, il y a deux raisons pour lesquelles je reviens toujours à Emacs en mode terminal
      J’utilise X11 par intermittence depuis les années 90, mais pour les polices j’en suis encore à chercher jusqu’à tomber par hasard sur une commande qui marche, puis à ne plus y toucher
      Les performances d’affichage de la plupart des programmes de terminal restent nettement plus rapides que celles des configurations X11 qu’on se retrouve à utiliser en environnement d’entreprise
  • Aujourd’hui, il suffit d’installer un Emacs récent, d’ouvrir un terminal prenant en charge xterm 24 bits, puis de lancer emacs -nw
    Si, après application d’un thème, le rendu est correct, c’est terminé ; sinon, ajoutez export COLORTERM=truecolor dans .bashrc, .zshrc, .fishrc, etc., puis rechargez le shell ou exécutez simplement cette ligne et relancez emacs -nw
    L’article donne l’impression qu’il faut fouiller dans terminfo, mais en général ce n’est pas nécessaire. Il y a dix ans peut-être, mais plus aujourd’hui
    J’ai rapidement revérifié avec iTerm sur macOS et Alacritty, Kitty et Gnome Terminal sur Linux, et la prise en charge de xterm 24 bits est aujourd’hui courante

  • J’ai découvert aujourd’hui que les séquences d’échappement ANSI standard fonctionnent aussi dans l’invite de commandes de Windows 10
    Les couleurs 24 bits fonctionnent également très bien
    En exécutant echo ^[[48;2;255;0;0mHello^[[0m, Hello s’affiche avec un fond rouge RGB(255,0,0), et ^[[0m réinitialise la couleur
    ^[ doit être saisi avec CTRL-[ ; il ne faut pas taper ^ et [ séparément

    • Si l’on ne veut pas insérer directement des caractères non imprimables dans la ligne de commande, on peut utiliser le code d’échappement \x1b ou l’alias \e avec une commande qui accepte les codes d’échappement
      Par exemple, on peut écrire echo -e '\e[48;2;255;0;0mHello\e[0m'
      Cela dit, dans les scripts, echo -e n’est pas standard et même echo simple varie dans certains cas limites ; il vaut donc mieux toujours utiliser printf '\e[48;2;255;0;0mHello\e[0m\n'
    • Il ne faut pas oublier d’ajouter DEVICE=C:\DOS\ANSI.SYS au fichier C:\CONFIG.SYS
  • Comparé à vim/neovim, le meilleur aspect d’Emacs est qu’il dispose d’une prise en charge GUI de première classe, et pas seulement d’un émulateur de terminal à l’intérieur d’une fenêtre
    Je sais qu’il existe gVim et de nombreux frontends neovim assez moyens, mais le mode d’exécution par défaut d’Emacs est une vraie GUI, et c’est ce que j’apprécie
    Le terminal est très bien aussi, mais il traîne trop de scories historiques et de limitations, et beaucoup de choses n’ont plus vraiment de sens à notre époque
    Si le problème est d’exécuter Emacs sur un serveur distant, il y a TRAMP et emacsclient

    • L’avantage de tout exécuter dans le terminal, c’est que tout ce qui apparaît dans le terminal peut être copié
      C’est frustrant quand une application GUI empêche de copier le texte qu’elle affiche et oblige à le retaper à la main
    • Ce n’est pas exact. Neovim a beaucoup de frontends natifs, et il a justement été conçu dès le départ pour rendre cette architecture possible
      https://github.com/neovim/neovim/wiki/Related-projects#gui
    • Entièrement d’accord
      J’aime beaucoup l’édition modale et vim, mais j’ai eu du mal à supporter les solutions bancales qu’imposent les éditeurs en terminal
      Quand on dispose d’une plateforme graphique riche, pourquoi ne pas l’utiliser ?
    • Cela dépend fortement du workflow
      Par exemple, j’utilise vim presque uniquement pour éditer des fichiers, et je reviens au shell pour les outils externes comme git, les linters, les formatters, les débogueurs ou la manipulation de l’arborescence des fichiers
      Mon application principale est donc déjà l’émulateur de terminal, et dans ce workflow, l’absence de GUI dédiée importe très peu
  • Moi, j’aimerais plutôt que mon Emacs ressemble à ça : https://imgur.com/a/h0jA1ro
    Je ne suis pas sérieux, c’est une blague. Je n’utilise Cool Retro Term que pour les présentations
    À ce que je vois, les couleurs 24 bits fonctionnent par défaut dans mon Emacs : https://imgur.com/a/BM5OTxp
    Cela dit, la coloration syntaxique est un peu agaçante

    • https://muppetlabs.com/~mikeh/crt_emacs.png
      Cool Retro Term est excellent, et j’aimerais aussi l’utiliser dans une présentation
    • J’aime vraiment Cool Retro Term, mais c’est dommage que le projet soit presque abandonné et qu’il ait plusieurs problèmes sous MacOS
      Personnellement, je trouve que les autres terminaux rétro ne sont pas aussi beaux
    • J’utilise vraiment un effet CRT légèrement personnalisé dans Windows Terminal
  • C’est vraiment honteux d’avoir enfermé des standards derrière un prix aussi élevé
    Les gens doivent faire autant de détours pour éviter de les acheter, et cela peut même mener à ce genre de résultat
    Un standard devrait être accessible. À l’époque où ils n’existaient qu’en livres, faire payer les coûts d’impression pouvait se comprendre, mais difficile de croire qu’un PDF médiocre coûtait 200 dollars

  • J’ai écrit le patch de couleurs 24 bits pour xterm, mais ce n’est qu’aujourd’hui que j’ai appris comment faire fonctionner ncurses avec xterm-direct
    J’utilisais déjà ma propre bibliothèque de terminal écrite en Lisp, mais il reste utile d’avoir une voie de secours avec ncurses
    Merci à M. Dickey pour sa réponse sur Stack Overflow, et à Chad pour avoir soulevé le sujet