100 lines
4.3 KiB
Markdown
100 lines
4.3 KiB
Markdown
# MiniTerm — winzige eigenständige Terminal-Apps für macOS
|
|
|
|
Ein minimaler, auf **SwiftTerm** basierender Terminal-Emulator. Sinn der Sache:
|
|
jede erzeugte `.app` ist eine **eigene macOS-App mit eigener Bundle-ID** — also
|
|
**eigenes Dock-Icon und eigener ⌘-Tab-Eintrag**. Genau das, was sich unter macOS
|
|
mit `--class` (wie bei Alacritty/Ghostty unter Linux) *nicht* lösen lässt.
|
|
|
|
Jede App startet in einem konfigurierbaren **Arbeitsverzeichnis** und führt einen
|
|
konfigurierbaren **Befehl** aus (z. B. `claude`). Für Claude Code reicht das
|
|
locker — SwiftTerm ist ein vollwertiger xterm-256color-kompatibler Emulator.
|
|
|
|
## Voraussetzungen
|
|
|
|
- macOS 13+ und **Xcode** bzw. die Command Line Tools (`xcode-select --install`)
|
|
- Swift (kommt mit Xcode)
|
|
|
|
## Schnellstart
|
|
|
|
```bash
|
|
cd MiniTerm
|
|
chmod +x make-app.sh
|
|
|
|
./make-app.sh \
|
|
--name "Claude · Projekt A" \
|
|
--bundle-id com.deinname.claude.projekta \
|
|
--workdir ~/code/projekt-a \
|
|
--command "claude"
|
|
```
|
|
|
|
Beim ersten Lauf wird das Binary einmal gebaut (`swift build -c release`,
|
|
lädt SwiftTerm). Danach liegt die App in `~/Applications/Claude · Projekt A.app`
|
|
— per Doppelklick starten, Dock-Icon erscheint als eigene App.
|
|
|
|
## Mehrere Apps (eigene Icons/Configs)
|
|
|
|
Einfach pro App einmal aufrufen. Das Binary wird nur einmal kompiliert und
|
|
wiederverwendet:
|
|
|
|
```bash
|
|
./make-app.sh --name "Claude · Webshop" --bundle-id com.deinname.claude.webshop \
|
|
--workdir ~/code/webshop --command "claude" --icon ./icons/shop.icns
|
|
|
|
./make-app.sh --name "Claude · Infra" --bundle-id com.deinname.claude.infra \
|
|
--workdir ~/code/infra --command "claude" --icon ./icons/infra.icns
|
|
|
|
./make-app.sh --name "Scratch Shell" --bundle-id com.deinname.scratch \
|
|
--workdir ~ --command "" # leer = einfache Shell
|
|
```
|
|
|
|
## Optionen
|
|
|
|
| Flag | Pflicht | Bedeutung |
|
|
|----------------|---------|--------------------------------------------------------|
|
|
| `--name` | ja | Anzeigename + Dateiname der App |
|
|
| `--bundle-id` | ja | Eindeutige Bundle-ID (gibt die eigene App-Identität) |
|
|
| `--workdir` | nein | Startverzeichnis (`~` wird expandiert; leer = Home) |
|
|
| `--command` | nein | Befehl beim Start (leer = nur eine Login-Shell) |
|
|
| `--font-size` | nein | Schriftgröße (Default 13) |
|
|
| `--font` | nein | Schriftfamilie (Default Menlo; Fallback System-Mono) |
|
|
| `--icon` | nein | PNG/JPG (wird automatisch konvertiert) oder `.icns` |
|
|
| `--out` | nein | Zielordner (Default `~/Applications`) |
|
|
|
|
## Icon aus einem PNG
|
|
|
|
`--icon` nimmt direkt ein **PNG** (oder JPG) — das Skript erzeugt daraus
|
|
automatisch alle nötigen Größen und das `.icns` (via `sips`/`iconutil`):
|
|
|
|
```bash
|
|
./make-app.sh --name "Claude · Infra" --bundle-id com.deinname.claude.infra \
|
|
--workdir ~/code/infra --command "claude" --icon ~/Downloads/infra.png
|
|
```
|
|
|
|
Am besten ein **quadratisches** Bild nehmen, sonst verzerrt `sips` es. Eine
|
|
fertige `.icns`-Datei kannst du weiterhin auch direkt angeben.
|
|
|
|
## Wie die Konfiguration funktioniert
|
|
|
|
Das kompilierte Binary ist für alle Apps identisch. Die Unterschiede stecken in
|
|
der `Info.plist` jedes Bundles (Schlüssel `MTCommand`, `MTWorkingDirectory`,
|
|
`MTWindowTitle`, `MTFontSize`, `MTFontName`). Das Programm liest sie beim Start aus
|
|
`Bundle.main`. So genügt ein Build für beliebig viele Apps.
|
|
|
|
## Hinweise
|
|
|
|
- Der Befehl läuft immer über eine **Login-Shell** (`zsh -l`), damit PATH stimmt
|
|
(Homebrew, `~/.local/bin` usw.) und `claude` gefunden wird.
|
|
- Nach Beenden des Befehls fällt das Fenster in eine normale Shell zurück
|
|
(`exec zsh -l`), schließt sich also nicht sofort.
|
|
- Die App ist **ad-hoc signiert**. Beim ersten Start ggf. Rechtsklick → „Öffnen",
|
|
falls Gatekeeper meckert.
|
|
- SwiftTerm-Version: im `Package.swift` auf `branch: "main"`. Für reproduzierbare
|
|
Builds dort auf einen festen Tag (`from: "..."`) umstellen.
|
|
|
|
## Tastatur
|
|
|
|
- **Enter** sendet wie gewohnt einen Wagenrücklauf (`\r`) → Eingabe absenden.
|
|
- **Shift+Enter** sendet einen Zeilenumbruch (`\n`) → für mehrzeilige Eingaben,
|
|
z. B. in Claude Code. Gilt auch für Enter auf dem Ziffernblock.
|
|
- ⌘C / ⌘V funktionieren über das Edit-Menü.
|