Новое в журнале. Маленькие pull request: почему их быстрее ревьюят и как резать задачу
Инструменты

Tmux для разработчика: сессии, окна, панели и минимальный конфиг

Разбираем, как устроен tmux: сессии, которые переживают разрыв соединения, окна и панели вместо десятка вкладок терминала, и конфиг на двадцать строк, после которого его хочется оставить навсегда.

12 мая 20268 мин чтенияПрактикам
Tmux для разработчика: сессии, окна, панели и минимальный конфиг
3 уровнясессия, окно, панель
1 файлвесь конфиг на 20 строк

Tmux решает узкую, но очень частую задачу: держать несколько рабочих контекстов в терминале и не терять их при разрыве соединения. Разработчик, который заходит на сервер по SSH, запускает долгую миграцию и теряет сеть, без tmux теряет и процесс. С tmux процесс продолжает работать в сессии, а подключиться к ней можно заново с любого компьютера. Разберём устройство tmux по уровням: сессия, окно, панель, и соберём минимальный конфиг, с которым это всё удобно использовать каждый день.

Зачем tmux, если есть вкладки терминала

Современный терминал умеет вкладки и так: iTerm2, Alacritty, Windows Terminal. Разница в том, что эти вкладки живут внутри процесса терминала на локальной машине. Закрыл окно, потерял вкладки. Tmux, наоборот, запускает отдельный сервер-демон, который хранит все сессии независимо от того, подключён к нему терминал прямо сейчас или нет. Благодаря этому у tmux есть три вещи, которых нет у обычных вкладок: сессии переживают обрыв SSH, к одной и той же сессии можно подключиться с двух разных машин одновременно, и раскладку окна с панелями легко сохранить и повторно открыть в одну команду.

Отдельный плюс для удалённой работы: на слабом канале проще держать одно SSH-соединение с tmux внутри, чем несколько параллельных подключений под разные вкладки.

Главная мысльСессия tmux не привязана к окну терминала: отключился от сервера, подключился обратно, и процесс как будто никуда не уходил.

Сессии: единица работы, которая не исчезает

Сессия в tmux - это контейнер верхнего уровня, в котором живут окна. Запустить новую сессию с именем: tmux new -s backend. Отключиться от неё, не завершая процессы внутри: сочетание Ctrl+b d (d от detach). После этого сессия продолжает работать в фоне на сервере, а терминал освобождается. Вернуться к ней: tmux attach -t backend, или короче tmux a -t backend.

  • tmux ls показывает список всех живых сессий на машине
  • tmux kill-session -t backend завершает сессию и все процессы внутри неё
  • tmux rename-session -t 0 backend переименовывает сессию, созданную без имени
Называйте сессии по проекту, а не по номеру: через месяц список из session-0, session-1, session-2 не скажет ничего, а backend, frontend, infra скажут всё сразу.

Окна и панели: раскладка рабочего пространства

Внутри сессии живут окна, а внутри каждого окна, в свою очередь, можно разбить пространство на панели. Окно в tmux ближе к вкладке браузера: это отдельный полноэкранный рабочий контекст с собственным набором панелей, который переключается целиком. Новое окно создаётся сочетанием Ctrl+b c, переключение между окнами по номеру: Ctrl+b 0, Ctrl+b 1 и так далее, а Ctrl+b n и Ctrl+b p двигают к следующему и предыдущему окну без запоминания номеров.

Панель - это деление уже внутри одного окна. Типичная раскладка для разработки на PHP или Node: слева редактор на всю высоту, справа сверху запущенный сервер с логами, справа снизу свободная панель для git и миграций. Разбить окно по вертикали: Ctrl+b %, по горизонтали: Ctrl+b ". Переключение между панелями стрелками после префикса: Ctrl+b, затем клавиша со стрелкой.

ДействиеКомбинация
Новое окноCtrl+b c
Переключить окно по номеруCtrl+b 0...9
Разбить панель по вертикалиCtrl+b %
Разбить панель по горизонталиCtrl+b "
Закрыть панель или окноCtrl+b x
Отключиться от сессииCtrl+b d

Размер панелей можно поменять сочетаниями Ctrl+b и зажатой стрелкой, но быстрее один раз настроить раскладку мышью, если в конфиге включена поддержка мыши, об этом ниже.

Вы в начале разбораДальше: разбор компромиссов, чек-лист и ответы на частые вопросы.

Минимальный конфиг на 20 строк

Конфиг tmux живёт в файле ~/.tmux.conf и применяется заново при каждом запуске сервера tmux. Перезагрузить его в уже открытой сессии без перезапуска: Ctrl+b :, затем source-file ~/.tmux.conf, или сразу привязать это к сочетанию клавиш.

# ~/.tmux.conf

# удобный префикс вместо Ctrl+b
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# нумерация окон и панелей с 1, а не с 0
set -g base-index 1
setw -g pane-base-index 1

# включить мышь: выбор панели и ресайз кликом
set -g mouse on

# быстрая перезагрузка конфига
bind r source-file ~/.tmux.conf \; display 'config reloaded'

# перемещение по панелям в стиле vim: h j k l
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# разбивка панелей из текущей директории
bind '"' split-window -c '#{pane_current_path}'
bind % split-window -h -c '#{pane_current_path}'

# история прокрутки побольше
set -g history-limit 10000

# статус-бар: имя сессии слева, время справа
set -g status-left '#[bold]#S '
set -g status-right '%H:%M'

Замена префикса с Ctrl+b на Ctrl+a не обязательна, но для многих удобнее: клавиша a ближе к мизинцу на home row, а Ctrl+b пересекается с некоторыми сочетаниями в Vim и Bash. Включённая мышь не отменяет клавиатурные привычки, она просто добавляет быстрый способ изменить размер панели без точного попадания по сочетанию клавиш.

Копирование и буфер без выхода в системный clipboard

У tmux есть собственный режим копирования, который работает даже без системного буфера обмена, например на сервере без графической сессии. Войти в режим копирования: Ctrl+b [, двигаться стрелками или клавишами Vim, если включён vi-режим, начать выделение пробелом, скопировать клавишей Enter. Вставить скопированное: Ctrl+b ].

# включить управление в стиле vim в режиме копирования
setw -g mode-keys vi

Для связи с системным буфером на macOS и большинстве настроек Linux с X11 или Wayland лучше явно настроить copy-pipe-and-cancel на pbcopy или wl-copy, иначе скопированный в tmux текст останется только внутри tmux и не вставится, например, в браузер.

Tmux и Vim как одна система навигации

Главное неудобство при совместном использовании tmux и Vim: обе программы делят пространство на панели своими средствами, и переключение между панелью tmux и split-окном Vim требует разных сочетаний клавиш. Плагин vim-tmux-navigator снимает это противоречие: он делает Ctrl+h, Ctrl+j, Ctrl+k, Ctrl+l универсальными, они двигают курсор между split-окнами Vim, а если курсор уже у края, передают управление в соседнюю панель tmux.

Со стороны tmux для этого плагина нужна небольшая настройка в конфиге, которая отличает панель с Vim от обычной панели и не перехватывает сочетания, когда фокус внутри Vim. После такой настройки разработчик перестаёт думать, где заканчивается Vim и начинается tmux: вся раскладка на экране двигается одним набором клавиш.

Типичные ошибки новичка в tmux

Самая частая ошибка - держать десятки отдельных сессий без имён и забывать, что в них запущено. Через неделю список из tmux ls превращается в случайный набор номеров, и разобраться, что живёт внутри каждой сессии, можно только подключившись к ней вручную. Привычка называть сессию по проекту сразу при создании снимает эту проблему: tmux new -s backend не оставляет места для путаницы.

Вторая ошибка - закрывать терминал напрямую крестиком вместо detach. Поведение зависит от настроек конкретного эмулятора терминала: иногда закрытие окна присылает сигнал, который действительно завершает процессы в сессии, а не просто отключает клиента. Привычка выходить через Ctrl+b d работает предсказуемо на любой машине и не зависит от настроек терминала.

Третья ошибка - пытаться скопировать текст мышью при включённом режиме мыши tmux так, как это делается в обычном терминале, зажав и выделив текст. Если мышь включена директивой set -g mouse on, обычное выделение начинает работать через внутренний буфер tmux, и поведение немного отличается от выделения в терминале без tmux. Для быстрого копирования одной строки это не проблема, но для больших кусков текста удобнее режим копирования клавиатурой.

Когда tmux не нужен

Если вся работа идёт на локальной машине с современным терминалом, который сам умеет вкладки и сохраняет их между запусками, часть пользы от tmux теряется. Tmux особенно оправдан там, где есть удалённое соединение: серверы, виртуальные машины, контейнеры разработки в облаке. На чисто локальной машине с короткими сессиями работы его стоит ставить ради удобных панелей и единого набора привычек, которые потом переносятся на любой сервер без дополнительного обучения.

Со временем набор привычек из tmux становится переносимым навыком: один и тот же конфиг копируется на новый сервер, новую рабочую машину или в контейнер разработки, и раскладка с панелями, сочетания клавиш и режим копирования работают одинаково везде. Это отличает tmux от настроек конкретного терминала, которые приходится настраивать заново на каждой системе отдельно.

Не пытайтесь выучить все возможности tmux за один вечер. Сессии и панели закрывают девять случаев из десяти, остальное (синхронизация панелей, скриптовые раскладки через tmuxinator) добавляйте по мере реальной нужды.

Частые вопросы

Чем tmux отличается от screen?

Обе программы решают одну задачу, мультиплексируют терминал и сохраняют сессии при отключении. Tmux современнее: у него удобнее панели, активнее сообщество плагинов и предсказуемый формат конфига. Screen всё ещё встречается на старых серверах, но для новой работы разумнее сразу ставить tmux.

Можно ли сохранить раскладку панелей и восстановить её после перезагрузки сервера?

Да, для этого существуют отдельные плагины вроде tmux-resurrect и tmux-continuum, которые периодически сохраняют состояние сессий на диск и восстанавливают его при следующем запуске сервера tmux. Это отдельный слой над базовым tmux, его стоит добавлять, когда раскладки становятся сложными и часто повторяются.

Работает ли tmux внутри Docker-контейнера?

Да, tmux обычный процесс в Linux, и его можно установить и запустить внутри контейнера так же, как на любой другой машине. Частый сценарий: зайти в контейнер по docker exec, поднять внутри tmux-сессию с несколькими панелями для сервера, логов и консоли, и потом безопасно отключаться и подключаться заново без потери запущенных процессов.

Код, который не стыдно передать

Начните с принципов, а дальше двигайтесь по рубрикам. Каждый разбор заканчивается чек-листом.

Случайный разбор