# 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 ```sh git clone ~/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: ```json { "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:`; 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.