Tmux is een terminal multiplexer, oftewel een soort windowmanager voor de terminal omgeving. Hiermee beheer je in één window tegelijk meerdere terminal sessies en kopieer je tekst zonder muisgebruik.

Auteur: Matto Fransen

Tmux is een terminal multiplexer, waarmee je in een enkel window één of meerdere terminals opent en gebruikt. Tmux is erg krachtig en bevat veel meer functionaliteit dan je op basis van deze beschrijving zou verwachten. Een belangrijke functionaliteit is het sessiebeheer. Een sessie bestaat uit een door Tmux beheerde verzameling pseudo-terminals. Een sessie is persistent, wanneer bijvoorbeeld de netwerkconnectie wegvalt, loopt de sessie gewoon door. Je kunt actief je sessie ontkoppelen, en later opnieuw aankoppelen, terwijl in de tussenliggende periode de pseudo-terminals blijven bestaan en de applicaties daarin blijven doorwerken. Dit is handig wanneer je bijvoorbeeld 24 x 7 op je favoriete chatkanaal ingelogd wilt blijven. Of wanneer je een compileer-actie of upgrade-actie opstart die zeer lang loopt of wanneer je via een instabiele internetverbinding op een remote systeem werkt.

Om remote je Raspberry Pi te upgraden, log je via ssh in. Start Tmux en daarin start je “apt-get update” gevolgd door “apt-get upgrade”. Je ontkoppelt nu je Tmux sessie en logt uit. De upgrade loopt gewoon door, later log je opnieuw met ssh in, koppel je aan de Tmux sessie en controleert of de upgrade goed verlopen is. Ook wanneer je lokaal werkt, biedt Tmux voordelen, zoals een goed doorzoekbare historie, eenvoudige kopieeracties zonder een muis te gebruiken, enzovoorts.

Tmux is in 2007 uitgebracht als een modern alternatief voor GNU Screen. GNU Screen bestaat sinds 1987 en is in de loop der jaren geschikt gemaakt voor veel uiteenlopende Unix-achtige besturingssystemen. Hierdoor werd de broncode zeer complex. Ook zaten er een aantal eigenaardigheden in. Tmux is in vrijwel alle Linux distributies als package eenvoudig te installeren.

Prefix

Alle commando’s in Tmux beginnen met de zogenoemde prefix. De default is Control-b, dat wil zeggen dat je de control-toets en de toets met de letter B tegelijk indrukt. Hierna volgt de feitelijke toets van het uit te voeren commando. Een nieuw window open je bijvoorbeeld met Ctrl-b c. Deze default prefix Ctrl-b is niet erg handig, je gebruikt hier al snel twee handen voor. Tmux is oorspronkelijk ontwikkeld in GNU Screen en GNU Screen gebruikt Control-a als prefix. Daarom was dat niet beschikbaar.

Gelukkig is in Tmux de prefix te configureren. Dat is wat vrijwel alle Tmux gebruikers als eerste doen. De configuratie van Tmux staat in het bestand ~/.tmux.conf. Met ~ wordt je home-directory bedoeld. Dus stel dat je home-directory /home/piet is, dan wordt ~/.tmux.conf door je shell geïnterpreteerd als /home/piet/.tmux.conf. Om de prefix te wijzigen naar Control-a, zet je de volgende regel in ~/.tmux.conf: “set -g prefix C-A“. Hierna start je Tmux op.

Tmux toont een window met onderin een groene balk, die links het nummer en naam van het aanwezige window toont en rechts de hostname en datum en tijd. Je verlaat Tmux door alle panelen te sluiten (type “exit” in).

Binnen een window kunnen we desgewenst extra panelen openen. Met Ctrl-a % (control-toets en A-toets tegelijk indrukken, loslaten en dan de toets met het procentteken aanslaan) wordt het window in twee panelen gedeeld, een links en een rechts. We volgen met Ctrl-a “ (dubbele aanhalingsteken), nu wordt het huidige paneel in twee panelen gedeeld, één boven en één onder.

Paneel kiezen

Het laatst geopende paneel is actief. Met Ctrl-a gevolgd door een pijltjestoets maak je een ander paneel actief. Geef elk paneel wat content, ga met Ctrl-a pijltjestoets-links naar het linker scherm en start hier bijvoorbeeld “top”. Ga met Ctrl-a pijltjestoets-rechts en eventueel Ctrl-a pijltjestoets-omhoog naar het paneel rechtsboven en start hier “netstat -a“, ga daarna naar het paneel rechtsonder en start hier “date”, zie screenshot 1.

Screenshot 1: Tmux-window met drie panelen

 

Met Ctrl-a spatiebalk wisselt de paneelindeling. Iedere keer dat je deze combinatie invoert, rouleer je naar de volgende vooraf gedefinieerde indeling: de panelen naast elkaar, boven elkaar, hoofdpaneel en rest boven elkaar, hoofdpaneel en rest naast elkaar. Je wijzigt de grootte van een paneel door Ctrl-a ingedrukt te houden en dan herhaaldelijk op een pijltjestoets te drukken.

Je verwisselt de volgorde van de panelen in het window met Ctrl-a { en Ctrl-a } (acculade openen respectievelijk sluiten). Je sluit een paneel met Ctrl-a x (kill).

Nieuwe windows maak je aan met Ctrl-a c (create). Je roept een lijst van windows op met Ctrl-w. Het huidige window wordt tijdelijk uitgebreid met een extra paneel, dit toont een menu met de beschikbare windows en hun namen. Wanneer je met de pijltjestoetsen omhoog of omlaag door de windows loopt, worden in het oorspronkelijke paneel een stukje van deze windows getoond. Met “enter” ga je naar het betreffende window. Je maakt het jezelf makkelijk door elk window een duidelijke naam te geven. Dit doe je met Ctrl-a , (komma).

Zoomen

Zoomen is het tijdelijk vergroten van een paneel naar de grootte van het hele window. Kies een paneel en geef het commando Ctrl-a z. Het paneel wordt nu window-vullend weergegeven. Wanneer je opnieuw het commando Ctrl-a z ingeeft, keert het paneel weer terug in zijn oorspronkelijke uitgangspositie.

Kijk naar de groene balk onderin en open een nieuw window met Ctrl-a c. In de groene balk worden nu twee windows genoemd, nul en één. Het window één is actief, dit is herkenbaar aan de ster achter de naam van het window. We kunnen op verschillende manieren naar ons vorige window, te weten window nul. Met Ctrl-a p en Ctrl-a n ga je naar het vorige (previous) respectievelijk volgende (next) window. Met Ctrl-a 0 (nul) en Ctrl-a 1 (één) ga je naar window nul respectievelijk window één.

We hebben twee windows, waarvan eentje drie panelen heeft. Bij elkaar hebben we nu dus vier pseudo-terminals. Wanneer je parallel in verschillende pseudo-terminals wilt werken, kun je naar keuze deze terminals nog steeds window-vullend hebben. Of je kunt enkele verkleinen en naast en/of boven elkaar tonen. Wil je één van de kleinere schermen tijdelijk maximeren om hierin te werken, dan zoom je dat scherm, doe het werk en zoom je deze weer terug.

Naast het tijdelijk vergroten van een paneel via zoom, kun je ook een paneel in een eigen window plaatsen (break-out). Dit doe je met Ctrl-a ! (uitroepteken). Andersom kun je een window als nieuw paneel aan ander window toevoegen. Gebruik hiervoor de optie om op de taakbalk commando’s in te voeren met Ctrl-a : (dubbele punt). Als commando geef je nu in: “join-pane -t :4” om het paneel aan window 4 toe te voegen. Een windownummer geef je aan met -t gevolgd door dubbele punt en het windownummer.

Zoeken en kopiëren

Panelen in Tmux hebben twee modi. Tot nu toe gebruikten we de normale modus. Met Ctrl-a [ (vierkante haak openen), schakel je over naar de kopieer-modus. Je kunt nu met de pijltjestoetsen door de tekstregels op het scherm heen wandelen. Wanneer je naar boven wandelt, en bij de bovenkant doorwandelt, dan scrollt het scherm. Zo kun je dus in het buffer met de historie van het paneel wandelen.

Scrollen kan ook, met Cltr-omhoog en Ctrl-omlaag. Met Alt-< en Alt-> (Alt-toets plus kleiner-dan-toets, c.q. Alt-toets plus groter-dan-toets) spring je naar het begin respectievelijk het einde van de buffer.

Met Ctrl-R geef je op de taakbalk een zoekwoord in. Met de n-toets herhaal je de zoekopdracht. Heeft een programma veel output opgeleverd, dat snel voorbij gescrolld is, dan kun je op deze manier de output opnieuw bekijken en hierin zoeken. Met de q-toets verlaat je de kopieer-modus.

We gaan nu tekst selecteren om te kopiëren. Ga in de kopieer-modus naar het beginpunt van de tekst die je wilt kopiëren en druk daar op Ctrl-spatie. Wanneer je nu met de pijltjestoets wandelt, dan zie je dat je tekst-spoor gekleurd wordt, je selecteert tekst. Met Alt-w markeer je het einde van de te selecteren tekst, deze wordt in het kopieer-buffer opgeslagen. De geselecteerde tekst wordt nu weer op de normale manier getoond, zonder kleur. Je plakt nu met Ctrl-a ] (vierkante haak sluiten) in elk willekeurig paneel de tekst uit het kopieer-buffer. De inhoud kopieerbuffer blijft bewaard tot je Tmux afsluit of je een nieuwe selectie in het buffer stopt.

 

Naast complete regels tekst kun je ook een vierkant tekstblok kopiëren, zie screenshot 2.

We hebben hier maar een paar toets-combinaties en een paar mogelijkheden genoemd, die je in de kopieer-modus kunt gebruiken. Verder kent Tmux twee verschillende instellingen voor de kopieer-modus, de vi-instelling en de emacs-instelling. Hierboven hebben we toetsen uit de emacs-instelling beschreven, omdat dit de default instelling is. Voor veel mensen zal de vi-instelling meer natuurlijk zijn. Lees voor de niet-behandelde mogelijkheden en hoe je kunt Tmux kunt configureren voor de vi-instelling, de helder geschreven manpage van Tmux (deze roep je op met “man tmux“).

Wanneer je via ssh remote op een systeem bent ingelogd, kun je de kopieer-mogelijkheden van Tmux gebruiken om in deze omgeving te copy/pasten. Wanneer je in het ene paneel op het ene systeem bent ingelogd en in een ander paneel op een ander systeem, kun je zo dus ook tekst van het ene naar het andere kopiëren.

De kracht van Screen en van Tmux is dat na het ontkoppelen je applicaties door blijven werken. Je ontkoppelt de huidige sessie met Cltr-a d (detach). De Tmux-sessie verdwijnt uit je beeld en je komt weer terug op de commandline waar je Tmux opgestart hebt. Wanneer je op de commandline “tmux a” (attach) intypt, koppel je weer aan en kom je terug in de sessie. Zo kun je bijvoorbeeld thuis een sessie openen en applicaties opstarten en ontkoppelen en op je werk weer aankoppelen. Je kunt tegelijk meerdere keren aangekoppeld zijn. Op deze manier kan bijvoorbeeld een collega meekijken naar wat je doet (nuttig voor extreme programming). Ook kan je op de PC in je werkkamer en op je laptop in de tuin dezelfde sessie open hebben.

Meerdere sessies

Tmux is gemaakt als cliënt/server-toepassing. Je sessies draaien op de server, waar je met je cliënts naar toe connect. In de praktijk merk je hier niet zoveel van, behalve dat hierdoor in Tmux het werken met meerdere sessies erg gemakkelijk en gebruiksvriendelijk is. Hierdoor werken veel mensen met meerdere parallelle sessies, bijvoorbeeld voor elk ontwikkelproject een eigen sessie.

Je opent een tweede sessie door opnieuw vanaf de commandline (dus buiten een Tmux-sessie) Tmux op te starten. Hierin open je opnieuw windows en panelen. Wanneer je een van de sessies de lijst met beschikbare windows oproept (Ctrl-a w), dan krijg je de windows van alle sessies te zien. Met “enter” kies je een window, je gaat dan naar die sessie. Via het commando “tmux choose-tree” krijg je naast de beschikbare windows ook de beschikbare panelen te zien. Zie screenshot 3.

Screenshot 3: Menu met selectie van panelen

 

Voorafgaand aan het attachen kijk je met “tmux ls” welke sessies er zijn en wat hun volgnummers zijn. Met “tmux a -t 3” koppel je aan bij sessie nummer 3. Je wijzigt de naam van de sessie met “Ctrl-a $“.

Tot slot

Tmux helpt je het gebruik van de muis te reduceren en efficiënter te werken. Door gerelateerde zaken in panelen naast elkaar te zetten, krijg je in één oogopslag alle relevante informatie. Sessies lopen door, ook wanneer je uitlogt of de verbinding wegvalt.

Tmux is in vrijwel alle Linux distributies als package eenvoudig te installeren.

Voor veel mensen zal de vi-instelling meer natuurlijk zijn.