tmux: терминальный мультиплексор

Зачем

tmux позволяет:

  • Держать несколько терминалов в одном окне
  • Не терять сессию при разрыве SSH-соединения
  • Организовать рабочее пространство под проект: код, логи, сервер, БД, всё в одном месте
  • Быстро переключаться между контекстами без alt-tab

Концепции

tmux
 └── session (сессия) — контейнер верхнего уровня, привязан к проекту
      └── window (окно) — как вкладка в браузере
           └── pane (панель) — сплит внутри окна

Session: живёт пока не убьёшь явно. Отключился от SSH, а сессия продолжает работать. Window: полноэкранная вкладка внутри сессии. Переключение моментальное. Pane: разделение окна на части (вертикально/горизонтально).

Установка

# Arch
sudo pacman -S tmux

# Ubuntu/Debian
sudo apt install tmux

# macOS
brew install tmux

Prefix-клавиша

Все команды tmux начинаются с prefix, по умолчанию Ctrl+b. Нажимаешь prefix, отпускаешь, затем нажимаешь команду.

В примерах ниже <prefix> = Ctrl+b (или то, на что ты его переназначил).

Основные команды

Сессии

ДействиеКоманда
Новая сессияtmux new -s project
Список сессийtmux ls
Подключиться к сессииtmux attach -t project или tmux a -t project
Отключиться (сессия живёт)<prefix> d
Убить сессиюtmux kill-session -t project
Переключиться между сессиями<prefix> s (интерактивный список)
Переименовать сессию<prefix> $

Окна (вкладки)

ДействиеКоманда
Новое окно<prefix> c
Следующее окно<prefix> n
Предыдущее окно<prefix> p
Окно по номеру<prefix> 0..9
Переименовать окно<prefix> ,
Закрыть окно<prefix> & или exit
Список окон<prefix> w (с превью)

Панели (сплиты)

ДействиеКоманда
Вертикальный сплит<prefix> %
Горизонтальный сплит<prefix> "
Переключение между панелями<prefix> стрелки
Изменить размер панели<prefix> Ctrl+стрелки
Закрыть панель<prefix> x или exit
Развернуть панель на весь экран (toggle)<prefix> z
Поменять панели местами<prefix> { / <prefix> }
Показать номера панелей<prefix> q

Копирование и скролл

ДействиеКоманда
Режим копирования (скролл)<prefix> [
Выход из режима копированияq
Поиск в буфере<prefix> [, затем / или ?
Вставить из буфера<prefix> ]

В режиме копирования навигация как в vim (hjkl, /, ?, n, N).

Командная строка tmux

<prefix> : открывает командную строку внизу. Полезные команды:

:new-window -n logs      # новое окно с именем
:split-window -h          # горизонтальный сплит
:resize-pane -D 10        # увеличить панель на 10 строк вниз
:swap-window -t 0         # переместить окно на позицию 0

Dev-флоу: организация рабочего пространства

Структура сессии под проект

Идея: одна сессия = один проект. Внутри окна под разные задачи.

session: myapp
  ├── window 0: editor     — nvim / код
  ├── window 1: server     — запущенный dev-сервер
  ├── window 2: logs       — логи приложения / docker logs
  ├── window 3: db         — psql / redis-cli / mongosh
  └── window 4: git        — git операции, ветки, PR

Быстрый старт проекта (скрипт)

Создай скрипт ~/.local/bin/dev для автоматического поднятия рабочего окружения:

#!/bin/bash
# ~/.local/bin/dev
# Использование: dev myapp /path/to/project

SESSION="${1:-dev}"
PROJECT_DIR="${2:-.}"

# Если сессия уже есть — подключиться
tmux has-session -t "$SESSION" 2>/dev/null && exec tmux attach -t "$SESSION"

# Создать сессию
tmux new-session -d -s "$SESSION" -c "$PROJECT_DIR" -n editor

# Окно: сервер
tmux new-window -t "$SESSION" -n server -c "$PROJECT_DIR"

# Окно: логи
tmux new-window -t "$SESSION" -n logs -c "$PROJECT_DIR"

# Окно: git
tmux new-window -t "$SESSION" -n git -c "$PROJECT_DIR"

# Вернуться на первое окно
tmux select-window -t "$SESSION:editor"

# Подключиться
tmux attach -t "$SESSION"
chmod +x ~/.local/bin/dev
dev myapp ~/projects/myapp

Работа с несколькими проектами

# Утро: поднял два проекта
dev frontend ~/projects/frontend
# <prefix> d — отключился

dev backend ~/projects/backend
# <prefix> d — отключился

# Переключение между проектами:
# <prefix> s — интерактивный список сессий
# или напрямую:
tmux switch-client -t frontend

Паттерн: код + результат

Частый сценарий: редактор слева, результат справа.

<prefix> %          # вертикальный сплит
# Слева: nvim
# Справа: запуск тестов, curl, docker и т.д.

<prefix> z          # развернуть правую панель на весь экран (и обратно)

Паттерн: мониторинг

Окно logs с несколькими панелями:

<prefix> "          # горизонтальный сплит
<prefix> "          # ещё один

# Панель 1: docker logs -f app
# Панель 2: tail -f /var/log/app/error.log
# Панель 3: htop / btop

Конфигурация (~/.tmux.conf)

Минимальный конфиг для комфортной работы:

# Prefix на Ctrl+a (ближе к мизинцу, чем Ctrl+b)
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Нумерация окон и панелей с 1 (0 далеко на клавиатуре)
set -g base-index 1
setw -g pane-base-index 1

# Перенумерация при закрытии окна
set -g renumber-windows on

# Сплиты интуитивными клавишами
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# Новое окно в текущей директории
bind c new-window -c "#{pane_current_path}"

# Переключение панелей без prefix (Alt+стрелки)
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

# Ресайз панелей (prefix + Shift+стрелки)
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

# Мышь (скролл, клик по панелям, ресайз)
set -g mouse on

# Vim-клавиши в режиме копирования
setw -g mode-keys vi
bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi y send -X copy-selection-and-cancel

# 256 цветов + true color
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",*:RGB"

# Увеличить историю скролла
set -g history-limit 50000

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

# Уменьшить задержку escape (важно для vim/nvim)
set -sg escape-time 0

# Статусбар
set -g status-position top
set -g status-style "bg=default,fg=white"
set -g status-left "#[bold]#S "
set -g status-right "%H:%M"
set -g window-status-current-format "#[bold,fg=cyan]#I:#W"
set -g window-status-format "#[dim]#I:#W"

После изменения: <prefix> r (с конфигом выше) или tmux source ~/.tmux.conf.

Плагины (TPM)

Установка менеджера плагинов

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

Добавить в конец ~/.tmux.conf:

# Плагины
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'      # разумные дефолты
set -g @plugin 'tmux-plugins/tmux-resurrect'      # сохранение/восстановление сессий
set -g @plugin 'tmux-plugins/tmux-continuum'       # автосохранение сессий
set -g @plugin 'tmux-plugins/tmux-yank'            # копирование в системный буфер

# Автовосстановление
set -g @continuum-restore 'on'

# Инициализация TPM (держать в самом конце)
run '~/.tmux/plugins/tpm/tpm'

Установить плагины: <prefix> I (заглавная i).

Полезные плагины

ПлагинЧто делает
tmux-resurrectСохраняет и восстанавливает сессии после перезагрузки (<prefix> Ctrl+s / <prefix> Ctrl+r)
tmux-continuumАвтосохранение сессий каждые 15 минут
tmux-yankКопирование из tmux в системный буфер обмена
tmux-sensibleНабор разумных настроек по умолчанию

Шпаргалка: ежедневные команды

# Начало дня
dev myapp ~/projects/myapp         # поднять рабочее окружение

# В течение дня
<prefix> c          — новое окно
<prefix> 1..9       — переключить окно
<prefix> |          — вертикальный сплит (с конфигом выше)
<prefix> -          — горизонтальный сплит (с конфигом выше)
Alt + стрелки       — переключение между панелями (с конфигом выше)
<prefix> z          — развернуть/свернуть панель
<prefix> d          — отключиться (сессия живёт)
<prefix> s          — переключиться между проектами
<prefix> w          — обзор всех окон всех сессий
<prefix> [          — скролл / поиск в истории

# Конец дня
# Ничего не надо делать — сессии живут.
# После перезагрузки: tmux-resurrect восстановит всё.

Частые проблемы

Цвета в nvim/vim битые: добавь в конфиг set -g default-terminal "tmux-256color" и set -ag terminal-overrides ",*:RGB". В nvim: set termguicolors.

Задержка при нажатии Escape в vim: set -sg escape-time 0 в tmux.conf.

Не работает скролл мышью: set -g mouse on в tmux.conf.

Копирование не попадает в системный буфер: поставь tmux-yank или используй xclip/wl-copy вручную.

Новые окна/сплиты открываются в ~: используй флаг -c "#{pane_current_path}" (уже есть в конфиге выше).