Zellij

Zellij ist ein „Terminal-Workspace“ und -Multiplexer der einen starken Fokus auf Funktionalität und einfache Bedienbarkeit bei gleichzeitiger Nicht-Notwendigkeit von Konfiguration legt, aber dennoch umfänglich konfigurierbar und durch Plugins erweiterbar ist.
Es können nicht nur mehrere Terminal-„Fenster“ parallel angeordnet werden, man kann sie auch einklappen oder sogar aus dem Raster loslösen. Die Verwaltung kann dabei zusätzlich noch in Tabs aufgeteilt werden. Selbstverständlich kann man mit Zellij auch beliebig viele Sessions erstellen und zwischen ihnen wechseln, sich von ihnen trennen, und später wieder mit ihnen verbinden.
Installation
Das Programm ist als
zellij
in extra
verfügbar, und kann von dort
mittels Pacman
installiert werden.
Beim ersten Starten werden automatisch Dinge im Usercontext nachgeladen und eingerichtet, die für die Verwendung von Zellij notwendig sind.
Konfiguration
Standardmäßig ist Zellij bereits sehr benutzerfreundlich und für die interaktive Verwendung durch eine Vielzahl an Tastenkombinationen vorkonfiguriert. Will man dennoch eigene Optionen setzen, so kann man dies mittels der KDL Document Language (siehe Weblinks) gemacht werden. Zellij bezieht die Konfiguration dabei in dieser Reihenfolge aus dem angegebenen Verzeichnissen:
- der Parameter
--config-dir
- die Umgebungsvariable
ZELLIJ_CONFIG_DIR
- Userbezogen aus
$HOME/.config/zellij
- Systemweit aus
/etc/zellij
Änderungen an den Dateien im jeweiligen Konfigurationsverzeichnis werden von Zellij automatisch erkannt und ohne Neustart angewendet. Sofern in Neustart erforderlich ist, ist dies in der generierten Konfigurationsdatei dokumentiert.
Alle Beispiele hier im Wiki gehen davon aus, dass beim ersten starten die Option „Default“ gewählt wurde. Nach der Auswahl kann man über Strg+P, C den Konfigurationsdialog öffnen. Dort kann man mittels Tab ↹ zur Modusauwahl kommen, und den Modus wie beschrieben einstellen.
Will man Zellij ohne jegliche Konfiguration starten, geht dies mittels zellij --clean
.
Verwendung mit Standardkonfiguration
Wenn man eine neue Session startet, öffnet sich Zellij mit einem Tab in dem ein Pane (quasi ein „Fenster“) befindet. Solange sich nur ein Pane im Layout befindet, wird dies immer im „Vollbildmodus“ angezeigt.
Zellij besitzt sehr viele Tastenkombinationen, einige dieser Kombinationen könnten eventuell von den laufenden Programmen verwendet werden. Da Tastenkombinationen von Zellij „abgefangen“ werden, wären diese in den Anwendungen nicht verfügbar. Mittels Strg+G lässt sich Zellij sperren, so dass keinerlei Tastenkombinationen (bis auf Strg+G zum entsperren) mehr abgefangen werden.
Panes
Mittels Strg+P, N (oder Alt+N) wird ein neues Pane erstellt.
Standardmäßig befindet Zellij sich im „Vertical“-Layout, und das neue Pane wird rechts vom ersten Pane geöffnet. Mittels Alt+[ und ] kann zwischen den Layouts durchgeschaltet werden. Alt+F schaltet den Floating-Layer (Layout: „Staggered“) um, auf dem die „schwebenden Fenster“ verwaltet werden.
Die Panes können, sofern unter einer grafischen Oberfläche in einem Terminalemulator mit Mausunterstützung laufend, durch anklicken ausgewählt werden. Mittels Alt+↑/↓/←/→ kann der Fokus innerhalb des Layouts per Tastenkombination geändert werden. Die Auswahl per Mauscursor funktioniert auch dann noch, wenn die Tastenkombinationen mittels Strg+G gesperrt wurden.
Im Pane-Modus (Strg+P) kann mit den Pfeiltasten ebenfalls der Fokus verändert werden, dort bestätigt man das neue Pane durch ↵ Enter Mittels E im Pane-Modus kann man das ausgewählte Pane aus dem Layout in den Floating-Layer oder aus diesem zurück verschieben. Um ein Pane innerhalb des Layouts zu verschieben, wechselt man in den Move-Modus (Strg+H) und kann dann die Pfeiltasten zum verschieben benutzen.
Die Panegröße kann man im Resize-Modus (Strg+N) verändern. Mittels ←/↓/↑/→ oder H/J/K/L vergrößert man die jeweilige Seite des Panes, und mittels ⇧ Shift+H/J/K/L verkleinert man die jeweilige Seite, um das gewünschte Seitenverhältnis zu erlangen. Mittels + und − vergrößert, bzw. verkleinert man das gesamte Pane im eingestellten Seitenverhältnis.
Tabs
Tabs starten immer im „Vertical“-Layout mit einem Pane mit der Shell. Das Layout und der Floating-Layer sind pro Tab unabhängig voneinander.
Tabs können im Tab-Modus verwaltet und angesprochen werden. Mittels Strg+T, N wird ein neues Tab erstellt, X schließt das aktuelle Tab. Alle geöffneten Panes des Tabs werden dabei ebenfalls geschlossen. Mittels der Pfeiltasten wird im Tab-Modus zwischen existierenden Tabs gewechselt und mittels ↵ Enter ausgewählt. Tabs können im Tab-Modus über R umbenannt werden. Auch Tabs können immer per Mauscursor ausgewählt werden, sofern der Terminalemulator Maus-Support aktiviert hat.
Einzelne Panes lassen sich aus einem Tab mittels Strg+T, B herauslösen. Dadurch wird ein eigenes Tab für das aktive Pane eröffnet und dieses Pane dann dort hin verschoben und direkt auch dort hin gewechselt. Mittels [ oder ] im Tab-Modus kann das Pane auf das vorherige/nächste existierende Tab verschoben werden.
Für Tabs kann mittels Strg+T, S der Sync-Modus umgeschaltet werden, in diesem Modus werden Eingaben unabhängig des aktiven Panes immer an alle Panes gesendet, damit lassen sich zum Beispiel auf mehreren per SSH verbundenen Systemen parallel die gleichen Aktionen ausführen, um zum Beispiel ein manuelles Backup auszulösen oder auf allen Geräten ein Update zu durchzuführen.
Sessions

Wenn Zellij gestartet wird, wird eine Session mit einem zufällig generierten Namen gestartet. Wenn man das letzte Pane in der Session schließt, oder Zellij mittels Strg+Q beendet, wird die Session wieder entfernt. Wenn man das Terminalfenster in dem Zellij läuft schließt, oder wenn man Zellij mittels Strg+O, D verlässt, bleibt die Session bestehen.
Sessions können über den integrierten Session-Manager (Strg+O, W) eingesehen und verwaltet werden. Man kann sich auch direkt aus anderen Sessions in bestehende Sessions einklinken. Wenn man mittels Tab ↹ im Session Manager zu „Resurrect“ wechselt, kann man zudem geschlossene Sessions „wiederbeleben“. Dabei werden alle Panes wieder hergestellt, Panes in denen Programme liefen, die nicht die Shell waren, müssen bestätigt werden. Mittels Esc kann man stattdessen auch zurück zur Shell gehen.
Mittels zellij attach
kann man sich zu einer bestehenden Session verbinden. Wenn nur eine Session läuft, verbindet sich Zellij automatisch zu dieser. Wenn mehrere Sessions laufen, werden diese aufgelistet.
zellij attach
Please specify the session to attach to, either by using the full name or a unique prefix. The following sessions are active: outstanding-oboe [Created 4m 48s ago] (EXITED - attach to resurrect) blossoming-goose [Created 6m 43s ago] vitreous-cowbell [Created 7m 50s ago] beautiful-penguin [Created 8m 24s ago] [...]
Anhand dieser Liste muss man nun einen „eindeutigen Prefix“ ermitteln. Mittels diesem kann man sich dann zur Session verbinden. Will man sich zur Session vitreous-cowbell
verbinden, reicht zellij attach v
, für die Session beautiful-penguin
würde nur b
nicht ausreichen, weil nicht eindeutig, hier würde man dann zellij attach be
benutzen. Selbstverständlich kann auch immer der ganze Name benutzt werden.
Mehrbenutzer-Bedienung

Es besteht die Möglichkeit, sich aus mehreren Instanzen heraus mit derselben Session zu verbinden. Jede Instanz erhält von Zellij automatisch eine Farbe zugewiesen, über diese Farbe ist eine eindeutige Identifikation möglich.
Jede verbundene Zellij-Instanz kann unabhängig von anderen Instanzen den Fokus auf andere Panes und Tabs setzen, zudem können die Instanzen unabhängig voneinander Texteingaben tätigen.
So kann man sich zum Beispiel zweimal mit einer Instanz verbinden – jeweils auf unterschiedlichen Monitoren – und in der einen Instanz Eingaben tätigen, die etwas auslösen, das man aber nicht direkt sehen kann. Mit der anderen Instanz kann man sich zur gleichen Session auf einem zweiten Tab verbinden, um dort dann die Ausgaben zu prüfen, ohne dass man ständig zwischen den Tabs wechseln muss, da man beides auf separaten Monitoren hat. Gleichzeitig hat man z.B. auf dem Server aber nur eine Zellij-Instanz laufen.
Dies könnte man auch mit zwei Panes im gleichen Tab erreichen, wenn das Tab aber schon sehr viele Panes hat, ist dies eventuell die einfachere Variante.
Plugins


Über den Plugin-Manager (Strg+O, P) können die aktuellen Plugins angezeigt werden, zudem besteht im Pluginmanager mittels Strg+A die Möglichkeit, entweder über einen URL oder über eine lokale Datei ein neues Plugin zum Testen zur aktuellen Session hinzuzufügen.
Will man Plugins dauerhaft hinzufügen, so muss man sie im Konfigurationsverzeichnis unter plugins
ablegen. Sofern Plugins eine Tastenkombination benötigen, so muss diese in der Konfigurationsdatei eingerichtet werden.

Um beispielsweise das Plugin Room zu installieren, das ein Pane mit allen offenen Tabs erstellt, aus denen man das gewünschte einfach per Pfeiltasten und Enter auswählen kann:
mkdir -p ~/.config/zellij/plugins curl -L "https://github.com/rvcas/room/releases/latest/download/room.wasm" -o ~/.config/zellij/plugins/room.wasm
Dies lädt das Plugin an die passende Stelle herunter. Damit das Plugin aufgerufen werden kann, muss es in der Konfigurationsdatei an eine Tastenkombination gebunden werden.
~/.config/zellij/config.kdl
shared_except "locked" { bind "Ctrl z" { LaunchOrFocusPlugin "file:~/.config/zellij/plugins/room.wasm" { floating true ignore_case true quick_jump true } } }
Mit dieser Konfiguration lässt das Plugin sich im entsperrten Zustand direkt (oder bei der Standardmäßig gesperrten Konfiguration erst nach Strg+G) mittels Strg+Z aufrufen, und zeigt die Liste der in dieser Session bestehenden Tabs an. Da das Plugin vor dem ersten Starten Berechtigungen benötigt, wird dies entsprechend abgefragt.
Alle Plugin-Berechtigungen werden in ~/.cache/zellij/permissions.kdl
gespeichert.
Eigene Layouts erstellen

Man kann Layouts vordefinieren, und mit diesen dann Sessions starten. Layouts werden im Konfigurationsverzeichnis unter layouts/layoutname.kdl
abgelegt. In den Layoutdateien können beliebig Panes und Tabs angelegt und konfiguriert werden.
Da alles in Zellij-Layouts auf Panes basiert, müssen Panes wie die Tableiste oder die Statusleiste ebenfalls mit definiert werden. Das Standard-Layout kann man sich als Boilerplate ausgeben lassen, und mit diesem weiterarbeiten.
mkdir -p ~/.config/zellij/layouts zellij setup --dump-layout default > ~/.config/zellij/layouts/beispiel.kdl
Das Layout kann dann mittels zellij --layout beispiel
aufgerufen werden, ist an diesem Punkt aber noch nicht anders als das Standardlayout.
~/.config/zellij/layouts/beispiel.kdl
layout { pane size=1 borderless=true { plugin location="tab-bar" } pane pane size=1 borderless=true { plugin location="status-bar" } }
Es werden drei Panes definiert, die Tableiste, das einzelne Pane mit der Shell, und die Statusleiste. Um nun Layouts basierend auf dem Standardlayout zu definieren, ist nur das mittlere Pane interessant. Will man zum Beispiel zwei Panes nebeneinander haben, so kann man das mittlere pane
, bisher ohne jegliche weitere Konfiguration, entsprechend durch ein konfiguriertes Pane mit zwei „Unter-Panes“ ersetzen.
pane split_direction="vertical" { pane pane }
Durch weitere Konfiguration kann man das Layout individueller gestalten, dabei sind aufgrund der vielfältigen Konfigurations- und Kombinationsmöglichkeiten fast keine Grenzen gesetzt.
So könnte zum Beispiel ein komplexeres Layout definiert werden.
~/.config/zellij/layouts/beispiel.kdl
layout { tab name="Startseite" { pane size=1 borderless=true { plugin location="tab-bar" } pane split_direction="horizontal" { pane name="Systemauslastung" command="htop" size=9 pane split_direction="vertical" { pane command="nvim" name="Notizbuch" size="30%" pane split_direction="horizontal" { pane name="SSH: user@server" { command "ssh" args "server" } pane split_direction="vertical" { pane name="Rootverzeichnis" cwd="/" command="zsh" start_suspended=true pane name="Userverzeichnis" focus=true } } } } pane size=1 borderless=true { plugin location="status-bar" } } tab name="Vier Shells" { pane size=1 borderless=true { plugin location="tab-bar" } pane split_direction="horizontal" { pane split_direction="vertical" { pane pane } pane split_direction="vertical" { pane pane } } pane size=1 borderless=true { plugin location="status-bar" } } }
Derart definierte Layouts sind ohne tiefer gehende Konfiguration statisch, Veränderungen mittels Alt+[ oder ], oder das Erstellen von neuen Tabs oder Panes führt zu fehlerhaften Ergebnissen.
Es sei hier explizit auf die hervorragende Dokumentation zur Layouterstellung hingewiesen.