Prof. Dr.-Ing. Oliver Radfelder
Informatik / Wirtschaftsinformatik
Hochschule Bremerhaven
WezTerm

Wir sind in der Informatik viel im Terminal unterwegs. Seit einigen Jahren lässt sich beobachten, dass auch in Bereichen, in denen lange Zeit nur das GUI vorherrschte, mehr auf der Kommandozeile gearbeitet wird.

Für uns und unsere Studierenden halten wir es für wichtig, dass eine Sammlung von Werkzeugen ausgesucht und wirklich beherrscht wird. Dafür suchen wir Software heraus, die sowohl Open-Source als auch frei im Sinne der OSF und FSF ist und die, wenn möglich, auf den drei Betriebssystemen Linux, MacOS und Windows verfügbar ist.

WezTerm ist so ein Werkzeug: ein sehr modernes Terminal, das unter allen drei Systemen verfügbar ist und offensichtlich für alle auch gut gepflegt wird. Zudem ist es GPU-beschleunigt, gut individuell konfigurierbar mit Lua und es bietet unter Linux und MacOS sehr gute Sixel-Unterstützung, unter Windows nur unter bestimmten Bedingungen. Das gilt aber im Moment auch für VSCodium und VSCode. Denn auch dort wird Sixel im Moment nur unter Linux und MacOS unterstützt.

Es ist einfach an der Zeit, dass wir in unserem Arbeitsfluss, bei dem oft Grafiken und Visualisierungen erzeugt werden, eine schnelle Möglichkeit der visuellen Prüfung haben. Das bietet das Grafikformat Sixel: im Terminal mit cat oder einer schnellen Umwandlung von png in six, einen Blick auf ein Zwischenergebnis zu werfen. Zur Zeit ist Sixel ein ziemlich populäres Thema: neben VSCodium/VSCode arbeiten mehrere Terminal-Entwickler:innen daran. Wie der aktuelle Stand ist, lässt sich auf are we sixel yet sehen.

Für die folgende Installation gilt als Voraussetzung, dass entweder:

Wie sich eine Grundinstallation von Software für das Studium bewerkstelligen lässt, findet sich unter setup.

Installation unter Linux

Die Installation für die jeweilige Distributionen ist gut beschrieben unter wezfurlong.org.

Im Wesentlichen - für Debian und Ubuntu - sind das:

curl -fsSL https://apt.fury.io/wez/gpg.key | sudo gpg --yes --dearmor -o /usr/share/keyrings/wezterm-fury.gpg
echo 'deb [signed-by=/usr/share/keyrings/wezterm-fury.gpg] https://apt.fury.io/wez/ * *' | sudo tee /etc/apt/sources.list.d/wezterm.list

Danach ist das Programm wezterm im Pfad und kann direkt aufgerufen werden - z.B. unter dem Desktopmanager cinnamon (den einige von uns gerne nutzen) mit der Windows-Taste und dann wez....

Je nach gewähltem Windowmanager könnte es sein, dass die Default-Belegungen für das Vergrößern von Panes (siehe unten) abgefangen werden. Bei mir unter Cinnemon ist das beispielsweise so und unter Gnome ebenfalls. Dann solltet Ihr die Belegungen des Windowmanagers ändern (Windows-Taste->Tastatur->Tastenkombinationen). Lasst Euch dabei gerne von Franjo helfen.

Installation unter Windows

Wenn Ihr scoop mit extras installiert habt, genügt wie üblich ein:

scoop install wezterm

Danach ist wezterm als Programm aus dem Startmenü oder von der Kommandozeile aus aufrufbar.

Installation unter MacOS

Wenn Ihr brew installiert habt, genügt wie üblich ein:

brew install --cask wezterm

Danach ist wezterm als Programm aus dem Launcher oder von der Kommandozeile aus aufrufbar.

Bevor es losgeht ...

Ladet Euch die Konfigurationdatei .wezterm.lua herunter und legt sie in Eurem Homeverzeichnis unter dem Namen .wezterm.lua ab.

Herunterladen könnt Ihr das Script am Besten in der git-bash, im MacTerminal oder in einem beliebigen Terminal unter Linux in Eurem Home-Verzeichnis (cd ~) einfach mit curl:

curl -O https://informatik.hs-bremerhaven.de/oradfelder/.wezterm.lua

In der Datei sind einige - auch betriebssystemspezifische Konfigurationen, die das Arbeiten etwas angenehmer machen. Unter anderem ist dort der Shortcut Shift+Strg+w definiert, mit dem Ihr ein Pane auch dann noch schliessen könnt, wenn das Programm darin nicht mehr reagiert. Beispielsweise hängen ssh-Verbindungen manchmal, wenn man von einem Netz in ein anderes wechselt.

Arbeiten mit WezTerm

Toggle Fullscreen

Geht am Besten - gerade am Anfang - immer erst einmal in den Vollbildmodus:

Alt+Enter (Linux/Windows)

Option+Enter (MacOS)

Split Terminal horizontal

Shift+Strg+Alt+2 (Linux/Windows)

Shift+Strg+Option+2 (MacOS)

Split Terminal vertical

Shift+Strg+Alt+5 (Linux/Windows)

Shift+Strg+Option+5 (MacOS)

Switch Pane

Shift+Strg+ArrowKeys

Resize Panes

Shift+Strg+Alt+ArrowKeys (Linux/Windows)

Shift+Strg+Option+ArrowKeys (MacOS)

Copy Mode

  1. Shift+Strg+x
  2. Bewegen (alles wie im vim)
    • ArrowKeys oder h-j-k-l
    • 0 = Zeilenanfang
    • $ = Zeilenende;
    • o = switch selection end (nach Beginn Markierung)
    • Shift+o = switch selection end horizontally (nach Beginn rechteckiger Markierung )
  3. Markieren (alles wie im vim)
    • v für zeichenweise markieren
    • Shift+v für zeilenweise markieren
    • Strg+v für rechteckiges markieren
  4. y für Beenden und Kopieren

Siehe wezterm copymode

Varia

Mit wezterm cli lassen sich einzelne Panes aus einer anderen heraus direkt (auch auf einem anderen Rechner und in der passenden Größe) erzeugen:

wezterm cli split-pane
wezterm cli split-pane --percent 80 -- ssh hopper

Was sonst noch so geht, lässt sich mit wezterm cli -h herausfinden.

Die aktuelle Belegung der Shortcuts ausgeben:

wezterm show-keys

Damit das unter MacOS funktioniert, muss der Pfad in der Shell angpasst werden. Siehe dazu weiter unten.

QuickSelect

Erstaunlich, dass man auch nach Jahrzehnten der Arbeit in der Shell noch ein Werkzeug an die Hand bekommt, von dem man gar nicht wusste, wie sehr man es vermisst. Mit Quickselect werden alle Teile des Terminals, die einer Liste von RegEx entsprechen, hervorgehoben und mit einem oder zwei Buchstaben am Anfang versehen. Tippt man nun im QuickSelect-Mode diese Buchstaben, wird der Text in den Copy-Buffer kopiert. Tippt man sie als Großbuchstaben, wird er kopiert *und* sofort wieder ausgegeben:

Shift+Strg+Space

Zum Verständnis: Tippe

for i in {1..5}; do echo "https://example.de/p$i"; done
Dann tippe Shift+Strg+Space und wähle eine URL über den nun farbigen Anfangsbuchstaben aus. Wie oft ist man im Terminal, irgendein Programm gibt URLs oder SHA-Summen aus und man greift dann doch zur Maus zum Kopieren ...

Dazu: Man kann die RegEx erweitern, die zum Markieren genutzt werden:

config.quick_select_patterns = {
      "(?<=password )[^ ]+"
      }

Damit werden zusätzlich alle Teile markiert, die nach dem Text "password " bis zum nächsten Leerzeichen stehen. (Eine sinnvolle Anwendung von Positive Lookbehind).

Besonderheiten unter Windows

Unter Windows arbeitet Ihr zunächst einmal vom ersten Semester an mit der git-bash. Darin könnt Ihr auch die im folgenden Abschnitt beschriebenen Sixel-Grafiken nutzen. Sixel-Grafiken werden ansonsten unter Windows in den meisten Terminals nicht angezeigt - auch nicht in WezTerm oder dem Windows-Terminal. Allerdings lässt sich Windows mit WezTerm umgehen, wenn man die WezTerm-interne ssh-Funktionalität nutzt.

Wenn die ssh-Verbindung zu hopper mit

wezterm ssh hopper

gestartet wird, öffnet sich ein extra Fenster - und darin ist es dann auch möglich, sixel zu nutzen.

Es empfiehlt sich, eine Verknüpfung im Startmenü unter dem Namen hopper einzurichten, bei der der Programmaufruf der obigen Zeile entspricht. Dann landet man - so ssh korrekt konfiguriert ist - direkt auf hopper. Damit ist es dann allerdings nicht mehr möglich, mit scp zu arbeiten (man ist ja immer schon auf hopper) - das muss man dann in einer anderen - lokalen - WezTerm-Instanz machen.

Für Fortgeschrittene kann das gleiche mit der WSL erfolgen. Dazu muss lediglich in der WSL openssh-server installiert werden und auf einen anderen Port als 22 gesetzt werden (jmmv.dev).

Dann kann auch hier mit einer Verknüpfung wezterm ssh wsl mit dem Namen wsl-ssh und einem entsprechenden Eintrag in der .ssh/config direkt in der WSL gearbeitet werden - und dort hat man dann auch sixel direkt zur Verfügung - und die Terminalemulation ist deutlich performanter.

Besonderheiten unter MacOS

Unter MacOS müssen einige wenige Anpassungen vorgenommen werden - die notwendigen stehen bereits in der .wezterm.lua.

Allerdings muss unter MacOS noch der Pfad in der .zshrc und/oder der .bashrc angepasst werden, damit das Programm wezterm auch in der Shell gefunden wird und beispielsweise wezterm cli aufgerufen werden kann.

Jeweils am Ende der .bashrc und der .zshrc muss noch das Folgende stehen:

PATH="$PATH:/Applications/WezTerm.app/Contents/MacOS"
Besonderheiten unter Linux

Für Linux allgemein muss nichts beachtet werden. Allerdings ist die Tastaturbelegung unter Cinnemon etwas unglücklich. Dort sollte man Shift+Strg+Alt+Arrows zum Positionieren von Fenstern auf andere Workspaces deaktivieren.

Sixel

Mit einem sixel-fähigen Terminal kann man dann sowohl lokal (wenn ImageMagick installiert ist) als auch auf hopper und in den docker-Containern direkt sixel-Grafiken ausgeben oder über den Umweg mit convert

Um das Leben mit sixel etwas zu vereinfachen, gibt es auf hopper das kleine Skript hbv_image, das m.E. unter Linux, MacOS, Windows/git-bash und Windows/WSL ein sixel-Bild anzeigt oder angibt, dass das nicht möglich ist. Unter Windows funktioniert das nur in der git-bash, wenn imagemagick installiert ist. Ebenso sollte in der WSL imagemagick gesondert installiert sein, damit es dann statt der Windows-Implementierung genutzt wird.

Traditionell gibt es in der Sixel-Welt ein paar Programme wie img2sixel, lsix und latex2sixel, womit sich dann ziemlich interessante Sachen - auf die Schnelle - machen lassen. Beispielsweise mit latex2sixel:

Beispiele zum Ausprobieren:

latex2sixel '$-\frac{\hbar^2}{2m}\,\Delta\psi+V\,\psi=E\,\psi$'
latex2sixel '$$\int_{\partial\Omega}\omega=\int_\Omega\,d\omega$$'
latex2sixel '$$\sum_{j=0}^N q^j=\frac{q^{N+1}-1}{q-1}$$'
latex2sixel '$$\forall x\in\mathbb{Z},\exists y\in\mathbb{Z}:x+y=0$$'
latex2sixel -D 300 -T tight '\LaTeX\ is\ cool :)'
latex2sixel -D 600 '\cfrac{1}{\sqrt{2}+\cfrac{1}{\sqrt{2}+\cfrac{1}{\sqrt{2}+\dotsb }}}'
latex2sixel -h

Gegebenenfalls muss mit den Schaltern D und T etwas gespielt werden. Besonders bei den MacBooks fallen ansonsten die Ausgaben ausgesprochen klein aus.

Und mit ein paar Zeilen Bash und wezterm und graphviz und imagemagick und Ansi-Sequenzen lässt sich dann eine kleine Veranschaulichung von Dateisystem und Bäumen erstellen:


Oder - wenn Ihr gerade im LaTeX-Flow seid und Ihr wollt nicht immer alles erst ins Webverzeichnis kopieren, um einen schnellen Blick auf eine Änderung zu werfen:

convert -density 150 rech-arch-versuchsprotokoll.pdf[0] six:-;echo

Wobei density für die einzulesende Auflösung (dpi) steht und die Zahl hinter dem Dokument für die Seite - damit nicht immer ein ganzes Dokument durchrauscht.

Damit das funktioniert, würde ich Euch empfehlen, immer auch die Seitenfarbe bei LaTeX-Dokumenten zu setzen, die im Standard transparent ist.

\pagecolor{white}

Falls Ihr das vergessen habt oder Ihr das pdf nicht selbst erzeugt, hilft auch:

convert -density 150 rech-arch-versuchsprotokoll.pdf[2] -background white -flatten -alpha off six:-;echo
Links