Vorwort

Das hier wird kein richtiges Tutorial, sondern eher ein Userguide zu tmux. Ich werde hier weder auf die Installation, noch auf die einzelnen Optionen eingehen und auch die Features außer Acht lassen. Evtl. schreibe ich dazu später nochmal eine ausführliche Anleitung oder erweitere das hier. Hier werde ich in erster Linie auf die meines Erachtens wichtigsten Funktionen und Anwendungsbeispiele eingehen.

Dieser "Userguide" wurde mit AsciiDoc als stand-alone HTML-Dokument erstellt. D. h. die Images sind als "data:image/png;base64" kodiert und genauso wie das CSS Stylesheet und das Javascript welches das Inhaltsverzeichnis erstellt in das Dokument eingebunden. Das erspart das Herunterladen von allen Dateien einzeln.

Solltet ihr Fragen haben oder einen Fehler entdeckt haben, dann schickt mir einfach eine Mail (strcat@gmx.net) und ich werde mich darum kümmern. Gleiches gilt auch wenn ihr Verbesserungsvorschläge oder Distrubtions-spezifische Hinweise habt.

Was ist tmux?

tmux ist ein sog. terminal multiplexer vergleichbar mit GNU Screen, nur komfortabler zu bedienen und um einiges umfangreicher. Der Sinn eines solchen Programmes ist zum einen der, das man verschiedene Shell-Sessions öffnen kann wenn man z. B. nur ein Terminal zur Verfügung hat oder wenn man via SSH eingeloggt ist und das gestartete Programm nach dem ausloggen weiterlaufen und später wieder verwendet werden soll. Besonders wenn man CLI-Programme einsetzt (Mutt, Slrn, Vim, Irssi, ..), kann man damit sehr effizient arbeiten und dazu kommen wir jetzt.

Und keine Angst. Man muss nicht jahrelang mit GNU Screen gearbeitet haben um hier durch zu blicken. Ich werde versuchen den Userguide so einfach und verständlich wie möglich zu halten.

Bedienung und Tastenkombinationen

tmux wird fast ausschließlich über verschiedene Tastenkombinationen gesteuert. Per Default ist das C-b key. Das bedeutet Control (also STRG) drücken, b drücken, loslassen und dann den Keycode senden. Wenn man beispielsweise eine weitere Shell starten will, erreicht man das mit dem Drücken der Tasten STRG b, loslassen und c. Zwischen den beiden Shells kann man dann mit STRG b und l (für last) oder n (für next).

Note

Für diejenigen, die gerne wie unter GNU Screen gewohnt mit C-a arbeiten möchten, reicht es wenn man folgendes in die ~/.tmux.conf einträgt:

set -g prefix C-a
unbind C-b
bind C-a send-prefix

tmux starten

tmux stellt mehrere Optionen zur Verfügung, die man beim Start angeben kann:

-2  -- force using 256 colours
-8  -- force using 88 colours
-L  -- specify socket name
-S  -- specify socket path
-c  -- execute a shell command
-f  -- specify configuration file
-l  -- behave like a login shell
-q  -- do not send informational messages
-u  -- force using UTF-8
-v  -- request verbose logging

In unserem Beispiel übergebe ich beim Start gar keine Option an tmux, sondern starte ihn schlicht und einfach durch die Eingabe von tmux.

Die ersten Schritte

Wenn man tmux ohne Konfigurationsdatei startet (und davon gehe ich in diesem Tutorial aus), dann offenbart sich nach dem Start folgendes Bild:

Der Standardbildschirm von tmux

So.. testuser@painless> tut nichts zur Sache, sondern ist lediglich mein Prompt der Shell. Die grüne Leisten unten ist die sog. status line; also die Zeile, welche die Informationen anzeigt. Das [1] steht für die aktuelle Session. Das 0:zsh* ist die Nummer des aktuellen Window (0 in dem Fall) und der Programmname (also zsh). Rechts steht dann der Hostname, gefolgt von der Zeit und dem Datum).
Jetzt starten wir mal zwei weitere Shells indem wir C-b c drücken (STRG+b drücken, loslassen und dann c drücken). Dann sollte das ganz so aussehen:

tmux mit drei Shells

Das aktuelle Window wird mit einem "*" und das vorherige Window mit einem "-" gekennzeichnet. Zwischen den Window kann man jetzt auf verschiedene Arten hin- und her wechseln. Zum einen mit C-b zahl oder mit C-b l/n (entweder l für last oder n für next). Alternativ dazu kann man die Window auch interaktiv auswählen. Dazu drückt man einfach C-b w und wählt das Window aus, das man will. In den einzelnen Shells kann man dann wie gewohnt Programme ausführen.

Man kann die Sitzung aus abhängen ohne das ggf. laufende Prozesse beendet werden; das funktioniert lokal ebenso wie remote. Dazu drückt man einfach C-b d und tmux wird sozusagen in den Hintergrund befördert. Wenn man sich anschließend wieder mit tmux verbinden will, dann kann man das auf mehrere Arten machen. Zum einen kann man den Befehl tmux list-sessions verwenden, der einem alle aktuell laufenden Sessions von tmux anzeigt oder - wenn nur eine Session läuft - einfach "tmux attach" eingeben.

Anwendungsbeispiele

Fenster splitten

Horizontales splitten

tmux kann Fenster horizontal und vertikal aufteilen. Dazu bleiben wir in unserer aktuellen Session und drücken C-b % um das Fenster horizontal zu splitten und geben dann dort pwd ein (wieso kommt gleich!). Anschließend sollte das ganze so aussehen:

tmux mit horizontal geteilten Fenstern

Zwischen den geteilten Fenstern kann man jetzt mit C-b o oder C-b Pfeil-Links/Rechts wechseln. Man kann diese Fenster auch vertauschen. Wenn man z. B. das rechte Fenster (da wo die Ausgabe von pwd drin steht) nach links verschieben will, drückt man einfach C-b { oder C-b }. Die Manpage dazu sagt folgendes:

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.

Geschlossen werden die Fenster indem man die Shell beendet oder C-b x drückt. Es besteht auch die Möglichkeit ein Fenster gesplittetes "heraus zu trennen". Dazu wechselt man in das Fenster das man heraustrennen will und drückt C-b !.

Vertikales Splitten

Vertikales Splitten erreicht man durch Drücken der Tastenkombination C-b ". Das ganze sollte dann so aussehen:

tmux mit horizontal und vertikal geteilten Fenstern

Hier wird wieder mit C-b o oder C-b Pfeil-Links/Rechts bzw. C-b Pfeil-Hoch/Runter zwischen den Fenstern gewechselt.

Größe verändern

Es besteht die Möglichkeit die Größe von geteilten Fenstern zu ändern. Das erreicht man mit der Tastenkombination C-b alt Pfeil-Links/Rechts. Also STRG+b drücken, loslassen, alt drücken und festhalten und dann mit den Pfeiltasten verschieben (Hoch, Runter, Links, Rechts).
tmux bietet auch .. nennen wir sie mal "vorgefertigte Layouts". Dazu gehören "even-horizontal, even-vertical, main-horizontal, main-vertical" und "tiled", welche mit C-b space durchgeschaltet werden können.

Copy&Paste

Man braucht keine Mouse um Text zu kopieren und anschließend einzufügen wenn man mit tmux arbeitet. Als Beispiel kopieren folgenden Bildschirminhalt in den Editor:

testuser@painless> pwd
/home/testuser
testuser@painless>

Dazu wechseln wir jetzt zu Fenster Null (C-b 0) und starten vor einen Editor
[Ich verwende Vim]
.

Tip Man kann auch Fenster nach Inhalten durchsuchen. Dazu drückt man einfach C-b f und gibt dann den Suchstring ein. Also wenn man C-b f drückt und dann pwd eingibt, kommt man automatisch zu dem Fenster, in dem pwd steht. Wenn das auf mehrere Fenster zutrifft, wird eine Auflistung angezeigt aus der man auswählen kann.

Anschließend drücken wir C-b l um zum letzten Fenser zurückzukehren (in unserem Fall das Fenster, in dem die Ausgabe von pwd steht) und kopieren den Text. Das passiert mit der Tastenkombination C-b [ und dann sieht man rechts oben ein [0/0] woran man erkennt das der Copy-Buffer bereit ist. Nun zum eigentlichen Kopieren:
Zuerst bewegen wir den Cursor an die Stelle, von der wir zu kopieren anfangen wollen. Dann starten wir das Kopieren mit C-Space und bewegen den Cursor über den Text. Was alles kopiert wird, erkennt man daran, dass der Text Gelb hinterlegt wird. Das Kopieren wir dann mit Alt-w in den Buffer. Jetzt rüber zu dem Editor wechseln und dort C-b ] drücken und fertig.
Hört sich unglaublich umständlich an, ist es aber nicht. Die Kurzanleitung ist:

  1. Kopieren aktivieren: C-b [

  2. C-Space drücken und Text auswählen

  3. Alt-w drücken um den Text im Buffer zu speichern

  4. Zum Editor wechseln und dann C-b ] drücken

Note Navigiert wird innerhalb des Copy-Modes entweder mit dem Pfeiltasten oder mit den Keybindings welche man von GNU Emacs oder Vi kennt (je nachdem welches Layout bei tmux eingestellt wurde. Default ist das Keylayout von GNU Emacs).

Bevor wir mit dem nächsten Abschnitt weitermachen, starten wir im Fenster 1:zsh das Programm top. Das kann man auf zwei Arten machen. Die erste wäre mit C-b 1 dorthin zu wechseln und top einzugeben und die andere ist ein einfaches

tmux send-keys -t 1 "top" C-m

in die Shell. tmux send-keys schickt die Zeichen "top" an das das Fenster -t 1 (-t für target) und C-m schickt einen Zeilenumbruch hinterher (also ein Enter/Return).
Das lassen wir jetzt einfach so stehen und widmen uns dem nächsten Abschnitt.

Sessions erstellen/verwalten

Eine Session sind mehrere Terminal, welche von tmux verwaltet werden. Bisher haben wir unter der Session :0 gearbeitet (Ist der Standardname für die erste Session von tmux). Ich persönlich nutze für jeden Host eine eigene Session und diese werden dann teilweise auch noch zusätzlich unterteilt. Der Vorteil liegt darin, dass man z. B. alle Programme auf Host-1 in einer eigenen Session hat und man nicht den Überblick verliert weil zuviele Terminals offen sind. Aber genug der Theorie.
Zuerst 'detach’en wir unsere aktuelle Session mit der Tastenkombination C-b d und gelangen somit zurück an unsere normale Shell. Jetzt erstellen wir eine neue Session indem wir

tmux new-session -s "Test" \; neww -n "Vim" 'vim hello.sh'

tmux new-session erstellt eine neue Session. -s "Test" sorgt dafür das die neue Session den Namen "Test" bekommt und \; neww -n "Vim" 'vim hello.sh' startet ein Fenster Namens "Vim" und führt dort das Kommando vim hello.sh aus. Das ganze sollte dann so aussehen:

Neuse Session

Hier kann man jetzt seine weiteren Arbeiten verrichten. Zwischen den vorhandenen Sessions kann man mit C-b s umschalten. Dort erscheint dann eine Liste mit allen verfügbaren Sessions
[Die Zahlen in den eckigen Klammern die dahinter stehen, zeigen die Größe des Terminals an]
. Wir bleiben aber vorerst auf der Session mit dem Namen Test und rufen dort in einer Shell den Editor
[In mainem Fall wieder Vim]
auf und erstellen ein kleines Shellscript mit folgendem Inhalt:

#!/bin/sh
echo 'Hello, World!'
Important Den Editor noch nicht beenden, damit das folgende Beispiel besser veranschaulicht wird. Also das Script nur abspeichern, aber den Editor nicht schließen!

Um sicher zu gehen das das Shellscript auch funktioniert, teilen wir das Fenster vertikal (C-b ") und rufen es dort mit sh hello.sh auf. Jetzt da wir wissen das das Shellscript funktioniert, verschieben wir den Editor auf ein freies Fenster in der ersten Session.
Dazu müssen wir erstmal rausfinden welches Fenster noch frei ist, aber nichts einfacher als das: tmux list-windows -t 0 und man bekommt folgende Ausgabe:

testuser@painless> tmux list-windows -t 0                                                              ~
0: zsh [105x26]
    layout:  2df,105x26,0,0
1: top [105x26]
    layout:  2df,105x26,0,0
2: zsh [105x26]
    layout: c48d,105x26,0,0{52x26,0,0,52x26,53,0[52x13,53,0,52x12,53,14]}
testuser@painless>

1: ist also vom Programm top belegt und 2: ist das mit dem dreigeteiltem Fenster. Also erstellen wir beim verschieben einfach ein neues Fenster:

tmux link-window -d -s Test:1 -t 0:3

-d sorgt dafür das das Pane nicht geschlossen wird wenn wir den Editor verschieben, -s Test:1 steht für Sessionname:pane und -t 0:3 wählt Session 0 aus und erstellt ein neue Pane. -s ist synonym für source und -d für destination.

Note

Man muss nicht unbedingt ein neues Fenster erstellen, sondern kann auch ein bereits vorhandenes nutzen. Dazu verwendet man die Option -k für kill. Also

tmux link-window -d -k -s Test:1 -t 0:1

würde z. B. den Prozess top in der ersten Session ohne Rücksicht auf Verluste beenden.

Nachwort

Für weitergehende Informationen steht die ausführliche Manpage tmux(1) zur Verfügung, sowie die FAQ und einige Beispiele von Konfigurationsdateien zur Verfügung.