Een terminal multiplexer maakt je werk op de commandline heel wat efficiënter. In deze workshop introduceren we tmux, een moderne terminal multiplexer waarmee je meerdere terminalsessies in een venster draait. Configureerbare sneltoetsen, tekst kopiëren en plakken, het is allemaal mogelijk, en dat zonder muis.

Elk grafisch besturingssysteem kent het concept van een window manager: dit maakt het mogelijk om meerdere vensters tegelijk te tonen en ertussen over te schakelen. Dat kan een tiling window manager zijn, die alle vensters naast elkaar toont om de volledige schermruimte zo efficiënt mogelijk te gebruiken, een window manager zoals die van Android die elke app fullscreen toont, of een stacking window manager waarmee je vensters naar believen over het scherm schuift en voor elkaar kunt zetten.

Systeembeheerders en powerusers besteden echter een groot deel van hun tijd in terminalvensters. Als je in een grafische omgeving werkt, kun je uiteraard allerlei terminalvensters openen en met je window manager beheren, maar dat is verspilling van resources en vereist dat je constant overschakelt tussen toetsenbord en muis. In dat geval is het beter om een terminal multiplexer te gebruiken. Dat is een toepassing waarbij je meerdere terminalsessies in één terminalvenster kunt draaien. Eigenlijk is een terminal multiplexer te vergelijken met een niet-grafische window manager, met alle bijbehorende voordelen.

Moderne terminal multiplexer

De bekendste terminal multiplexer is GNU Screen, dat elke Linux-systeembeheerder al wel eens heeft gebruikt. Screen bestaat al sinds 1987, maar de ontwikkeling heeft het laatste decennium lang stilgestaan. Er ontstonden onofficiële patchsets om functionaliteit zoals verticale splits toe te voegen, maar de stilstand leidde ook tot een andere terminal multiplexer: tmux. Die heeft ondertussen al een grote schare aanhangers gekregen. In OpenBSD is tmux zelfs al sinds versie 4.6 (uit 2009) standaard in het besturingssysteem opgenomen in plaats van Screen.

 Tmux zit in de repository’s van alle bekende Linuxdistributies, dus de installatie vormt geen probleem. OpenBSD-gebruikers hoeven tmux zelfs niet te installeren. Daarna voer je tmux eenvoudig uit door de opdracht tmux in een terminalvenster in te typen. Je ziet nu een tmuxsessie, die als een normale terminalsessie werkt. Je kunt hier dus gelijk opdrachten in geven. Het enige zichtbare verschil is dat er onderaan een statusbalk is te zien. Met exit of ctrl+d sluit je je tmuxsessie af.

Vensters

Heb je een tmuxsessie opgestart, dan krijg je standaard één venster te zien. Met ctrl+b gevolgd door c, creëer je een tweede venster met een nieuwe shell. Het is alsof je een volledig nieuw terminalvenster hebt opgestart. Onderaan zie je in de statusbalk de volgnummers van alle vensters en de naam van de toepassing die erin actief is, zoals bash. Dat is handig om te zien wanneer een opdracht in een ander venster voltooid is: de naam van dat venster verandert dan van de naam van de opdracht in de naam van je shell. Wil je een venster een vaste naam geven, druk dan op ctrl+b en ,.

 Overschakelen tussen de verschillende vensters gaat met ctrl+b n (next) en ctrl+b p (previous). Ctrl+b gevolgd door een volgnummer brengt je naar het bijbehorende venster, dus ctrl+b 0 voor het eerste venster. Met ctrl+b w krijg je een tekstueel menu waaruit je met de pijltjestoetsen naar boven en onder het venster kiest waarnaar je overschakelt. Met exit sluit je het huidige venster af en brengt tmux je naar het vorige venster. Raak je niet meer aan een shell in het huidige venster, dan krijg je met ctrl+b & de vraag om te bevestigen of je het huidige venster wilt sluiten.

Sessies

We hebben tot nu toe altijd een naamloze tmuxsessie aangemaakt, maar we kunnen ook een sessie met een naam aanmaken, bijvoorbeeld met tmux new -s irc als je een sessie voor je irc-programma wilt aanmaken. De naam van de sessie wordt helemaal links op de statusbalk getoond. Start je commandline irc-programma in de sessie, zoals irssi. Je kunt nu de sessie afkoppelen met de toets ctrl+b gevolgd door d. Afkoppelen betekent dat de sessie gewoon blijft draaien, inclusief alle programma’s erin, maar dat je de uitvoer niet te zien krijgt en er ook geen invoer meer aan kunt geven: je terminalvenster brengt je terug naar de shell waarin je tmux had opgestart.

Op deze manier kun je meerdere sessies aanmaken en ervan afkoppelen. De actieve sessies krijg je te zien met de opdracht tmux ls, die naast de naam van elke sessie ook het aantal vensters erin toont en het tijdstip van creatie. Als we terug op onze sessie met irssi willen aankoppelen, geven we eenvoudigweg de opdracht tmux attach -t irc, of als er maar één sessie actief is kortweg tmux attach. We krijgen nu terug de tmuxsessie te zien en kunnen onze invoer geven. Overigens kun je ook altijd een sessie afsluiten met tmux kill-session -t sessienaam.

Als je meerdere sessies hebt opgestart, hoef je een sessie niet eerst expliciet af te koppelen voor je een andere sessie aankoppelt. Met ctrl+b s krijg je een lijst van actieve sessies met hun naam en het aantal vensters. Je schakelt dan eenvoudig met de pijltjestoetsen naar boven en onder over naar een andere sessie. Of nog sneller: ctrl+b ( neemt je naar de vorige sessie en ctrl+b ) naar de volgende sessie.

Panelen

Een andere handige functionaliteit zijn panelen: hiermee creëer je meerdere terminalsessies naast elkaar in hetzelfde terminalvenster. Handig als je bijvoorbeeld in één paneel een configuratiebestand aan het aanpassen bent, in een ander paneel opdrachten uitvoert en in een derde paneel de uitvoer van een logbestand met tail -f bekijkt. Dat alles zie je in één oogopslag zonder dat je van venster moet overschakelen.

Met panelen zie je in één oogopslag in tmux meerdere terminalsessies.

Standaard start tmux in elk venster één paneel. Met ctrl+b % verdeelt tmux het huidige paneel in twee panelen naast elkaar en brengt je naar het nieuwe paneel. Met ctrl+b ” splitst het huidige paneel in twee panelen boven elkaar. Met ctrl+b o schakel je telkens naar het volgende paneel. Met ctrl+b gevolgd door een van de pijltjestoetsen beweeg je naar het paneel in de opgegeven richting. En met ctrl+b gevolgd door de spatiebalk worden alle panelen achtereenvolgens weergegeven in één van de standaardindelingen: van links naar rechts, van boven naar onder, één groot paneel bovenaan en de rest eronder, één groot paneel links en de rest ernaast, of alle panelen even groot.

Soms heb je een aantal panelen in een venster gemaakt en wil je één van de panelen toch in een nieuw venster openen omdat je er meer schermruimte voor nodig hebt. Dat gaat heel eenvoudig: druk op ctrl+b ! en tmux maakt een nieuw venster van je paneel. Wil je slechts tijdelijk een paneel fullscreen tonen, dan kan dat eenvoudig met ctrl+b z. Met dezelfde sneltoets keer je terug naar de normale lay-out. Een paneel sluiten doe je overigens eenvoudigweg met exit of ctrl+b x.

Werken met panelen in tmux is ongelooflijk flexibel. Zo kun je een willekeurig paneel of venster naar je huidige venster brengen, zelfs vanuit een andere tmuxsessie. Daarvoor schakel je eerst over naar de opdrachtmodus van tmux met ctrl+b : en geef je de volgende opdracht in:

join-pane -s sessienaam:venster.paneel

Hierin geef je voor het venster en het paneel de bijbehorende volgnummers in. Wil je alle panelen van het venster aan het huidige venster toevoegen, dan volstaat sessienaam:venster. En met de optie -t sessienaam:venster kun je ook nog eens een ander doelvenster kiezen dan het huidige.

Configuratie

De standaardconfiguratie van tmux is al vrij bruikbaar, maar sommige toetsencombinaties zijn nogal moeilijk om te onthouden als je ze niet vaak gebruikt. Gelukkig pas je die eenvoudig aan in het bestand ~/.tmux.conf. Zo zijn de volgende toetsencombinaties handiger om vensters horizontaal en verticaal in panelen te splitsen:

bind | split-window -h
bind – split-window -v

 Je kunt ook sneltoetsen toevoegen om zonder veel te moeten intypen toegang te krijgen tot tmux-opdrachten. Een handige is de volgende:

bind y setw synchronize-panes

 Druk je nu op ctrl+b y, dan wordt de invoer die je in één paneel intypt tegelijk naar alle andere panelen in hetzelfde venster doorgestuurd. Handig om in één keer in al je panelen naar dezelfde directory te gaan of eenzelfde opdracht in te geven. Met nog eens een druk op ctrl+b y schakel je de synchronisatie van je invoer terug uit.

Ook de statusbalk is te configureren. De mogelijkheden zijn eindeloos. In principe kun je de uitvoer van gelijk elk commandlineprogramma in de statusbalk van tmux tonen, zolang die maar kort genoeg is om in de statusbalk te passen. Zo toon je met AnsiWeather het weerbericht en met rainbarf grafiekjes over het verbruik van je cpu, RAM en batterij. Om de uitvoer van rainbarf in de statusbalk te tonen, voeg je aan ~/.tmux.conf de volgende regels toe:

set-option -g status-utf8 on

set -g status-right ‘#(rainbarf –bright –bolt –remaining)’

Rainbarf voegt allerlei grafiekjes toe aan de statusbalk van tmux. Bekijk voor verdere configuratiemogelijkheden zeker de uitgebreide manpagina van tmux eens, want de terminal multiplexer is volledig naar je hand te zetten.

Werken met tekst

In elke terminalsessie krijg je met tekst te maken: de inhoud van een configuratiebestand of logbestand, de uitvoer van een opdracht, een e-mail in mutt. Tmux laat toe om met die tekst om te gaan zonder dat je de muis hoeft aan te raken.

Het eerste wat je daarvoor moet doen is naar de kopieermodus van tmux overschakelen. Dat kan met ctrl+b [. In de kopieermodus kun je met de pijltjestoetsen door de uitvoerbuffer van het huidige paneel gaan, bijvoorbeeld om te kijken wat er in de uitvoer te zien was voor die voorbij de bovenkant van het paneel scrolde. Met enter of q verlaat je de kopieermodus.

Voor een efficiënt gebruik van de kopieermodus voeg je het best de volgende regel aan het configuratiebestand van tmux toe:

 setw -g mode-keys vi

De kopieermodus herkent nu allerlei sneltoetsen die je van in vi gewend bent. Heel handig zijn bijvoorbeeld / en ? om door de uitvoerbuffer te zoeken.

De naam van de kopieermodus komt uiteraard van wat je erin kunt doen: tekst kopiëren. Beweeg de cursor naar het begin van je selectie en druk op de spatiebalk. Ga naar het einde van je selectie en druk op enter. De tekst ertussen wordt nu gekopieerd. Ze op een andere plaats plakken (zelfs in een ander paneel, venster of sessie) gaat eenvoudig met ctrl+b ].

Voor elke tekst die wordt gekopieerd, maakt tmux overigens een nieuwe buffer aan. Met ctrl+b ] wordt de meest recent aangemaakte buffer geplakt, maar met ctrl+b = kies je uit de lijst met buffers welke buffer je wilt plakken.

In tmux kun je tekst kopiëren en plakken, helemaal zonder muis!