Czym jest tmux? Link to heading

tmux, czyli Terminal Multiplexer, to najpopularniejszy przedstawiciel całej gałęzi programów służących do emulowania wielu terminali w jednej sesji. Jego kod możesz znaleźć na GitHubie. Jeśli używasz jakiejś dystrybucji Linuksa lub macOS, to tmux jest albo od razu zainstalowany, albo dostępny za pomocą Twojego ulubionego menedżera pakietów.

W tym artykule chciałbym zawrzeć, jak korzystam z tmuxa i jak go konfiguruję. Jeśli chcesz dogłębnie zapoznać się z tematem, najlepszym miejscem jest oczywiście strona główna projektu i oficjalna dokumentacja. Znajdziesz tam wszystko, czego potrzebujesz, a nawet prosty generator konfiguracji, który pomoże Ci szybciej zacząć.

Zastosowania Link to heading

Jak już wspomniałem powyżej, służy on do zarządzania wieloma terminalami w jednej sesji. Daje ogromne możliwości, jeśli nie chcesz cały czas przeklikiwać się przez zakładki w iTermie lub innym emulatorze z taką funkcjonalnością. Działa też na zdalnych systemach, kiedy logujesz się przez SSH. Z mojego punktu widzenia pozwala na lepszą kategoryzację wielu sesji i okien oraz przyspiesza nawigację między nimi.

Zacznijmy Link to heading

Pierwsze wrażenia Link to heading

Żeby uruchomić tmuxa, po prostu uruchom w swoim terminalu komendę tmux. Kiedy już to zrobisz, zauważysz, że prawie nic się nie zmieniło. To “prawie” jest tu ważne. Teraz na dole ekranu terminala pojawił się pasek statusu. To na nim będą wyświetlone wszystkie informacje na temat aktywnych okien w działającej sesji. Na razie nie jest za ładny, ale warto się przyzwyczaić do tego domyślnego wyglądu, zwłaszcza jeśli zdarza Ci się często logować na maszyny (np. serwery), którymi nie zarządzasz, albo nie chce Ci się co chwila kopiować swojego pliku konfiguracyjnego. Później zajmę się też lekkim upiększaniem tego, jak wygląda, ale na razie przejdźmy do podstaw.

Podstawy obsługi Link to heading

Najważniejszy do zapamiętania jest tak zwany prefix (domyślnie kombinacja klawiszy Ctrl + b). Wiele osób pierwsze, co robi w tmuksie, to zmiana prefixa na Ctrl + a, co argumentują lepszą ergonomią. Inni wolą wyrabiać sobie pamięć mięśniową do domyślnych klawiszy, żeby potem nie błądzić bez swoich konfiguracji. Według mnie obie opcje są w porządku tak długo, jak Ci służą. Ja zmieniam ten prefix, bo też uważam domyślny za mało naturalny.

Dobra, co dalej z tym prefixem? Otóż jakikolwiek by on był, daje znać tmuxowi, że teraz zamierzasz przekazać polecenia jemu, a nie aktywnemu terminalowi. Najbardziej podstawowe akcje to:

  • Ctrl + b % - dzieli aktywny panel na lewą i prawą część
  • Ctrl + b " - dzieli aktywny panel na górną i dolną część
  • Ctrl + b <arrow> - do poruszania się między panelami aktywnego okna
  • Ctrl + b c - tworzy nowe okno
  • Ctrl + b <number> - zmienia aktywne okno
  • Ctrl + b : - otwiera linię poleceń, gdzie możesz wykonywać akcje bez zdefiniowanych skrótów klawiszowych

Kolejną rzeczą, którą wiele osób zmienia, jest część powyższych skrótów. Ja osobiście wolę zmienić dzielenie ekranu na | dla podziału na lewą i prawą część oraz - dla podziału na górną i dolną część. Po prostu lepiej mi to pasuje wizualnie i łatwiej to zapamiętać, ale tak samo jak z prefixem problem pojawia się, kiedy nie masz gdzieś swojego pliku konfiguracyjnego.

Jak ja korzystam z tmuxa Link to heading

Mój sposób pracy z tym narzędziem jest dość prosty i sprowadza się do kilku zasad:

  • jeden projekt w obrębie jednej sesji
  • pierwsze okno to zawsze edytor (w moim przypadku neovim, ale o tym też napiszę w innym artykule) i panel z terminalem do szybkiego wywoływania komend
  • kolejne okna służą do SSH albo długo działających komend, jak na przykład serwowanie aplikacji

I to naprawdę tyle, ale niezmiernie przyspieszyło moją pracę z wieloma oknami.

Konfiguracja i upiększanie Link to heading

Teraz zajmijmy się tym, jak wygląda i działa tmux. Zamierzam tutaj podać moją aktualną konfigurację, która jest dość minimalna, ale wystarczająca. Przeanalizuję ją i wytłumaczę, co się dzieje w każdej linijce. Tutaj też od razu mogę odesłać do fajnego artykułu Ham Vocke | Make tmux Pretty and Usable, który czytałem właśnie wtedy, kiedy robiłem moją konfigurację.

# Simple tmux configuration
# based on: https://hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/
#
# ---
# Explanation:
# This configuration replaces default prefix 'b' with 'a',
# changes indexing start from 0 to 1 (easier to use with keyboard),
# rebinds splits to more descriptive keys '-' and '|',
# enables mouse interactions,
# adds custom subtle theming
# ---
# Instructions:
#
# to use tmux at bash start add below lines from comment to .bashrc file (or other rc of your shell)
# if [ -x "$(command -v tmux)" ] && [ -n "${DISPLAY}" ] && [ -z "${TMUX}" ]; then
#     exec tmux new-session -A -s "${USER}" >/dev/null 2>&1
# fi
#
# You can also add this nifty little alias to your shell rc file:
# alias tmx='tmux attach-session -t default || tmux new -s default'
# this will attach to 'default' session or create one if it doesn't exist


unbind C-b

# Start windows and panes at 1, not 0 for easier keyboard navigation
set -g base-index 1
setw -g pane-base-index 1

# set a as prefix key
set-option -g prefix C-a
bind-key C-a send-prefix

# set natural splitters | and -
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# quick reload
bind r source-file ~/.tmux.conf

# fast pane switch without prefix
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# mouse control
set -g mouse on

# add style
set-option -g status-position top
set -g status-left-length 40
set -g status-style bg=default,fg=default
set -g status-right "#[fg=#81a1c1, bg=default, bold] 󰃰 %Y-%m-%d 󱑀 %H:%M "
set -g status-left "#[fg=#a3be8c, bold] #S #[fg=#b48ead]| #[fg=#88c0d0]#(whoami)  #(hostname) #[fg=#b48ead]|"
set -g window-status-current-format "#[bg=#a3be8c,fg=black]  #I:#W #[bg=default,fg=default]"
set -g window-status-format " #[fg=#88c0d0] #I:#W "

Komentarze w większości opisują, co się tam dzieje, oraz dodają mały bonus w postaci kodu uruchamiającego tmuxa zawsze przy odpaleniu terminala. Ale po kolei.

unbind C-b

# Start windows and panes at 1, not 0 for easier keyboard navigation
set -g base-index 1
setw -g pane-base-index 1

# set a as prefix key
set-option -g prefix C-a
bind-key C-a send-prefix

W tym fragmencie usuwasz Ctrl + b jako prefix, ustawiasz początek indeksowania okien na 1 (domyślnie jest 0) i ustawiasz nowy prefix na Ctrl + a.

# set natural splitters | and -
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

Potem ustawiasz dzielenie okna na bardziej naturalne skróty oraz usuwasz stare.

# quick reload
bind r source-file ~/.tmux.conf

Dodajesz skrót do szybkiego przeładowania konfiguracji. To przydaje się, kiedy pracujesz nad zmianami i testujesz różne opcje. Żeby przeładować nową konfigurację, wciskasz kombinację Ctrl + a r. Od tego momentu używasz już nowego prefixa, czyli Ctrl + a, a nie domyślnego Ctrl + b.

# fast pane switch without prefix
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# mouse control
set -g mouse on

Ustawiasz jeszcze lepszą nawigację pomiędzy panelami. Teraz Alt + <arrow> (w Macu Option zamiast Alt) pozwala szybko przełączać się pomiędzy panelami w ramach aktywnego okna. Ostatnia linia dodaje obsługę myszy. Ogólnie raczej unikam jej używania, ale czasem przydaje się do zaznaczenia jakiegoś tekstu, logu czy czegokolwiek innego.

# add style
set-option -g status-position top
set -g status-left-length 40
set -g status-style bg=default,fg=default
set -g status-right "#[fg=#81a1c1, bg=default, bold] 󰃰 %Y-%m-%d 󱑀 %H:%M "
set -g status-left "#[fg=#a3be8c, bold] #S #[fg=#b48ead]| #[fg=#88c0d0]#(whoami)  #(hostname) #[fg=#b48ead]|"
set -g window-status-current-format "#[bg=#a3be8c,fg=black]  #I:#W #[bg=default,fg=default]"
set -g window-status-format " #[fg=#88c0d0] #I:#W "

Na samym końcu jest poprawa wyglądu. Kiedyś używałem pluginu ze skórką Nord, ale uznałem, że to jeszcze bardziej komplikuje sprawę, i przerzuciłem się na prostsze rozwiązanie.

To, co tu widzisz, to przerzucenie panelu statusu na górę okna, lekka zmiana kolorów, formatowanie informacji takich jak aktywna sesja, użytkownik, host i okna w tej sesji po lewej oraz data i zegar po prawej. Wszystko okraszone jest jeszcze kilkoma ikonami z Nerd Fonta, więc do ich poprawnego wyświetlania potrzebujesz fontu z ikonami.

To tyle na start Link to heading

Ta konfiguracja nie robi z tmuxa kombajnu, ale daje mi dokładnie to, czego potrzebuję na co dzień: szybkie przełączanie się między kontekstami, sensowny podział okna i trochę czytelniejszy pasek statusu. Najlepiej potraktuj ją jako punkt wyjścia, pobaw się skrótami i zostaw tylko te rzeczy, które faktycznie przyspieszają Twoją pracę.