Files
mwxcol/README.md
T

241 lines
12 KiB
Markdown

# 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 <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:
```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:<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.