0. Ist-Zustand
Schon von Omarchy mitgebracht
| Ding | Status | Wo |
|---|---|---|
mise | aktiv, verwaltet node 26.7.0, claude, codex, gh | ~/.config/mise/config.toml |
starship | aktiv, schlanker Prompt (dir + git) | ~/.config/starship.toml |
yay | AUR-Helper | — |
docker | installiert, Service disabled + inaktiv, User nicht in Gruppe docker | siehe §5.2 |
nvim | LazyVim | ~/.config/nvim |
| TUI-Basis | fzf zoxide eza bat ripgrep fd tmux lazygit lazydocker btop | — |
| Theme / Font | Tokyo Night / JetBrainsMono Nerd Font | — |
| Bar | Stock-Layout, idle.screensaver 150s, idle.lock 300s | ~/.config/omarchy/shell.json |
| Hyprland | komplett Stock, alle User-Dateien nur Kommentare | ~/.config/hypr/ |
Bereits installiert (in dieser Session, per pkexec pacman -S)
jdk11-openjdk 11.0.32.1 jdk21-openjdk 21.0.12.1 maven 3.9.16
jdk17-openjdk 17.0.20.1 jdk25-openjdk 25.0.4.1 uv 0.12.5 python-pipx 1.15.0
Alle vier JDKs liegen unter /usr/lib/jvm/java-<N>-openjdk und stammen aus dem offiziellen extra-Repo — sie werden also von omarchy update mitgepflegt. Kein AUR, kein Download-Layer im Home.
extra.jdk25-temurin aus dem AUR brauchst du nicht.Noch offen — alles Weitere in diesem Dokument
- ☐§1
usejavaXX-Aliase einrichten - ☐§1.3 Systemweiten Java-Default von 11 auf 21 ziehen
- ☐§2
mvndinstallieren - ☐§5 Extras nach Bedarf
1. Java 11 / 17 / 21 / 25 mit usejavaXX
1.1 Wie es funktioniert
usejava setzt JAVA_HOME und schiebt das passende bin/ an den PATH-Anfang — nur in der aktuellen Shell. Kein sudo, kein Neuladen, sofort wirksam. Andere Terminals bleiben unberührt, du kannst also links Java 21 und rechts Java 11 fahren.
Das ist bewusst nicht archlinux-java set — das ist systemweit, braucht sudo und reißt dir laufende Prozesse mit.
1.2 Einrichten
Eigene Shell-Erweiterungen kommen nach ~/.config/bash/, nicht direkt in die .bashrc — bleibt übersichtlich und lässt sich einzeln wegnehmen.
Schritt 1 — Datei anlegen:
mkdir -p ~/.config/bash
cat > ~/.config/bash/java.sh <<'EOF'
# ── Java: Versionswechsel pro Shell ──────────────────────────────────────────
# usejava zeigt aktive + verfügbare JDKs
# usejava 17 schaltet DIESE Shell auf Java 17
# usejava17 Kurzform (wird für jedes installierte JDK automatisch erzeugt)
# Quelle: pacman-JDKs unter /usr/lib/jvm/java-<N>-openjdk
USEJAVA_DEFAULT=${USEJAVA_DEFAULT:-21}
usejava() {
local v=${1:-} home
if [[ -z $v ]]; then
printf '☕ aktiv: %s\n' "${JAVA_HOME:-(keins gesetzt)}"
printf ' verfügbar: %s\n' "$_USEJAVA_VERSIONS"
return 0
fi
home=/usr/lib/jvm/java-$v-openjdk
if [[ ! -x $home/bin/javac ]]; then
printf '✗ Kein JDK %s unter /usr/lib/jvm.\n' "$v" >&2
printf ' verfügbar: %s\n' "$_USEJAVA_VERSIONS" >&2
printf ' installieren: sudo pacman -S jdk%s-openjdk\n' "$v" >&2
return 1
fi
# alte JDK-bin-Pfade rauswerfen, damit der PATH nicht zuwuchert
local -a parts keep=()
local p newpath
IFS=: read -r -a parts <<<"$PATH"
for p in "${parts[@]}"; do
[[ $p == /usr/lib/jvm/* ]] && continue
keep+=("$p")
done
printf -v newpath '%s:' "${keep[@]}"
export JAVA_HOME="$home"
export PATH="$home/bin:${newpath%:}"
[[ -n ${_USEJAVA_QUIET:-} ]] || printf '☕ Java %s %s\n' "$v" "$home"
}
# Kurzform-Funktionen + Tab-Completion für jedes installierte JDK erzeugen.
# Kostet keinen einzigen Subprozess beim Shell-Start.
_USEJAVA_VERSIONS=
for _d in /usr/lib/jvm/java-*-openjdk; do
[[ -x $_d/bin/javac ]] || continue
_d=${_d#/usr/lib/jvm/java-}; _d=${_d%-openjdk}
_USEJAVA_VERSIONS+="${_USEJAVA_VERSIONS:+ }$_d"
eval "usejava${_d}() { usejava ${_d}; }"
done
unset _d
[[ -n $_USEJAVA_VERSIONS ]] && complete -W "$_USEJAVA_VERSIONS" usejava
# Default beim Shell-Start setzen (still)
_USEJAVA_QUIET=1 usejava "$USEJAVA_DEFAULT" 2>/dev/null; unset _USEJAVA_QUIET
EOF
Schritt 2 — in der .bashrc einhängen. Ans Ende von ~/.bashrc anfügen:
cat >> ~/.bashrc <<'EOF'
# Eigene Shell-Erweiterungen
for _f in ~/.config/bash/*.sh; do [[ -r $_f ]] && source "$_f"; done
unset _f
EOF
Schritt 3 — neu laden und testen:
exec bash
usejava # ☕ aktiv: /usr/lib/jvm/java-21-openjdk · verfügbar: 11 17 21 25
usejava17 # ☕ Java 17 /usr/lib/jvm/java-17-openjdk
mvn -v | head -3 # Maven meldet jetzt Java 17
usejava21
Getestet — nach vier Wechseln steht weiterhin genau ein JVM-Eintrag im PATH, und mvn folgt JAVA_HOME zuverlässig.
1.3 Systemweiten Default anpassen
Pacman hat beim Installieren java-11-openjdk als System-Default gesetzt (das zuerst installierte gewinnt). Das betrifft alles, was ohne deine Shell startet: .jar-Doppelklicks, systemd-Units, IntelliJ ohne eigenes SDK.
archlinux-java status # aktuellen Default zeigen
sudo archlinux-java set java-21-openjdk # auf 21 ziehen
usejava überschreibt das in der Shell weiterhin — die beiden Ebenen kommen sich nicht in die Quere.
1.4 Erweiterungen
Weitere JDKs. Alias und Completion erscheinen nach dem nächsten Shell-Start automatisch, du musst nichts nachtragen:
sudo pacman -S jdk8-openjdk # → usejava8
sudo pacman -S jdk-openjdk # aktuellstes (derzeit 26) → landet als java-26-openjdk
Anderer Default. In ~/.bashrc vor der Source-Schleife:
USEJAVA_DEFAULT=17
Projektbezogen automatisch umschalten. Falls du das später willst: direnv (sudo pacman -S direnv, eval "$(direnv hook bash)"), dann pro Projekt eine .envrc mit usejava 17. Oder mise mit einer .mise.toml — das ist der Weg, wenn du versionsgenaue, CI-reproduzierbare Pins brauchst. Für den Alltag reicht usejavaXX.
2. Maven & mvnd
2.1 Installation
maven ist durch. mvnd kommt aus dem AUR und hängt hart von maven ab — darum ist beides installiert, auch wenn du im Alltag nur mvnd tippst. IDEs, CI-Skripte und ./mvnw-Wrapper erwarten ein echtes mvn auf dem PATH.
omarchy pkg aur add mvnd
# oder direkt: yay -S mvnd
2.2 Die eine Falle: mvnd und JDK-Wechsel
mvnd hält eine warme JVM im Hintergrund. Wenn du mit usejava17 umschaltest, läuft der alte Daemon mit dem alten JDK weiter und baut fröhlich falsch.
mvnd --status # laufende Daemons + deren JDK
mvnd --stop # alle stoppen — nach jedem JDK-Wechsel, vor dem nächsten Build
Wenn dich das nervt, häng das an ~/.config/bash/java.sh an — dann räumt jeder Wechsel automatisch auf:
# Original unter neuem Namen sichern, dann umhüllen
eval "_usejava_core() $(declare -f usejava | tail -n +2)"
usejava() {
local before=${JAVA_HOME:-}
_usejava_core "$@" || return
if command -v mvnd >/dev/null && [[ ${JAVA_HOME:-} != $before ]]; then
mvnd --stop >/dev/null 2>&1
fi
}
Die usejavaXX-Kurzformen rufen usejava beim Ausführen über den Namen auf und landen dadurch automatisch im Wrapper — du musst sie nicht neu erzeugen. Der Rückgabewert bleibt erhalten (usejava 99 liefert weiterhin 1), und ohne installiertes mvnd passiert schlicht nichts.
2.3 ~/.m2/toolchains.xml — der eigentliche Gewinn bei 4 JDKs
Mit Toolchains sucht sich Maven selbst das richtige JDK, unabhängig davon, welches gerade in deiner Shell aktiv ist. Ein Projekt mit <release>11</release> baut dann gegen echtes JDK 11 statt „JDK 21 im 11er-Kompatibilitätsmodus" — das ist der Unterschied, der API-Fehler zur Compile-Zeit statt in Produktion findet.
cat > ~/.m2/toolchains.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0">
<toolchain>
<type>jdk</type>
<provides><version>11</version><vendor>openjdk</vendor></provides>
<configuration><jdkHome>/usr/lib/jvm/java-11-openjdk</jdkHome></configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides><version>17</version><vendor>openjdk</vendor></provides>
<configuration><jdkHome>/usr/lib/jvm/java-17-openjdk</jdkHome></configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides><version>21</version><vendor>openjdk</vendor></provides>
<configuration><jdkHome>/usr/lib/jvm/java-21-openjdk</jdkHome></configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides><version>25</version><vendor>openjdk</vendor></provides>
<configuration><jdkHome>/usr/lib/jvm/java-25-openjdk</jdkHome></configuration>
</toolchain>
</toolchains>
EOF
Im pom.xml dann:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<version>3.2.0</version>
<executions><execution><goals><goal>select-jdk-toolchain</goal></goals></execution></executions>
<configuration><toolchains><jdk><version>21</version></jdk></toolchains></configuration>
</plugin>
2.4 ~/.m2/settings.xml
Brauchst du erst, wenn private Repos oder ein Mirror dazukommen. Gerüst:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0">
<localRepository>${user.home}/.m2/repository</localRepository>
<servers>
<!-- <server><id>mzone-releases</id><username>…</username><password>…</password></server> -->
</servers>
<mirrors/>
<profiles/>
</settings>
Passwörter gehören verschlüsselt: mvn --encrypt-master-password → ~/.m2/settings-security.xml, dann mvn --encrypt-password. Alternativ die Credentials in Umgebungsvariablen und per ${env.MZONE_REPO_TOKEN} referenzieren.
2.5 Praktische Aliase
Optional nach ~/.config/bash/java.sh (oder eine eigene ~/.config/bash/maven.sh):
alias mvnq='mvn -q'
alias mvnci='mvn clean install'
alias mvnskip='mvn -DskipTests'
alias mvnd-restart='mvnd --stop && mvnd --status'
alias mvntree='mvn dependency:tree'
# Offline bauen — spart bei stabilem Dependency-Set viel Zeit
alias mvndo='mvnd -o'
3. Python
3.1 Die Arch-Regel
System-Python ist 3.14.7 und externally-managed. pip install --user schlägt fehl — und das ist gut so, denn es würde dir sonst Pacman-verwaltete Pakete überschreiben. Zwei saubere Wege, beide installiert:
| Zweck | Werkzeug |
|---|---|
| Projekt-Dependencies, venvs, Python-Versionen | uv |
Globale CLI-Tools (ruff, httpie, ansible…) | uv tool oder pipx |
~/.local/bin liegt bei Omarchy schon im PATH (default/bash/envs), du musst also kein pipx ensurepath laufen lassen.
3.2 uv im Alltag
# Neues Projekt
uv init mein-projekt && cd mein-projekt
uv add requests pydantic # Dependency + Lockfile + venv in einem Rutsch
uv run python main.py # ohne "activate", nutzt automatisch das venv
uv sync # Lockfile → venv, reproduzierbar
# Bestehendes Projekt
uv venv # .venv anlegen
uv pip install -r requirements.txt
source .venv/bin/activate # falls du es doch klassisch willst
# Andere Python-Versionen (unabhängig vom System-Python)
uv python install 3.11 3.12
uv python list
uv venv --python 3.11
3.3 Globale Tools
uv tool install ruff # schnell, empfohlen
uv tool list
uv tool upgrade --all
# pipx-Äquivalent, falls du es lieber magst
pipx install httpie
pipx list
~/.local/bin und rätselst, welcher gewinnt. Ich würde konsequent uv tool nehmen und pipx nur liegen lassen.3.4 Optionale Aliase
# ~/.config/bash/python.sh
alias venv='uv venv'
alias act='source .venv/bin/activate'
alias py='python3'
alias uvr='uv run'
4. Ricing — was sich lohnt und was nicht
4.1 Die drei Regeln
- Niemals etwas unter
/usr/share/omarchy/ändern. Das gehört dem Paket und wird beim nächstenomarchy updateüberschrieben. Lesen ist ausdrücklich erwünscht und der beste Weg, Omarchy zu verstehen. - Alles Eigene kommt nach
~/.config/. Omarchy lädt seine Defaults zuerst, deine Dateien danach — du überschreibst also, statt zu ersetzen. - Wenn etwas kaputtgeht:
omarchy refresh <ding>legt ein Backup an und stellt den Default wieder her.omarchy refresh hyprland,omarchy refresh shell, …
Landkarte:
~/.config/hypr/ Fenstermanager
bindings.lua Tastenkürzel
monitors.lua Displays
input.lua Tastatur, Maus, Touchpad
looknfeel.lua Gaps, Borders, Animationen, Rounding
autostart.lua Startprogramme
hyprsunset.conf Nachtlicht (→ omarchy restart hyprsunset)
xdph.conf Screensharing (→ greift beim nächsten Login)
~/.config/omarchy/
shell.json Bar-Layout, Widgets, Idle/Lock
extensions/omarchy-menu.jsonc Eigene Einträge im Super-Menü
plugins/<user>.<name>/ Geklonte, editierbare Bar-Widgets
hooks/<event>.d/ Automatik bei Systemereignissen
themes/<slug>/ Eigene Themes / Overlays über Stock-Themes
themed/<config>.tpl Wie ein App-Config für ALLE Themes erzeugt wird
backgrounds/<theme-slug>/ Zusätzliche Wallpapers
~/.config/{alacritty,foot,kitty,ghostty}/ Terminals (→ omarchy restart terminal)
~/.config/starship.toml Prompt
~/.config/btop/ ~/.config/lazygit/ ~/.config/nvim/
4.2 Stufe 1 — hoher Effekt, ~20 Minuten
Theme. 22 Stock-Themes sind da, du fährst Tokyo Night.
omarchy theme list
omarchy theme set kanagawa # Namen oder Slug, beides geht
omarchy theme bg next # Wallpaper durchblättern
omarchy theme install <git-url> # Theme aus dem Netz
Ein Theme färbt Hyprland, Bar, Terminal, btop, nvim, Chromium und die GTK-Anwendungen gemeinsam — das ist der Punkt, an dem Omarchy die meiste Arbeit abnimmt. Genau deshalb: Finger weg von per-App-Farbfummelei, sonst bricht der Theme-Wechsel.
Ein Stock-Theme anpassen — als Overlay, nicht als Kopie:
mkdir -p ~/.config/omarchy/themes/tokyo-night
cp /usr/share/omarchy/themes/tokyo-night/colors.toml ~/.config/omarchy/themes/tokyo-night/
$EDITOR ~/.config/omarchy/themes/tokyo-night/colors.toml
omarchy theme set tokyo-night # Stock wird zuerst kopiert, deine Datei gewinnt oben drauf
Nur die Dateien anlegen, die du ändern willst. Der Rest kommt weiter vom Paket und wird mitgepflegt.
Font. Bei dir sind nur 5 Monospace-Fonts installiert.
omarchy font list
omarchy font current
omarchy font set "JetBrainsMono Nerd Font"
omarchy install font "Maple Mono" ttf-maplemono-nf "MapleMono NF"
Lohnende Nerd-Font-Kandidaten: ttf-cascadia-mono-nerd, ttf-iosevka-nerd, ttf-firacode-nerd, otf-monaspace-nerd. Bei einem Retina-Panel lohnt außerdem:
omarchy display text size 1.1 # skaliert Bar, GTK-Apps und Terminals gemeinsam
Prompt. Dein starship.toml zeigt nur Verzeichnis + Git. Für Java-Arbeit sinnvoll — ans Ende der Datei, und $java ins format aufnehmen:
format = "[$directory$git_branch$git_status]($style)$java$character"
[java]
format = "[☕$version]($style) "
style = "italic yellow"
# Nur in Java-Projekten anzeigen — starship erkennt pom.xml/build.gradle selbst
[java] ruft java -version auf. Dein command_timeout steht auf 200 ms — das reicht auf dem i7-9750H, aber wenn der Prompt zäh wird, ist das der Verdächtige. Alternative ohne Fork: ${custom.jdk} mit command = 'basename ${JAVA_HOME:-none}'.Terminal. Du hast alacritty, foot, kitty und ghostty parallel installiert — alle vier werden vom Theme mitgefärbt. Entscheide dich für eines:
omarchy default terminal ghostty # setzt auch Super+Return und xdg-terminal-exec
omarchy restart terminal
Kurz zur Auswahl: ghostty ist der beste Allrounder (schnell, gute Ligatur-/Font-Behandlung, native Wayland). foot ist am sparsamsten — auf einem Laptop mit Akku messbar. kitty kann Bilder und Grafik im Terminal. alacritty ist am schlichtesten. Auf einem MacBook würde ich foot oder ghostty nehmen.
4.3 Stufe 2 — Hyprland
Alle deine ~/.config/hypr/*.lua bestehen derzeit nur aus Kommentaren, du fährst also 100 % Stock. Änderungen greifen beim Speichern automatisch.
Nach jeder Änderung validieren — sonst merkst du Syntaxfehler erst, wenn was fehlt:
hyprctl reload && hyprctl configerrors
Keybindings (~/.config/hypr/bindings.lua). Erst schauen, was schon belegt ist:
omarchy menu keybindings --print
Ein belegtes Kürzel muss vor dem Neubelegen ge-unbind-et werden:
-- SUPER+SHIFT+M: Projekt-Terminal im Publisher-Repo
o.bind("SUPER + SHIFT + M", "mzone-cli", "ghostty --working-directory=/home/mzone/gitea/vps")
-- Bestehendes Kürzel ersetzen: erst lösen, dann neu binden
hl.unbind("SUPER + F")
o.bind("SUPER + F", "Dateimanager", { launch = "nautilus" })
{ launch = "…" } statt eines nackten Strings wickelt den Start in uwsm-app — das Programm hängt dann nicht am Terminal-Prozessbaum. Für GUI-Apps immer die launch-Form nehmen.
Look'n'feel (~/.config/hypr/looknfeel.lua). Realistische Einschätzung für deine Hardware: Blur ist auf der MacBook-GPU der teuerste Effekt und kostet spürbar Akku. Animationen sind vergleichsweise billig.
hl.config({
general = { gaps_in = 4, gaps_out = 8, border_size = 2 },
decoration = { rounding = 8, dim_inactive = true, dim_strength = 0.12 },
})
Für maximale Akkulaufzeit unterwegs: rounding = 0, Blur aus, animations.enabled = false.
Fensterregeln. ⚠️ Die Hyprland-Syntax für Window Rules ändert sich zwischen Versionen regelmäßig. Vor dem Schreiben immer gegenprüfen: https://wiki.hypr.land/Configuring/Basics/Window-Rules/ und cat /usr/share/omarchy/default/hypr/windows.lua als Vorlage. Omarchys Helper ist o.window(match, rules).
Typischer Java-Bedarf: IntelliJs Splash-Screen und Completion-Popups verhalten sich unter Wayland ohne Regel oft daneben (eigenes Tile, falscher Fokus).
Monitore (~/.config/hypr/monitors.lua):
hyprctl monitors all # Namen und unterstützte Modi
hl.monitor({ output = "eDP-1", mode = "3072x1920@60", position = "0x1440", scale = 2 })
hl.monitor({ output = "DP-1", mode = "2560x1440@60", position = "0x0", scale = 1 })
Auf dem MacBook-Retina-Panel ist scale = 2 richtig; bei scale = 1.5 matschen XWayland-Apps (u. a. ältere JetBrains-Builds).
4.4 Stufe 3 — Bar, Menü, Hooks
Bar (~/.config/omarchy/shell.json, hot-reload beim Speichern). Deine ist exakt das Default-Layout.
omarchy bar move omarchy.weather --section right
omarchy bar position bottom
omarchy bar transparent toggle
omarchy bar reset
Für ein eigenes Widget — z. B. „aktives JDK" in der Bar — ein Stock-Plugin klonen statt das Paket anzufassen:
omarchy plugin clone omarchy.clock
# → ~/.config/omarchy/plugins/mzone.clock/ · Speichern lädt automatisch neu
Das ist Quickshell/QML. Wenn du QML nicht magst: der Aufwand steht m. E. nur dafür, wenn du das Widget wirklich täglich ablesen willst. Ein JDK-Anzeiger in der Bar ist ohnehin fragwürdig, weil usejava pro Shell wirkt — die Bar könnte gar nicht wissen, welche Shell du meinst. Der Prompt (§4.2) ist dafür der richtige Ort.
Idle & Lock. Bei dir: Screensaver nach 150 s, Sperre nach 300 s. In Sekunden:
"idle": { "screensaver": 600, "lock": 1200 }
Menü (~/.config/omarchy/extensions/omarchy-menu.jsonc, hot-reload). Die Datei ist bei dir noch reine Doku. Die Eltern-Ebene ergibt sich aus der Punkt-Notation der ID:
{
"dev": { "icon": "", "label": "Dev" },
"dev.mzone": { "icon": "", "label": "mzone-cli",
"action": "ghostty --working-directory=/home/mzone/gitea/vps" },
"dev.mvnstop": { "icon": "", "label": "mvnd stoppen", "action": "mvnd --stop",
"when": "command -v mvnd" },
"dev.docker": { "icon": "", "label": "lazydocker",
"action": "omarchy-launch-or-focus-tui lazydocker" }
}
when blendet die Zeile aus, wenn das Kommando fehlschlägt; checked hängt ein ✓ an, wenn es erfolgreich ist.
Hooks — Skripte, die bei Systemereignissen laufen:
~/.config/omarchy/hooks/
theme-set.d/ nach Theme-Wechsel (Theme-Slug in $1)
font-set.d/ nach Font-Wechsel (Font-Name in $1)
post-boot.d/ nach Desktop-Start
post-update.d/ während omarchy update
battery-low.d/ Akku niedrig (Prozent in $1)
omarchy hook install theme-set ~/bin/mein-theme-hook
In *.d/ liegen bei dir schon .sample-Dateien als Vorlage. Praktischer Anwendungsfall für dich: bei theme-set das IntelliJ-Theme nachziehen.
4.5 Was ich lassen würde
- Jede App einzeln einfärben. Das Theme macht das systemweit und konsistent. Handfärbung bricht beim nächsten
omarchy theme set. Wenn du das Ergebnis für alle Themes ändern willst, schreib die Vorlage:~/.config/omarchy/themed/<name>.tpl. - Hyprland-Defaults ersetzen (
omarchy_default_bindings = false). Du wirfst die gesamte durchdachte Standardbelegung weg und baust sie mühsam nach. Einzelne Kürzel gezieltunbind-en ist der bessere Weg. - Volles Blur + Schatten + Dim + lange Animationen auf dem Laptop. Sieht in Screenshots gut aus, kostet dich unterwegs echte Akkuminuten.
archlinux-javafür den Alltagswechsel. Systemweit,sudo, reißt laufende Prozesse mit. Dafür gibt esusejava.- Eine zweite Konfigebene neben mise (asdf, SDKMAN). mise ist da und in Omarchys bash-init verdrahtet. Zwei Versionsmanager im PATH = Debugging-Hölle.
4.6 System-Pflege
omarchy update # System + Omarchy + Migrationen
omarchy version
omarchy channel current # stable | rc | edge | dev
omarchy debug --no-sudo --print # Diagnose — immer mit diesen Flags
omarchy commands # ALLE Befehle mit Beschreibung
omarchy commands --json # maschinenlesbar
omarchy <gruppe> --help # z. B. omarchy theme --help
omarchy commands ist der beste Einstieg — es gibt weit mehr als man vermutet (Audio-Routing, DDC-Helligkeit für externe Monitore, Hibernation-Setup, Fingerprint, QR-Code aus dem Screenshot lesen, OCR-Textextraktion).
5. Extras
5.1 Java-IDE & LSP
IntelliJ IDEA — Community liegt in extra, Ultimate im AUR:
omarchy pkg add intellij-idea-community-edition
# oder
omarchy pkg aur add intellij-idea-ultimate-edition
Für dein Spring-Boot-4.1-Projekt: in IntelliJ das Projekt-SDK explizit auf /usr/lib/jvm/java-21-openjdk setzen (File → Project Structure → SDKs), nicht auf „Detected". Sonst nimmt es den System-Default aus §1.3.
Wenn die Oberfläche unter Wayland zickt (Fokusverlust, unscharfe Schrift), im JetBrains Toolbox/idea.vmoptions: -Dawt.toolkit.name=WLToolkit erzwingt den nativen Wayland-Toolkit; das Gegenteil (-Dawt.toolkit.name=XToolkit) fällt auf XWayland zurück und ist der stabilere Fallback.
nvim als Java-Editor. Du fährst LazyVim — da ist der Weg genau einer:
:LazyExtras
… lang.java auswählen und mit x aktivieren, dann nvim neu starten. LazyVim zieht nvim-jdtls, den Debug-Adapter und die Test-Integration selbst. Zusätzlich das Sprachserver-Paket:
omarchy pkg aur add jdtls
jdtls braucht mindestens Java 21 zum Laufen (auch wenn es Java-11-Projekte indiziert). Da dein USEJAVA_DEFAULT auf 21 steht, passt das. Falls du mal in einer Java-11-Shell nvim startest, jdtls aber meckert, setz in der jdtls-Config ein festes JAVA_HOME.
Omarchy-integrierte Editoren (bekommen das Theme automatisch mit):
omarchy install editor vscode # bzw. zed | helix | emacs
5.2 Docker-DBs & Dev-Services
⚠️ Bei dir ist Docker installiert, aber der Dienst ist disabled und du bist nicht in der Gruppe docker (groups → mzone input wheel). Das zuerst:
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
Die Gruppenmitgliedschaft greift erst nach Neuanmeldung (nicht nur neue Shell). Zwischendurch testen: newgrp docker && docker ps.
usermod -aG docker ist faktisch Root-Äquivalenz — wer in der Gruppe ist, kann sich über einen Container Root auf dem Host holen. Auf einem Einzelplatz-Laptop ist das der übliche Kompromiss. Wenn dir das nicht passt, ist rootless Docker oder podman die Alternative.Dann:
omarchy install docker dbs # interaktiver Picker: Postgres, MySQL, Redis, …
Das legt Container mit sinnvollen Dev-Defaults an (Ports gemappt, Volume persistent, Passwort gesetzt). Zu deinem Publisher-Stack passt Postgres; Keycloak läuft ja remote auf auth.maierzone.de, das brauchst du lokal nicht.
Bedienung danach: lazydocker (schon installiert).
5.3 Tailscale & Remote
omarchy install service tailscale
sudo tailscale up # öffnet Browser zum Verknüpfen
tailscale status
Danach erreichst du deinen VPS über den MagicDNS-Namen statt über die öffentliche IP — und kannst SSH auf dem VPS auf das Tailnet beschränken.
Tailscale SSH (spart dir Key-Verteilung komplett, Auth läuft über die Tailscale-Identität):
sudo tailscale up --ssh # auf beiden Seiten
ssh mzone@<maschinenname>
SSH-Config für den klassischen Weg (~/.ssh/config):
Host vps
HostName <dein-host>
User mzone
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 60
ssh-keygen -t ed25519 -C "mzone@omarchy"
ssh-copy-id vps
Weitere Bausteine aus dem Omarchy-Universum:
omarchy install service 1password # Secrets + Chromium-Extension
omarchy install service sunshine # Remote-Desktop-Host (Moonlight-Client), öffnet LAN+Tailscale-Ports
omarchy setup security fingerprint # Touch ID auf dem MacBook — falls der Sensor unterstützt wird
5.4 TUI-Feinschliff
Der Großteil ist schon da. Es fehlt praktisch nur:
omarchy pkg add yazi # Dateimanager mit Bildvorschau
Sinnvolle Ergänzungen in ~/.config/bash/tui.sh:
# yazi: beim Verlassen ins zuletzt besuchte Verzeichnis wechseln
y() {
local tmp; tmp=$(mktemp -t yazi-cwd.XXXXXX) cwd
yazi "$@" --cwd-file="$tmp"
cwd=$(command cat -- "$tmp") && [[ -n $cwd && $cwd != "$PWD" ]] && builtin cd -- "$cwd"
rm -f -- "$tmp"
}
alias lg='lazygit'
alias ld='lazydocker'
alias ll='eza -lah --git --icons --group-directories-first'
alias lt='eza --tree --level=2 --icons'
alias cat='bat --paging=never'
# Git-Branch per fzf wechseln
fbr() {
local b; b=$(git branch --all | grep -v HEAD | fzf --height 40% --reverse) || return
git checkout "$(sed 's#.*remotes/origin/##;s/^[* ] //' <<<"$b")"
}
fzf, zoxide (→ z <teilpfad>) und die fzf-Keybindings (Ctrl+R History, Ctrl+T Dateien, Alt+C cd) sind von Omarchy bereits verdrahtet — siehe /usr/share/omarchy/default/bash/init.
tmux. ~/.config/tmux/ existiert. Wenn du es ernsthaft nutzt, lohnen sich tpm + tmux-resurrect (Sessions überleben Reboots) und vim-tmux-navigator (nahtloses Ctrl+hjkl zwischen nvim-Splits und tmux-Panes).
6. Cheatsheet
# ── Java ──────────────────────────────────────────────────────────
usejava aktives + verfügbare JDKs
usejava11 / 17 / 21 / 25 Shell umschalten (Tab-Completion aktiv)
usejava 25 Langform
archlinux-java status systemweiter Default
sudo archlinux-java set java-21-openjdk
# ── Build ─────────────────────────────────────────────────────────
mvn -v Maven + aktiv genutztes JDK
mvnd --status / --stop Daemon prüfen / nach JDK-Wechsel stoppen
mvn dependency:tree
# ── Python ────────────────────────────────────────────────────────
uv init / add / run / sync
uv python install 3.11
uv tool install <tool>
# ── Omarchy ───────────────────────────────────────────────────────
omarchy commands alle Befehle
omarchy theme list|set|bg next
omarchy font list|set
omarchy bar move <id> --section <left|center|right>
omarchy pkg add <pkg> · omarchy pkg aur add <pkg>
omarchy install dev-env <sprache>
omarchy update · omarchy debug --no-sudo --print
omarchy refresh hyprland|shell Reset mit Backup
# ── Hyprland ──────────────────────────────────────────────────────
omarchy menu keybindings --print
hyprctl reload && hyprctl configerrors nach JEDER .lua-Änderung
hyprctl monitors all
7. Referenzen
- Omarchy: https://omarchy.org/ · Handbuch: https://learn.omacom.io/2/the-omarchy-manual
- Hyprland-Wiki: https://wiki.hypr.land/ (Window Rules immer hier gegenprüfen)
- mise: https://mise.jdx.dev/lang/java.html
- uv: https://docs.astral.sh/uv/
- Arch Java-Paketrichtlinie: https://wiki.archlinux.org/title/Java
- Maven Toolchains: https://maven.apache.org/guides/mini/guide-using-toolchains.html
- Lokal am aufschlussreichsten:
ls /usr/share/omarchy/default/undomarchy commands