- Ein Beitrag schlägt vor, die 256-Farben-Palette automatisch aus dem Base16-Theme des Nutzers zu erzeugen, um die Farbkonsistenz und Lesbarkeit im Terminal zu verbessern
- Bestehende Base16-Themes sind zwar einfach, aber in der Anzahl der Farben begrenzt, während Truecolor komplexe Konfiguration und Kompatibilitätsprobleme mit sich bringt
- Die standardmäßige 256-Farben-Palette bietet wegen unausgewogener Helligkeit, Nichtübereinstimmung mit dem Theme und fehlerhafter Interpolation eine geringe visuelle Qualität
- Wenn eine erweiterte Palette aus Base16-Farben mittels Interpolation im LAB-Farbraum erzeugt wird, sind reichhaltigere Farbdarstellungen möglich, während konsistente Helligkeit und Kontrast erhalten bleiben
- Mehrere wichtige Terminals, etwa Ghostty, iTerm2 und SwiftTerm, setzen dies bereits um; eine standardisierte automatische Palettenerzeugung könnte die Qualität des gesamten Terminal-Ökosystems verbessern
Überblick über die 256-Farben-Palette
- Die 256-Farben-Palette besteht aus 16 Grundfarben, einem 216-Farben-Würfel und einer 24-stufigen Graustufenskala
- Die 16 Grundfarben umfassen Schwarz, Weiß, Primärfarben und helle Varianten
- Der 216-Farben-Würfel wird mit 6 Stufen (0~5) pro RGB-Kanal berechnet:
16 + (36 * R) + (6 * G) + B
- Die Graustufen bestehen aus 24 Abstufungen zwischen Schwarz und Weiß:
232 + S (S ist 0~23)
- Diese Struktur ist eine vereinfachte Version von 24-Bit-RGB und erhält Ausdruckskraft, obwohl die Zahl der Farben reduziert wird
Probleme der bestehenden 256-Farben-Palette
- Durch die Nichtübereinstimmung mit Base16-Themes entstehen Farbkonflikte
- Die Standardpalette harmoniert mit den meisten Base16-Themes nicht
- Fehlerhafte Farbinterpolation verschlechtert die Lesbarkeit auf dunklen Hintergründen
- Die erste Abstufung der Standardpalette wird heller berechnet, als sie tatsächlich sein sollte, wodurch der Kontrast geschwächt wird
- Problem des ungleichen Kontrasts
- Es werden vollständig gesättigte Farben verwendet, wodurch die Helligkeitsbalance nicht stimmt; selbst auf derselben Stufe wirkt Blau dunkler als Grün
Verfahren zur Palettenerzeugung
- Die Lösung besteht darin, die 256-Farben-Palette automatisch aus den Base16-Farben des Nutzers zu erzeugen
- Die 8 Grundfarben von Base16 werden auf die 8 Eckpunkte des 216-Farben-Würfels abgebildet
- Mit Hintergrund- und Vordergrundfarbe wird der Würfel per trilinearer Interpolation (trilinear interpolation) erzeugt
- Der LAB-Farbraum wird verwendet, um eine konsistente wahrgenommene Helligkeit zwischen den Farben zu erhalten
- Die Graustufenskala wird durch einfache Interpolation vom Hintergrund zum Vordergrund erzeugt
- Im Python-Beispielcode werden
rgb_to_lab, lab_to_rgb und lerp_lab für die Umwandlung verwendet
Implementierung und aktueller Stand
- Der vorgeschlagene Code ist als Public Domain veröffentlicht und kann frei angepasst und verwendet werden
- In wichtigen Terminals wie Ghostty, iTerm2 und SwiftTerm ist die Implementierung bereits abgeschlossen
- Für kitty, Wezterm, Tabby und Windows Terminal wurden ebenfalls Integrationsanfragen gestellt oder die Entwicklung läuft bereits
- Einige Entwickler schlugen die Verwendung des OKLAB/OKLCH-Farbraums vor; das Projekt will den Standardfarbraum entsprechend der Entscheidung von Ghostty vereinheitlichen
- Über ein Python-Skript lässt sich die Palette direkt anwenden oder eine Konfigurationsdatei für das Terminal automatisch erzeugen
Fazit und Vorschlag
- Die standardmäßige 256-Farben-Palette wird von Programmierern wegen schlechterer Lesbarkeit und Nichtübereinstimmung mit dem Theme gemieden
- Wenn das Terminal automatisch eine 256-Farben-Palette auf Basis eines Base16-Themes erzeugt, ergeben sich folgende Vorteile
- Nutzung eines breiten Farbumfangs auch ohne Konfigurationsdatei
- Kein Eingreifen von Entwicklern beim Wechsel zwischen Hell-/Dunkelmodus erforderlich
- Erhalt einer breiten Terminal-Kompatibilität
- Der Autor betont, dass diese Funktion standardmäßig aktiviert (opt-out) sein sollte und sich langfristig als Standardfunktion etablieren müsse
1 Kommentare
Hacker-News-Kommentare
Das Gute an der 256-Farbpalette ist, dass die Farben 16–255 fest definiert sind
Man kann also zum Beispiel sicher sein, dass 146 immer ein „gedecktes Lila“ ist
Das ist für Entwickler von Farbthemen sehr nützlich, die über verschiedene Terminal-Emulatoren hinweg eine konsistente Farberfahrung bieten wollen
Wenn eine 256-Farbpalette aus einer variablen 16-Farbpalette erzeugt würde, könnte 146 am Ende nicht die erwartete Farbe sein
Ich halte es für den falschen Weg, wenn der Bereich 16–255 genauso instabil wird wie 0–15
Für Sehbehinderte oder Menschen mit Farbsehschwäche sowie für Leute, die einen weißen Hintergrund bevorzugen, leidet dann die Lesbarkeit
Am Ende müssen Nutzer nicht nur die Standardfarben des Terminals, sondern zusätzlich noch die Farbeinstellungen jeder einzelnen App anpassen
Terminals nutzt man nicht wegen einer hübschen UI, sondern wegen Effizienz. Wer etwas Hübsches will, soll ein Web-Frontend bauen
Wir wollen keine „konsistente Erfahrung“. Farben sollten sparsam eingesetzt werden und die Benutzereinstellungen respektieren
Der Hintergrund könnte ja selbst lila sein oder man könnte lila Text auf weißem Hintergrund haben
Wenn eine App also die Farbkonfiguration meines Terminals nicht kennt, sollte sie diese Farbe nicht verwenden
Ich verwende das Standard-
base16-Theme und erwarte nicht, dass es mit Themes von Dritten übereinstimmtDer Unterschied zwischen farblichem Zugriff auf Terminal-Ebene und auf App-Ebene ist für mich eher eine philosophische Frage
Ich habe einen Streaming-Markdown-Renderer namens Streamdown gebaut
Auf Basis von HSV wird nur eine Grundfarbe festgelegt, der Rest wird dann automatisch als Vielfaches davon angepasst
Dunklere Elemente bekommen zum Beispiel weniger Sättigung, Symbole dafür kräftigere Farben
Schon kleine Änderungen an HSV in den Einstellungen verschieben den gesamten Ton auf natürliche Weise, ohne dass man jede Farbe einzeln anfassen muss
Es gibt auch Beispielcode
Schon mit der 16-Farben-Standardpalette gibt es Probleme
black,white,bright blackundbright whitesollten eigentlich Helligkeitskontrast bedeuten, tragen aber FarbnamenIch verstehe sie eher als „vor dem Hintergrund fast unsichtbare Farbe“, „stark kontrastierende Farbe“, „sichtbar, aber schwach“ und „maximal kontrastierende Farbe“
Ich wünschte, sie wären nicht über Farbnamen, sondern über Kontrast definiert
Vorder- und Hintergrundfarbe des Terminals sind vom 16-Farben-Standard unabhängig, was die Sache noch komplizierter macht
Wenn man den Hintergrund nicht kennt, sollte man Schwarz und Weiß vermeiden. Wer 256 Farben nutzt, sollte eine vom Nutzer konfigurierbare Theme-Engine verwenden
Ich finde, diese Funktion sollte in jedes Terminal eingebaut werden
Eine Erweiterung auf 24-Bit-Farben wäre noch besser. Allerdings sollte sie optional sein
Wenn man zum Beispiel ein Solarized-Theme sowohl im Terminal als auch im Editor verwendet, könnte die Farbtransformation doppelt angewendet werden
Wenn Apps Einstellungen nicht direkt überschreiben, sondern das über Umgebungsvariablen gesteuert werden kann, wäre das flexibler
Ich habe tinted-theming/base24 entdeckt und nutze es derzeit
Mit tinted shell lassen sich Farbthemen sehr einfach umschalten. Das war eine ziemlich gute Zwischenlösung
Auch bei cargo/rustc gibt es ein Problem mit zu wenigen Farben
Wenn man nur die semantischen Standardfarben verwendet, bleiben am Ende nur Magenta, Schwarz und Weiß übrig, was je nach Theme riskant ist
Man kann auch einfach den 24-Bit-True-Color-Modus verwenden, dann braucht man keine Palette
Laut termstandard/colors unterstützen die meisten modernen Terminals das
Berücksichtigt man physikalische Grenzen wie die Heisenbergsche Unschärferelation oder Quantenrauschen, bräuchte man theoretisch sogar Daten im Bereich von 6000 Bit/Pixel
Solche Gedankenspiele sind interessant, ähnlich wie die Kardaschow-Skala oder alte kosmologische Zeitvorstellungen, weil sie eine Richtung für technischen Fortschritt aufzeigen
Nicht alle Nutzer haben ihre Standardfarbeinstellungen sauber konfiguriert
Manche Terminals haben vielleicht insgesamt einen Grün- oder Orangestich
Es könnte daher sogar besser sein, die Sättigung der Grundfarben auf die gesamte Palette anzuwenden
Ich bin farbenblind und hatte deshalb viele Probleme mit Farbthemen
Deshalb lasse ich mit einem KI-Modell automatisch gut lesbare Farbkombinationen erzeugen
Auf Basis eines Themes, das ich ursprünglich mochte, wird der Kontrast erhöht, und dadurch ist es viel angenehmer zu lesen
Ich glaube, so ein Ansatz könnte auch anderen helfen
Apps verwenden Farben sehr unterschiedlich, sodass ein Theme in manchen CLIs gut aussieht, an anderer Stelle aber viel zu blass ist
Am Ende ist es mühsam, Farbthemen für jede App separat anzupassen
Ich habe Protanomalie (Rotschwäche) und nutze deshalb ametameric
Zusammen mit dieser Funktion könnte das wohl noch bessere Ergebnisse liefern