Podstawowe informacje

TMUX posiada trzy obiekty, tj: sesje, okna i panele, sesje są to osobne procesy, czyli każde kolejne uruchomienie programu tmux, w sesji możemy tworzyć okna a te możemy dzielić na panele. TMUX działa w trybie client-serwer, przy pierwszym uruchomieniu tmux, jest uruchamiany serwer, zamknięcie wszystkich sesji tmux kończy pracę serwera.

Uruchomienie nowej sesji

tmux

Więcej na temat tmux https://github.com/tmux/tmux/wiki

Zmiana prefiksu ctrl-b na ctrl-a

TMUX jako prefiks czyli skrót do uruchamiania poleceń używa Ctrl+b w odróżnieniu do programu screen, w którym używany jest skrót Ctrl+a. Pierwszą rzeczą jaką robię w konfiguracji tmux to właśnie zamiana Ctrl+b na Ctrl+a.

W pliku konfiguracyjnym ~/.tmux.conf dodajemy na początku

set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix

Zmiana ustawień klawiszy na Vim zamiast Emacs

Szczególnie przydatne w trybie COPY W pliku konfiguracyjnym ~/.tmux.conf dodajemy

setw -g mode-keys vi

Tryb COPY

Tryb COPY umożliwia poruszanie się po buforze, czyli mówiąc inaczej przewijamy tekst oglądając wcześniej wykonane komendy. Wejście do trybu COPY Copy-a-[. Wyjście z trybu COPY 2 x ESC lub q

Poruszanie się w trybie COPY

Istnieją dwa tryby – tryb vi oraz tryb emacs zmianę trybu wykonujemy poleceniem

setw -g mode-keys vi

Poruszanie się po trybie COPY w dwóch trybach vi i emacs

Funkcja vi emacs

Wejście do trybu COPY

Copy-a-[

Copy-a-[

Back to indentation

^

M-m

Clear selection

Escape

C-g

Copy selection

Enter

M-w

Cursor down

j

Down

Cursor left

h

Left

Cursor right

l

Right

Cursor to bottom line

L

Cursor to middle line

M

M-r

Cursor to top line

H

M-R

Cursor up

k

Up

Delete entire line

d

C-u

Delete to end of line

D

C-k

End of line

$

C-e

Goto line

:

g

Half page down

C-d

M-Down

Half page up

C-u

M-Up

Next page

C-f

Page down

Next word

w

M-f

Paste buffer

p

C-y

Previous page

C-b

Page up

Previous word

b

M-b

Quit mode

q

Escape

Scroll down

C-Down or J

C-Down

Scroll up

C-Up or K

C-Up

Search again

n

n

Search backward

?

C-r

Search forward

/

C-s

Start of line

0

C-a

Start selection

Space

C-Space

Transpose chars

C-t

Operacja kopiuj wklej w trybie COPY

  • Wejście do trybu COPY - Ctrl-a-[

  • Zaznaczenie tekstu - Spacja

  • Skopiowanie tekstu - Enter

  • Wklejenie tekstu - Ctrl-a-]

Przykładowa konfiguracja ~/.tmux.conf

# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @plugin 'fcsonline/tmux-thumbs'
set -g @plugin 'sainnhe/tmux-fzf'
set -g @plugin 'wfxr/tmux-fzf-url'
# set -g @plugin 'omerxx/catppuccin-tmux' # My fork that holds the meetings script bc I'm lazy af
set -g @plugin 'omerxx/tmux-sessionx'

set -g @sessionx-bind 'o'

# Zmiana ctrl-b na ctrl-a
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix

# Zmienia ctrl-b na ctrl-space
# unbind C-b
# set -g prefix C-Space
# bind C-Space send-prefix

# unbind-key C-f
# TMUX_FZF_LAUNCH_KEY="C-f"
TMUX_FZF_ORDER="window|session|pane|command|keybinding|clipboard|process"

set -s set-clipboard on

# start with window 1 (instead of 0)
set -g base-index 1

# start with pane 1
set -g pane-base-index 1

set-window-option -g pane-base-index 1
set-option -g renumber-windows on

# shorten command delay
set -sg escape-time 1

# enable vi mode keys
set-window-option -g mode-keys vi

# Użycie Alt-Strzałki do zmiany panelu
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

bind -n M-H select-pane -L
bind -n M-J select-pane -D
bind -n M-K select-pane -U
bind -n M-L select-pane -R

# Użycie prefiksu + hjkl do zmiany panelu
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Użycie Shift-Strzałki do zmiany okna
bind -n S-Left previous-window
bind -n S-Right next-window
bind -n S-Up last-window          # Shift-Up  poprzednie okno
bind -n S-Down choose-window      # wybór okna

# zmiana okna lewy alt-h, alt-l
bind -n M-h previous-window
bind -n M-l next-window
bind -n M-j switch-client -l      # ostatnia sesja
bind -n M-k choose-tree           # wybór sesji

# zamienia okna miejscami
bind-key m command-prompt -p "move window to:"  "swap-window -t '%%'"

# bind-key -n C-M-Space display-popup -w 80% "ls ~/Downloads | fzf"

# bind -n C-h previous-window
# bind -n C-l next-window

# Zarządzanie oknami
# bind -n C-t new-window -c "#{pane_current_path}"    # ctrl-t otwiera nowe okno
# bind k confirm kill-window                          # ctrl-a-k zamknij okno - wymaga potwierdzenia
bind K kill-window                                  # ctrl-a-K zamknij okno
# unbind c
# unbind p
# unbind n

# Użycie Shift-Strzałki do zmiany sesji
bind -n C-Left switch-client -p    # poprzednia sesja
bind -n C-Right switch-client -n   # następna sesja
bind -n C-Up switch-client -l      # ostatnia sesja
bind -n C-Down choose-tree         # wybór sesji

# w trybie COPY 'v' zaczyna zaznaczanie tak jak spacja
bind-key -T copy-mode-vi v send-keys -X begin-selection
# w trybie COPY 'Ctrl-v' zmienia tryb zaznaczania z liniowego na blokowy
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
# w trybie COPY 'y' kopiuje zaznaczony tekst lub jeśli nie jest nic zaznaczone wychodzi z trybu COPY
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel

# Użycie myszki
# wersja dla tmux < 2.1
#set -g mode-mouse on
#set -g mouse-resize-pane on
#set -g mouse-select-pane on
#set -g mouse-select-window on
# wersja dla tmux > 2.1
set -g mouse on

# Ustawienie dzielenia panelu dodatkowo otwiera w tej samej ścieżce
bind \\ split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# Dodanie informacji po prawej stronie paska statusu
set-option -g status-right "#(whoami)@#H %H:%I "

# Przeładowanie konfiguracji tmux
bind-key r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"

# Prefix D uruchamia edycję pliku ./TODO.md lub ~/git/github/dotfiles/todo.md
bind -r D neww -c "#{pane_current_path}" "[[ -e TODO.md ]] && $EDITOR TODO.md || $EDITOR ~/git/github/dotfiles/todo.md"
# bind -r D send-keys -t.- 'doas dnf update' Enter

set -g pane-active-border-style 'fg=green,bg=default'
set -g pane-border-style 'fg=brightblack,bg=default'

# http://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/¬
# Ustawienie paska statusu
set-option -g set-titles on
set -g status-interval 1

# Basic status bar colors
set -g status-fg colour238
set -g status-bg colour233

# Left side of status bar
set -g status-left-length 40
set -g status-left "#[fg=colour232,bg=colour245,bold] #S #[fg=colour240,bg=colour235]#[fg=colour240,bg=colour235] #I:#P #[fg=colour235,bg=colour233,nobold]"
# set -g status-left "#[fg=colour232,bg=colour245,bold] #S #[fg=colour245,bg=colour240,nobold]#[fg=colour233,bg=colour240] #(whoami) #[fg=colour240,bg=colour235]#[fg=col our240,bg=colour235] #I:#P #[fg=colour235,bg=colour233,nobold]"

# Right side of status bar
set -g status-right-length 150
set -g status-right "#[fg=colour245 ,bg=colour240]#[fg=colour232,bg=colour245,bold] #H "
# set -g status-right "#[fg=colour235,bg=colour233]#[fg=colour240,bg=colour235] %H:%M:%S #[fg=colour240,bg=colour235]#[fg=colour233,bg=colour240] %d-%b-%y #[fg=colour245 ,bg=colour240]#[fg=colour232,bg=colour245,bold] #H "

# Window status
set -g window-status-current-format " #I:#W#F "
set -g window-status-current-style fg=brightwhite,bg=colour237,bold,noitalics
set -g window-status-format " #I:#W#F "
set -g window-status-style fg=white,bg=colour235,noitalics
set -g window-status-separator ""

# Window separator
set -g window-status-separator ""

# Window status alignment
set -g status-justify centre

# Pane number indicator
set -g display-panes-colour colour233
set -g display-panes-active-colour colour245

# Clock mode
set -g clock-mode-colour colour240
set -g clock-mode-style 24

# set-option -g default-shell /usr/bin/fish
# set-option -g default-shell /usr/bin/zsh
set-option -g default-shell /usr/bin/zsh

set -g history-limit 10000

# set -g default-terminal "screen-256color"
# set -g default-terminal "tmux-256color"
# set -g default-terminal "xterm-256color"
# set-default colorset-option -ga terminal-overrides ",xterm-256color:Tc"
# set -g default-terminal 'screen-256color'
# set -g default-terminal 'screen-256color'
# set -ga terminal-overrides ',xterm-256color:Tc'
# set -as terminal-overrides ',xterm*:sitm=\E[3m'
# set -g terminal-overrides ',xterm-256color:Tc'
# set -g default-terminal "xterm-256color"
# set-option -ga terminal-overrides ",xterm-256color:Tc"

# działa
# set-option -sa terminal-overrides ",xterm*:Tc"

set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB"

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

Skróty klawiszowe

Standardowo prefix to skrót Ctrl-b wcześniej pokazałem jak go zamienić na skrót Ctrl-a, w tabelce poniżej takiego używam.

Skrót

Działanie

Ctrl-a d

Odłączenie od sesji, wyjście z tmux; nie zamyka sesji

Ctrl-a c

Tworzy nowe okno

Ctrl-a n

Przechodzi do następnego okna

Ctrl-a p

Przechodzi do poprzedniego okna

Ctrl-a [1-9]

Przechodzi do wybranego okna

Crtl-a \

Dzieli okno pionowo, tworzy panel

Ctrl-a -

Dzieli okno poziomo, tworzy panel

Ctrl-a hjkl

Poruszanie się pomiędzy panelami

Ctrl-a ;

Przełączanie się pomiędzy dwoma ostatnio używanymi panelami

Ctrl-a o

Przechodzi do następnego panelu

Ctrl-a {

Przenosi aktywny panel na prawo

Ctrl-a }

Przenosi aktywny panel na lewo

Ctrl-a spacja

Zmienia rozmieszczenie paneli

Ctrl-a q

Wyświetla numer panelu

Ctrl-a !

Przenosi bieżący panel do nowego okna

Ctrl-a z

Przy kilku panelach w oknie pokazuje / chowa bieżący panel na całym ekranie

Ctrl-a $

Zmiana nazwy sesji

Ctrl-a ,

Zmiana nazwy okno

Ctrl-a x

Zamknięcie bieżącego panelu, jeśli okno posiada jeden panel, to zamknie okno

Ctrl-a &

Zamknięcie bieżącego okna, jeśli sesja posiada jedno okno, to zamknie sesję

Ctrl-a s

Wyświetla wszystkie sesje i pozwala na przełączanie się pomiędzy nimi

Ctrl-a w

Wyświetla sesje a także znajdujące się w nich okna

Ctrl-a (

Przechodzi do poprzedniej sesji

Ctrl-a )

Przechodzi do następnej sesji

Ctrl-a ?

Wyświetla listę skrótów klawiszowych

Parametry polecenia tmux

Utworzenie nowej sesji

Jeśli uruchomimy program tmux bez parametrów, to zostanie utworzona nowa sesja. Chyba, że znajdujemy się już w sesji tmux, wtedy nie zostanie utworzona nowa sesja.

tmux

Tak samo jak dodając parametr new lub new-session

tmux new-session

tmux new

Innym przykładem utworzenia nowej sesji, jest utworzenie sesji i jednocześnie odłączenie się od niej, taka operacja może być wykonana nawet w sytuacji, kiedy jesteśmy już w sesji tmux. Służy do tego parametr -d. Dodatkowo warto nazwać sesję tak, żeby ją można było łatwo zidentyfikować. Do ustawienia nazwy sesji służy parametr -s.

tmux new -d -s DESK-1

Lista istniejących sesji

tmux ls

Przykładowy wynik polecenia tmux ls

3: 2 windows (created Sat Jul 16 14:59:05 2022)
7: 1 windows (created Sun Jul 17 14:47:30 2022)
DESK-1: 2 windows (created Sun Jul 17 14:01:56 2022) (attached)
DESK-2: 1 windows (created Sun Jul 17 14:43:41 2022)
Notes: 1 windows (created Sat Jul 16 14:15:57 2022) (attached)
QUAKE: 2 windows (created Sat Jul 16 14:16:53 2022) (attached)
SYNCTHING: 1 windows (created Sat Jul 16 14:15:51 2022)

Jak widać część z nich posiada nazwy a część możemy zidentyfikować używając cyfry / liczby.

Podłączenie się do istniejącej sesji

Podłączenie się do sesji jest możliwe jeśli znajdujemy się w terminalu bez aktywnej sesji tmux

tmux attach
tmux atta
tmux a

Podłączenie się do wybranej sesji za pomocą parametru -t

tmux a -t DESK-1

Zamknięcie wszystkich sesji tmux

tmux ls | grep : | cut -d. -f1 | awk '{print substr($1, 0, length($1)-1)}' | xargs kill

Linia komend

Wejście do trybu komend realizujemy za pomocą skrótu Ctrl-a :. W tym trybie możemy wydawać polecenia np: uruchomić nową sesję:

:new
:new -s NAZWA-SESJI

Menadżer pluginów TPM

Instalacja

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

W pliku .tmux.conf dodajemy na początku listę wtyczek, które chcemy używać

set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @plugin 'fcsonline/tmux-thumbs'
set -g @plugin 'sainnhe/tmux-fzf'
set -g @plugin 'omerxx/tmux-sessionx'

Na końcu pliku .tmux.conf dodajemy

run '~/.tmux/plugins/tpm/tpm'

Teraz należy przeładować konfigurację za pomocą skrótu C-a : wchodzimy do trybu COMMAND, następnie wydajemy komendę:

source-file ~/.tmux.conf

Na koniec instalujemy wtyczki używając skrótu C-a I.


Date: 2020-10-24T19:30:00+02:00