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).
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:
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:
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:
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:
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]
.
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:
-
Kopieren aktivieren: C-b [
-
C-Space drücken und Text auswählen
-
Alt-w drücken um den Text im Buffer zu speichern
-
Zum Editor wechseln und dann C-b ] drücken
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:
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!'
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.
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.