Files

12 KiB

mwxcol

Eine Farbpalette und die Themes, die sie auf die benutzten Werkzeuge übertragen.

Quelle der Wahrheit ist mwxcol.go — alles andere ist davon abgeleitet. go run mwxcol.go druckt die Palette zur Sichtprüfung ins Terminal.

Palette

Name Hex Dezimal Rolle
white #F0F0EA 240,240,234 normaler Text, Vordergrund
yellow #F9E2AF 249,226,175 Änderung, Warnung, Build-Dateien
orange #FAB387 250,179,135 Archive, Präprozessor
red #F38BA8 243,139,168 Fehler, Löschung, Strings
green #94E2D5 148,226,213 ausführbar, neu, ok (eigentlich ein Mint/Teal)
blue #B4BEFE 180,190,254 Verzeichnisse, Quelltext, Datum
pink #F5B2F7 245,178,247 Symlinks, Keywords, Treffer
violet #CBA6F7 203,166,247 Typen, Bilder, Sonderdateien
grey #AAAABB 170,170,187 Sekundärtext, Kommentare
dark #777788 119,119,136 Attribute, deaktiviert
darker #444455 68,68,85 Trenner, Rahmen, Hintergrundakzent

Die Palette enthält keine Hintergrundfarbe. Als Terminal-Hintergrund dient #252528 (iTerm2-Profil „Default"); wo ein Theme einen Hintergrund braucht, steht dieser Wert oder darker.

Installation auf einem neuen Rechner

git clone <repo> ~/src/mwxcol
cd ~/src/mwxcol
./install.sh --check     # zeigt erst, was passieren würde
./install.sh             # kopiert, sichert Vorhandenes nach .bak
exec zsh

./install.sh --link symlinkt statt zu kopieren. Das ist die bessere Variante, wenn das Repo dauerhaft an seinem Platz bleibt: dann können installierte Datei und Repo-Kopie nicht mehr auseinanderlaufen. --check sagt jederzeit, ob sie es doch getan haben.

Nova muss nach der Installation einmal neu gestartet werden; das Theme steht dann unter Einstellungen > Themes > mwx.

Was wo landet

Werkzeug Repo Ziel Wie es geladen wird
eza themes/eza/theme.yml ~/.config/eza/theme.yml automatisch aus dem Config-Verzeichnis
joe themes/joe/default.jcf ~/.joe/colors/default.jcf Schema default, verdeckt die System-Version
fzf themes/fzf/colors.zsh ~/.config/mwxcol/fzf-colors.zsh source in ~/.zshrc → FZF_DEFAULT_OPTS
iTerm2 themes/iterm/mwxcol.itermcolors ~/.config/mwxcol/mwxcol.itermcolors einmalig importieren, siehe unten
Nova themes/nova/mwx.novaextension ~/Library/.../Nova/Extensions/org.mwx Nova-Extension, Theme mwx
Xcode themes/xcode/mwxcol.xccolortheme ~/Library/Developer/Xcode/UserData/FontAndColorThemes/ Theme mwxcol, einmal auswählen, siehe unten
Claude Code themes/claude-code/mwxcol.json ~/.claude/themes/mwxcol.json "theme": "custom:mwxcol" in settings.json

Getestet mit eza 0.23.5, joe 4.6, fzf 0.70.0 (und 0.58.0), iTerm2 3.6.11, Nova, Xcode 26.6 und Claude Code 2.1.220 auf macOS.

iTerm2

Die Palette deckt die 16 ANSI-Slots nicht von sich aus ab: ein Cyan fehlt, und eigene bright-Varianten gibt es auch nicht. Die fehlenden sechs Werte sind nicht neu erfunden, sondern wörtlich aus dem Nova-Theme übernommen, das dieselbe Lücke bereits geschlossen hatte — dadurch sehen Novas Terminal und iTerm2 identisch aus. Abgeleitete Werte sind unten mit * markiert.

Slot Farbe Slot Farbe
0 black #444455 darker 8 br-black #777788 dark
1 red #F38BA8 red 9 br-red #F7B5C8 *
2 green #94E2D5 green 10 br-green #B8EAE1 *
3 yellow #F9E2AF yellow 11 br-yellow #FCEECB *
4 blue #B4BEFE blue 12 br-blue #CDD4FE *
5 magenta #CBA6F7 violet 13 br-magenta #F5B2F7 pink
6 cyan #94DAE0 * 14 br-cyan #B8E7EB *
7 white #AAAABB grey 15 br-white #F0F0EA white

Dazu Vordergrund white, Hintergrund #252528 (unverändert), Cursor red mit dunklem Cursor-Text, Auswahl darker, Links blue.

Import — iTerm2 hält seine Einstellungen im Speicher und schreibt sie beim Beenden zurück. Eine direkt bearbeitete Plist wäre also wieder weg; der Import muss durch die Oberfläche:

Einstellungen > Profiles > Colors > Color Presets… > Import…
~/.config/mwxcol/mwxcol.itermcolors

Danach im selben Menü mwxcol auswählen. Der Preset-Name kommt aus dem Dateinamen. Die älteren Presets mwx und mwxdark bleiben unangetastet — sie tragen noch die grellen Standard-ANSI-Töne und sind nicht diese Palette.

themes/iterm/preview.sh setzt die Palette per Escape-Sequenz in der laufenden Session, ohne etwas zu speichern — zum Ansehen vor dem Import. Ein neuer Tab hat wieder die alten Farben.

Xcode

Xcode liest jede .xccolortheme aus dem Ordner oben und zeigt sie unter dem Dateinamen an — das Theme heißt also mwxcol, wie das iTerm2-Preset. Die älteren Themes mwx und mwxdark bleiben unangetastet.

Auswählen: Einstellungen > Themes > mwxcol. Xcode führt hell und dunkel getrennt (XCFontAndColorCurrentTheme bzw. …CurrentDarkTheme), das Theme also in beiden Erscheinungsbildern wählen, wenn es überall gelten soll. ./install.sh --check liest beide Werte und sagt, was gerade aktiv ist.

Ein laufendes Xcode sieht die neue Datei erst nach einem Neustart.

Die Zuordnung folgt dem Nova-Theme, damit beide Editoren gleich aussehen:

Xcode-Element Farbe Xcode-Element Farbe
Plain Text, Variablen white Keywords violet
Kommentare, Doc-Kommentare dark Strings green
Doc-Schlüsselwörter, MARK: grey Attribute (@State) green
Typen und Klassen yellow Zahlen, Zeichen orange
Typ-Deklaration yellow Präprozessor, Makros orange
Funktionen, andere Deklarationen blue Konstanten orange
URLs blue Reguläre Ausdrücke pink

Unsichtbare Zeichen sind darker, der Cursor ist red wie im iTerm2-Preset, die Zeile mit dem Debugger green mit 25 % Deckkraft. Marker im Scrollbalken folgen der Palette: Fehler red, Warnung yellow, Laufzeitproblem orange, Analyzer violet, Breakpoint blue, Diff grey.

Die Flächen sind die einzigen Werte außerhalb der Palette. Der Editor ist #15151C — dunkler als der Terminal-Hintergrund und anders als überall sonst hier, weil er in Xcode so eingestellt wurde; Auswahl und aktuelle Zeile sind #20202B, die Konsole behält #252528 aus dem iTerm2-Profil und der Quick-Help-Kasten #2E2E35 (darker mit 30 % über #252528).

Drei Dinge, die man beim Anpassen wissen muss:

Xcode unterscheidet eigene und fremde Symbole, dieses Theme nicht. Für Klassen, Typen, Funktionen, Variablen, Konstanten und Makros gibt es jeweils einen Schlüssel für Projekt-Symbole und einen mit .system für Symbole aus Frameworks. Beide tragen hier denselben Wert, weil die Palette keine freien Farbtöne mehr hat, mit denen die Unterscheidung nicht wie eine zweite Bedeutung aussähe. Wer sie doch will, setzt die sechs .system-Schlüssel auf violet #CBA6F7 — dann sind Framework-Symbole durchgehend violett wie in Xcodes eigenem Dark-Theme, kollidieren aber mit den Keywords.

Schriften stehen mit im Theme, nicht nur Farben. Alle Syntax-Schlüssel tragen HackNFM-Regular - 15.0 (Hack Nerd Font Mono), der Quick-Help-Text .SFNS-Regular - 14.0. Andere Schrift gewünscht: die Werte in DVTSourceTextSyntaxFonts ersetzen — Xcode erwartet den PostScript-Namen (HackNFM-Regular), nicht den Anzeigenamen („Hack Nerd Font Mono"). Fette Schnitte für Keywords und Deklarationen hat das Theme absichtlich nicht mehr: Xcode ebnet sie beim nächsten Zurückschreiben ohnehin ein, siehe unten.

Wer das Theme in den Einstellungen anfasst, schreibt die Datei um. Xcode speichert dann seine eigene Fassung, und die ist nicht nur ohne Kommentare — beobachtet an Xcode 26.6 nach einer Größenänderung in der Oberfläche:

  • DVTFontSizeModifier verschwindet und wird in die Schriftgrößen eingerechnet,
  • die Schnitte werden eingeebnet, HackNFM-Bold wird überall zu -Regular,
  • Schlüssel, die Xcodes eigenes Theme-Modell nicht führt, fallen heraus — hier xcode.syntax.markup.aside.kind und DVTDebuggerInstructionPointerColor (letzterer steht nur im Theme der SourceEditor.framework).

--check meldet die installierte Datei danach als „WEICHT AB"; wer die Änderung behalten will, überträgt sie von Hand ins Repo, sonst überschreibt der nächste ./install.sh sie kommentarlos (das Backup liegt als .bak daneben). Bei --link ersetzt Xcode womöglich den Symlink durch eine echte Datei, dann ist die Verbindung ganz aufgehoben.

Claude Code

Ab Version 2.1.220 liest Claude Code eigene Themes aus ~/.claude/themes/*.json (mit CLAUDE_CONFIG_DIR verschiebt sich das Verzeichnis mit). Aufbau:

{ "name": "mwxcol", "base": "dark", "overrides": { "text": "#F0F0EA", … } }

base ist eines der eingebauten Themes, overrides überschreibt einzelne Farbschlüssel davon. Erlaubt sind #RRGGBB, #RGB, rgb(r,g,b), ansi256(n) und ansi:<name>; unbekannte Schlüssel und ungültige Werte werden still verworfen. Ausgewählt wird das Theme über /theme oder direkt mit "theme": "custom:mwxcol" in ~/.claude/settings.json — der Dateiname ist der Slug. Claude Code beobachtet das Verzeichnis, Änderungen greifen sofort.

Dieses Theme setzt alle 72 Schlüssel des dark-Themes, damit keine Farbe aus dem Original durchschlägt:

Element Farbe Element Farbe
Fließtext white Erfolg, Plan-Modus green
Sekundärtext, inaktiv grey Fehler red
Prompt-Rahmen dark Warnung yellow
Auswahl, Flächen darker Claude selbst, Fast Mode orange
Rechte, Vorschläge, IDE blue Bash-Rahmen pink
Auto-Accept, Skills violet

Die Shimmer-Varianten (die hellere Farbe der Laufanimation) nehmen, wo es sie gibt, die abgeleiteten Hellwerte aus der iTerm2-Tabelle oben — blue schimmert also nach #CDD4FE, violet nach pink.

Die Diff-Hintergründe sind die einzigen gemischten Werte: green bzw. red mit 30 % Deckkraft über #252528 (#465E5C / #63444E), auf Wortebene mit 50 %, für die gedimmte Fassung mit 15 %. Nachrichtenflächen sind darker mit 30 % über #252528 (#2E2E35).

Ein einfacherer Weg, der die Palette nicht braucht: das eingebaute Theme dark-ansi nimmt die 16 ANSI-Farben des Terminals — nach dem iTerm2-Import sind das ohnehin die Farben von hier, dann aber gerundet auf die 16 Slots. custom:mwxcol ist genauer und gilt auch in Terminals ohne das Preset.

Fallstricke

Vier Dinge, die beim Übertragen Zeit gekostet haben und beim nächsten Mal Zeit sparen:

eza mergt über sein eingebautes Theme, es ersetzt es nicht. Wer nur foreground setzt, erbt is_bold und is_underline aus eza's Default. Genau so entstand die Unterstreichung bei README.md und Makefile — die stecken in file_type: build, und dessen Default ist bold + underline. Deshalb steht im Theme an mehreren Stellen ein explizites is_underline: false, das sonst überflüssig aussähe. Beim Ergänzen neuer Klassen daran denken.

joes Statuszeile bleibt invers, egal was -status sagt. Das kommt aus dem \i (= Inverse, joe(1)) am Anfang von -lmsg in ~/.joerc. Wer dort die Palette sehen will, muss das \i entfernen — nicht am Theme drehen.

FZF_DEFAULT_OPTS hängt an, es überschreibt nicht. Die Zeile lautet FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS'…'. Zweimal sourcen hängt den Block zweimal an; funktional gewinnt zwar das letzte --color, sauber ist es nicht. Nach Änderungen exec zsh statt source ~/.zshrc.

joe -term 0..15 reicht auf die Terminal-Palette durch. Das Theme lässt die 16 nummerierten Farben absichtlich auf der Identität (-term 0 0 …), damit alte Syntax-Dateien, die Farben per Nummer angeben, die Terminal-Palette benutzen. Das ist erst korrekt, nachdem das iTerm2-Preset importiert ist — vorher landen solche Dateien auf den grellen Standard-ANSI-Tönen. Auf einem Rechner mit einem anderen, nicht angepassten Terminal gilt dasselbe: dann entweder dort die Palette setzen oder im joe-Theme -term 1 $F38BA8, -term 2 $94E2D5 usw. auf Hex ziehen. Betroffen sind wenige Dateitypen — die mitgelieferten Syntax-Dateien von joe 4.6 benutzen überwiegend Klassennamen statt Nummern.