Karhulla on asiaa

Ter­mi­naa­li­mul­tiplek­se­ri tmux – ystävä, johon voi luottaa

Kimmo Tapala 13

Teen valtaosan työstäni terminaalissa: kirjoitan tekstit ja koodaan Neovim-tekstieditorilla, hallitsen paikallisia Docker-kehitysympäristöjä ja työnkulkuja, navigoin paikallisessa tiedostojärjestelmässä ja selvitän ongelmia niin paikallisesti kuin palvelimillakin. Tekstipohjaisuudestaan huolimatta (tai jopa juuri sen ansiosta) terminaali taipuu työskentely-ympäristönä vaikka mihin. Koska terminaali on työni kannalta minulle elintärkeä, olen vuosien varrella koittanut hioa terminaalikäyttökokemustani mahdollisimman hyväksi ja yhtenäiseksi kaikkien käyttämieni koneiden ja käyttöjärjestelmien välillä. Tmux-terminaalimultiplekseri (eng. terminal multiplexer) on ollut tämän kaiken keskiössä, enkä voisi nykyään enää mitenkään uskoa eläväni ilman sitä. Tästä blogikirjoituksesta tl;dr onkin: jos ikinä kosket komentoriviin Linuxissa, macOS:ssä tai jossakin BSD:ssä, käytä tmuxia — et pety.

Mikä tmux on?

Tmux on terminaalimultiplekseri, eli se mahdollistaa helposti useiden eri ohjelmien samanaikaisen suorittamisen yhdessä terminaali-ikkunassa. Se myös tarjoaa kivan tavan hallita terminaali-istuntoja siten, että istuntojen välillä voi hyppiä ja niistä voi vapaasti irtautua. Tällöin sessioissa suoritettavat ohjelmat pysyvät käynnissä ilman varsinaista terminaali-ikkunaa. Käytännössä se tarjoaa erinomaisen tavan hallita työskentelyä terminaalissa ja antaa myös hyvät lähtökohdat terminaalin sopeuttamiseen omien tarpeiden mukaiseksi. Se on kuin ikkunamanageri terminaalin sisällä.

Tmux vastaa samaan tarpeeseen ja tekee hyvin paljon samoja asioita kuin screen, mutta tmux on selvästi modernimpi ja vie asiat hieman pidemmälle. Screen tarjoaa samat perustoiminnot, mutta tmux tekee niiden käyttämisestä helpompaa ja tarjoaa kylkeen lisäksi kattavat skriptausmahdollisuudet.

Tmuxin peruskäsitteet

Kaiken taustalla tmuxia käytettäessä on tmux-palvelin (eng. server), joka ajaa virtuaaliterminaaleja. Nämä virtuaaliterminaalit eivät ole kytköksissä ”oikeaan” terminaaliin, vaan ne toimivat kokonaan terminaalisovelluksista irrallisina. Tämä tarkoittaa, että virtuaaliterminaalit pysyvät käynnissä riippumatta siitä, kuinka monta terminaalia niihin on oikeasti kytkeytyneenä — olipa noita oikeita terminaaleja sitten nolla tai vaikka kymmenen.

Virtuaaliterminaalit liittyvät aina tmuxissa johonkin istuntoon (eng. session). Istuntoa voi ajatella yhtenä kokonaisuutena, joka koostuu useasta keskenään samaan asiaan liittyvästä näkymästä. Nämä näkymät ovat tmuxissa ikkunoita (eng. window). Yksi ikkuna on aina yhden kokonaisen terminaali-ikkunan kokoinen näkymä, joka puolestaan voi olla jaettu yhteen tai useampaan ruutuun (eng. pane). Ruudut sitten lopulta ovat niitä varsinaisia virtuaaliterminaaleja, joissa ajetaan sovelluksia ja tehdään ne oikeat työt. Jos tätä halutaan rinnastaa esimerkiksi macOS:n terminaalisovelluksen natiiviin ikkunahallintaan, vastaisi yksittäinen ikkuna tmuxin sessiota, ikkunassa oleva välilehti tmuxin ikkunaa ja jaetut näyttöalueet tmuxin ruutuja.

Miksi tmux on parempi kuin natiivi terminaalisovelluksen tarjoama ikkunahallinta?

Jos vastaavat toiminnot löytyvät muun muassa macOS:n mukana tulevasta päätesovelluksesta ja monesta muusta terminaaliemulaattorista, miksi käyttää tmuxia? Tähän on itse asiassa montakin hyvää syytä, mutta näistä ehdottomasti tärkein on se, että tmuxia käytettäessa ei ole mitään merkitystä sillä, mitä terminaaliemulaattoria käytetään. Itse siirryin reilu vuosi sitten käyttämään kaikkialla Kitty-terminaaliemulaattoria, koska saan näin yhteneväisen käyttökokemuksen jokaisella aktiivisesti käyttämälläni koneella ja käyttöjärjestelmällä. Tmuxin ansiosta minun ei juurikaan tarvinnut paneutua siihen, miten Kittyä käytetään, koska lähes kaikki interaktiot terminaalissa tapahtuvat tmuxin kanssa.

Sessioiden hallinta tmuxissa on myös merkittävästi helpompaa ja nopeampaa kuin terminaaliemulaattorin omien ikkunoiden. Erillisiä ikkunoita käytettäessä toiminta tapahtuu kulloinkin käytössä olevaan ikkunamanagerin kanssa, joten interaktiot ovat erilaisia eri käyttöjärjestelmien ja työpöytäympäristöjen kanssa. Käytän omalla yksityisläppärilläni niin sanottua tiling-ikkunamanageria (Hyprland-työpöytäympäristö), jonka kanssa usean terminaali-ikkunan käyttäminen ilman erillistä kikkailua tarkoittaisi, että yhdelle ikkunalle jäisi varsin vähän tilaa. macOS:ssä puolestaan yhden sovelluksen ikkunoiden välillä hyppimiseen en ole vielä onnistunut kohta 25 vuoden käyttöhistoriani aikana keksimään mitään hyvää tapaa — puhumattakaan ikkunoiden järjestelystä yhden työpöydän sisällä. Tmux tekee tämän kaiken helpoksi ja nopeaksi.

”Tmux on ohjelma, jonka hoteisiin voisin tarvittaessa uskoa oman henkeni”

Piirroskuva karhu kävelee

Miten tmux integroituu minun elämääni?

Kuten jo alussa mainitsinkin, teen ylivoimaisesti valtaosan kaikesta työstäni terminaalissa. Kaikki terminaalissa tekemäni työ puolestaan tapahtuu tmux-istunnoissa. Käytän istuntoja jakamaan yksittäisten aihepiirien töitä omiin lokeroihinsa, ja kun en enää koe tekeväni töitä jonkin asian parissa vähään aikaan, suljen kyseisen istunnon. Tämä pitää jokaisen tehtävän omassa työtilassaan ja tekee asiasta toiseen hyppäämisen todella helpoksi. Näiden lisäksi minulla on ensimmäisenä istuntona aina hiukan huonosti nimetty ”neovim”-niminen istunto, jota käytän muistiinpanojen, muistioiden ja todo-listojen tekemiseen ja ylläpitämiseen.

Aikaisemmin loin istuntoihin useita ikkunoita tarpeen mukaan, mutta nykyään pärjään pääsääntöisesti yhdellä ikkunalla per istunto. Jaan sitten tuon yhden ikkunan tarvittavaan määrään ruutuja. Ruutujen välillä hyppimiseen löytyi mukava ratkaisu, jolla pystyy samoilla näppäinkomennoilla siirtymään sekä tmux- että Neovim-ruutujen välillä. Tämän myötä olenkin aika pitkälti korvannut Neovim-ruudut tmux-ruuduilla, koska koen ruutujen hallinnan tmuxilla jossain määrin helpommaksi kuin Neovimilla ja voin ajaa kussakin ruudussa mitä tahansa tarvitsemaani sovellusta. Eli käytännössä, jos tarvitsen esimerkiksi kaksi vierekkäistä Neovim-ruutua, teen ne kahtena tmux-ruutuna, joista kummassakin ajetaan omaa Neovim-instanssiaan. Ruutujen välillä hyppiminen onnistuu samalla tavalla ja voin hallita kummankin ruudun Neovim-puskureita erillisinä toisistaan.

Tuota yllä mainittua kevyttä Neovim-integraatiota lukuun ottamatta en ole kauheasti tmuxia räätälöinyt. Omat tmux-asetukseni olen laittanut julkiseksi GitHubiin, josta ne on helppo synkronoida eri ympäristöihin. Käytän tmux-pluginien hallintaan TPM:ää ja olen asettanut tmuxini käyttämään Dracula-teemaa.

Mitä huonoja puolia tmuxissa on?

Kuten kirjoittamastani tekstistä voi päätellä, en kauheasti huonoa sanottavaa tmuxista löydä: se on ohjelma, jonka hoteisiin voisin tarvittaessa uskoa oman henkeni. Ehdottomasti huonoin puoli tmuxissa on sen oppimiskynnys. Tekstipohjaiset käyttöliittymät vaativat usein aika paljonkin erilaisten näppäinkomentojen opiskelua, eikä tmux ole tässä poikkeus. Lisäksi tmux saattaa vaikuttaa merkittävästi siihen, miten jotkin terminaaliemulaattorin ominaisuudet ovat hyödynnettävissä. Tällaisia ovat muun muassa vierityspuskurin toiminta (tmuxin toimintaperiaatteesta johtuen sillä on oltava oma vierityspuskurinsa) sekä monirivisten tekstivalintojen tekeminen pystysuunnassa jaetuista ikkunoista (yksi tekstirivi terminaaliemulaattorissa menee koko ikkunan reunasta reunaan huolimatta tmuxin ikkunajaosta). Näihin molempiin ongelmiin tmux tarjoaa oman ihan toimivan ratkaisunsa, mutta ne on silti otettava jokapäiväisessä käytössä huomioon. Hyvänä puolena tässä on toki se, että tmuxin kanssa interaktio pysyy aina samanlaisena, vaikka terminaaliemulaattori tai toimintaympäristö jotenkin muuttuisi.

Yksi mielenkiintoinen ja mahdollisesti hankalasti hahmotettava tilanne saattaa ilmetä tilanteessa, jossa käyttäjä ajaa sisäkkäisiä tmux-istuntoja. Tällainen tilanne saattaa tulla eteen silloin, kun paikallisessa tmux-istunnossa ajetaan SSH-yhteyden yli etä-tmux-istuntoa. Tällöin ei ole välittömästi hahmotettavissa, mihin tmux-istuntoon annetut komennot vaikuttavat. Tmux tarjoaa tähän useammankin ratkaisumallin, mutta oma ohjeeni olisi, että tällaista tilannetta kannattaa lähtökohtaisesti välttää. Selkeämpi vaihtoehto on väliaikaisesti irtautua paikallisista tmux-istunnoista kokonaan ja ottaa SSH-yhteys ilman paikallista terminaalimultipleksausta.

Miten tmuxin kanssa pääsee alkuun?

Tmuxin asentamiseen on hyvät ohjeet GitHubissa olevassa wikissä. Samaisessa wikissä on myös kattavat ohjeet käytön aloittamiseen. Tärkeintä on sisäistää tmuxin komentoetuliitenäppäinyhdistelmä (eli prefix), joka oletuksena on ctrl+b (merkitty ohjeisiin C-b). Uuden tmux-istunnon saa helpoimmillaan ajamalla komennon tmux new, jonka jälkeen listauksen tmuxin näppäinkomennoista saa syöttämällä ensin prefix-yhdistelmän ctrl+b ja syöttämällä sen jälkeen ?-merkin. Kyseisestä listauksesta pääsee pois painamalla q-näppäintä.

Aluksi tmuxin käyttäminen saattaa tuntua kankealta, mutta aika pian yleisimmin käytetyt komennot tulevat selkäytimestä ja työskentely terminaalissa alkaa tuntua ihanalta. Sinua on varoitettu.

Tykkäsitkö tästä jutusta?

6
4
2
1
Kenttä on validointitarkoituksiin ja tulee jättää koskemattomaksi.
Jaa juttu somessa
Tällä viikolla näitä luettiin eniten
  1. Google AI Overview – tekoälypohjaiset hakutulokset muuttavat hakukokemusta
  2. Maailman vierailluimmat verkkosivustot
  3. HTTP-virhekoodit – eli mitä näet silloin, jos nettisivu ei toimi kuten odotit
Viime aikoina eniten reaktioita herättivät
Ota yhteyttä
Tilaa uutiskirje