Tmux

Tmux — терминальный мультиплексор. Он позволяет создавать несколько терминалов в одном окне, делить экран на панели и сохранять процессы после закрытия терминала или разрыва SSH-соединения.

Руководство рассчитано на tmux 3.x в Linux и macOS.

Содержание

Основные понятия

сервер tmux
└── сессия
    ├── окно 1
    │   ├── панель 1
    │   └── панель 2
    └── окно 2
        └── панель 1

Отсоединение от сессии не завершает программы внутри неё. Они работают, пока не завершены явно, не остановлен сервер tmux или не выключена машина.

Установка

Ubuntu и Debian

sudo apt update
sudo apt install tmux

Fedora

sudo dnf install tmux

Arch Linux

sudo pacman -S tmux

macOS

brew install tmux

Проверка версии:

tmux -V

Префикс

Стандартный префикс tmux — Ctrl+b. Большинство сочетаний вводятся после него.

Запись Prefix c означает:

  1. нажать Ctrl+b;
  2. отпустить клавиши;
  3. нажать c.

Это не одновременное нажатие трёх клавиш. Список действующих сочетаний открывается командой:

Prefix ?

Для выхода из списка нажмите q.

Быстрый старт

Создать именованную сессию:

tmux new -s work

Отсоединиться, сохранив процессы:

Prefix d

Показать сессии:

tmux ls

Подключиться снова:

tmux attach -t work

Короткий вариант:

tmux a -t work

Создать сессию или подключиться к ней, если она существует:

tmux new-session -A -s work

Сессии

Команды оболочки

Действие Команда
Создать сессию tmux new -s NAME
Создать в фоне tmux new -d -s NAME
Показать сессии tmux ls
Подключиться tmux a -t NAME
Отключить другие клиенты и подключиться tmux a -d -t NAME
Переименовать tmux rename-session -t OLD NEW
Завершить сессию tmux kill-session -t NAME
Завершить все, кроме выбранной tmux kill-session -a -t NAME
Завершить сервер и все сессии tmux kill-server

Сочетания внутри tmux

Сочетание Действие
Prefix d Отсоединиться
Prefix s Выбрать сессию
Prefix $ Переименовать сессию
Prefix ( Предыдущая сессия
Prefix ) Следующая сессия
Prefix L Последняя использованная сессия

Завершение последней оболочки в сессии обычно закрывает эту сессию.

Окна

Окна похожи на вкладки.

Сочетание Действие
Prefix c Создать окно
Prefix , Переименовать окно
Prefix & Закрыть окно с подтверждением
Prefix n Следующее окно
Prefix p Предыдущее окно
Prefix l Последнее использованное окно
Prefix w Список окон и панелей
Prefix 09 Перейти к окну по индексу
Prefix ' Ввести индекс окна
Prefix . Изменить индекс окна
Prefix f Найти окно по отображаемому тексту

Команды через режим Prefix ::

new-window -n logs
new-window -n server 'npm run dev'
rename-window editor

Безопасный способ закрыть текущую оболочку:

exit

Prefix & принудительно закрывает окно и завершает процессы во всех его панелях.

Панели

Разделение и закрытие

Сочетание Действие
Prefix % Разделить окно слева/справа
Prefix " Разделить окно сверху/снизу
Prefix x Закрыть панель с подтверждением
Prefix z Развернуть панель или вернуть раскладку
Prefix ! Вынести панель в отдельное окно
Сочетание Действие
Prefix Left Панель слева
Prefix Right Панель справа
Prefix Up Панель сверху
Prefix Down Панель снизу
Prefix o Следующая панель
Prefix ; Последняя активная панель
Prefix q Показать номера панелей

Размер и раскладка

Изменение размера стандартными сочетаниями:

Prefix Ctrl+Left
Prefix Ctrl+Right
Prefix Ctrl+Up
Prefix Ctrl+Down

Или через Prefix ::

resize-pane -L 5
resize-pane -R 5
resize-pane -U 3
resize-pane -D 3

Переключение готовых раскладок:

Prefix Space

Выбор раскладки по имени:

select-layout even-horizontal
select-layout even-vertical
select-layout main-horizontal
select-layout main-vertical
select-layout tiled

Перестановка панелей:

Prefix {    поменять с предыдущей
Prefix }    поменять со следующей

Командный режим и адресация

Командный режим открывается сочетанием:

Prefix :

Полный адрес объекта имеет вид:

сессия:окно.панель

Примеры адресов:

work:1
work:editor
work:1.0
work:editor.2

Команду tmux можно выполнить внутри командного режима или из обычной оболочки:

tmux rename-window -t work:1 editor
tmux select-window -t work:editor
tmux send-keys -t work:server 'npm run dev' Enter

Диагностические команды:

tmux list-commands
tmux list-keys
tmux show-options -g
tmux list-clients

Прокрутка и копирование

У tmux есть собственная история каждой панели. Войти в режим копирования:

Prefix [

Выйти — q. Если включён режим mode-keys vi, доступны клавиши:

Клавиша Действие
h, j, k, l Перемещение
Ctrl+u, Ctrl+d Полстраницы вверх/вниз
g, G Начало/конец истории
/, ? Поиск вперёд/назад
n, N Следующее/предыдущее совпадение
Space Начать выделение
Enter Скопировать выделение в буфер tmux

Вставить последний буфер:

Prefix ]

Работа с буферами из оболочки:

tmux list-buffers
tmux show-buffer
tmux save-buffer ~/tmux-buffer.txt
printf '%s' 'текст' | tmux load-buffer -

Буфер tmux и системный буфер обмена — разные сущности. Интеграция с системным буфером зависит от ОС и терминала: обычно применяются OSC 52, pbcopy в macOS, wl-copy в Wayland или xclip в X11.

Конфигурация

Основной пользовательский файл:

~/.tmux.conf

Также может поддерживаться XDG-путь:

~/.config/tmux/tmux.conf

Перезагрузить настройки:

tmux source-file ~/.tmux.conf

Пример готового ~/.tmux.conf

# Префикс Ctrl+a
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Нумерация с единицы
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on

# Удобство
set -g mouse on
set -g history-limit 50000
set -sg escape-time 10
setw -g mode-keys vi

# Новые окна и панели наследуют текущий каталог
bind c new-window -c '#{pane_current_path}'
unbind %
unbind '"'
bind | split-window -h -c '#{pane_current_path}'
bind - split-window -v -c '#{pane_current_path}'

# Навигация между панелями
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Повторяемое изменение размера
bind -r H resize-pane -L 5
bind -r J resize-pane -D 2
bind -r K resize-pane -U 2
bind -r L resize-pane -R 5

# Перезагрузка конфигурации
bind r source-file ~/.tmux.conf \; display-message 'tmux.conf перезагружен'

# Цветовой режим
set -g default-terminal 'tmux-256color'
set -as terminal-features ',xterm-256color:RGB'

# Строка состояния
set -g status-interval 5
set -g status-left '#S '
set -g status-right '%Y-%m-%d %H:%M'

После сохранения нажмите Prefix r либо один раз выполните tmux source-file ~/.tmux.conf. В приведённом варианте разделение выполняется через Prefix | и Prefix -.

Название терминала в terminal-features должно соответствовать значению $TERM до запуска tmux. Не задавайте $TERM случайным значением в настройках оболочки.

Мышь

При set -g mouse on можно выбирать панели, менять их размер, прокручивать историю и переключать окна мышью. Для обычного выделения текста терминалом часто требуется удерживать Shift; точное поведение зависит от эмулятора терминала.

Автоматизация

Создание рабочего пространства

#!/usr/bin/env bash
set -euo pipefail

SESSION="myapp"
ROOT="$HOME/projects/myapp"

if tmux has-session -t "$SESSION" 2>/dev/null; then
  exec tmux attach-session -t "$SESSION"
fi

tmux new-session -d -s "$SESSION" -n editor -c "$ROOT"
tmux send-keys -t "$SESSION:editor" 'nvim .' Enter

tmux new-window -t "$SESSION" -n server -c "$ROOT"
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter

tmux new-window -t "$SESSION" -n shell -c "$ROOT"
tmux split-window -h -t "$SESSION:shell" -c "$ROOT"
tmux select-layout -t "$SESSION:shell" even-horizontal

tmux select-window -t "$SESSION:editor"
exec tmux attach-session -t "$SESSION"

Сделать скрипт исполняемым:

chmod +x ~/bin/myapp-tmux

Полезные команды для скриптов

# Проверить существование сессии
tmux has-session -t work

# Создать фоновую сессию с командой
tmux new-session -d -s job 'python3 long_task.py'

# Захватить видимое содержимое панели
tmux capture-pane -p -t work:1.0

# Захватить содержимое вместе с историей
tmux capture-pane -p -S - -t work:1.0 > pane.log

# Вывести структуру tmux
tmux list-sessions -F '#{session_name}: #{session_windows} окон'
tmux list-windows -a -F '#{session_name}:#{window_index} #{window_name}'
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_current_command}'

Работа по SSH

Запускайте tmux на удалённой машине, если процессы должны пережить разрыв SSH:

ssh user@example.com
tmux new-session -A -s main

После запуска задачи отсоединитесь через Prefix d. Позже снова подключитесь по SSH и выполните:

tmux attach -t main

Если локальный и удалённый tmux используют один префикс, передать Ctrl+b внутреннему экземпляру можно последовательностью:

Prefix Ctrl+b

Удобная альтернатива — разные префиксы: например, Ctrl+a локально и Ctrl+b удалённо.

Подключение только для чтения:

tmux attach -r -t main

Устранение неполадок

no server running

Сервер не запущен либо используется другой сокет. Создайте сессию:

tmux new -s work

duplicate session

Сессия уже существует:

tmux attach -t work

Или используйте универсальную команду:

tmux new-session -A -s work

Сессия отмечена как attached

Можно подключиться параллельно либо отключить прежний клиент:

tmux attach -d -t work

Не применился tmux.conf

tmux source-file ~/.tmux.conf
tmux show-options -g mouse
tmux show-options -g prefix

Сообщения tmux открываются через Prefix ~.

Не работают цвета

Проверьте терминал и наличие terminfo:

printf '%s\n' "$TERM"
infocmp tmux-256color
tmux display-message -p '#{client_termname} / #{default-terminal}'

Если tmux-256color отсутствует, установите пакет terminfo для своей системы. Временный совместимый вариант:

set -g default-terminal 'screen-256color'

Зависла панель

Сначала попробуйте Ctrl+c. Принудительное закрытие:

Prefix x

Или:

tmux kill-pane -t work:1.0

Это завершит процессы панели и может привести к потере несохранённых данных.

Шпаргалка

Самые важные команды

Действие Команда или сочетание
Создать сессию tmux new -s NAME
Создать или подключиться tmux new -A -s NAME
Список сессий tmux ls
Подключиться tmux a -t NAME
Отсоединиться Prefix d
Создать окно Prefix c
Переименовать окно Prefix ,
Следующее/предыдущее окно Prefix n / Prefix p
Разделить слева/справа Prefix %
Разделить сверху/снизу Prefix "
Перейти между панелями Prefix + стрелка
Закрыть панель Prefix x
Развернуть панель Prefix z
Режим копирования Prefix [
Вставить буфер tmux Prefix ]
Командный режим Prefix :
Справка по клавишам Prefix ?

Минимум для запоминания

tmux new -s work   создать сессию
Prefix d           отсоединиться
tmux a -t work     подключиться
Prefix c           создать окно
Prefix %           разделить слева/справа
Prefix "           разделить сверху/снизу
Prefix ?           открыть справку

Главное правило: Prefix d сохраняет работающие процессы, а закрытие панели, окна или сессии завершает связанные с ними процессы.