От табов к tmux (и почему это не снобизм)
Я работаю в Windows Terminal поверх WSL2 (Ubuntu 26.04). Редактор у меня Zed; в терминале nano/vim/neovim только для мелких правок. Основной CLI-агент OpenCode.
tmux выглядит страшно. На деле это десяток сочетаний и один короткий конфиг. Я бы советовал выучить его как отдельную практику, один раз. А потом спокойно перепрыгнуть на herdr: та же модель с префиксом ctrl+b, только биндинги другие.
С чего всё началось
Долго жил вкладками Windows Terminal. Проблема не во вкладках, а в рутине. Каждый день перед работой одно и то же: зайти в проект, запустить дев-сервер, открыть агента, запустить скрипты. И фоном страх, что что-то вылетит, закроется, и ты потеряешь всё.
tmux закрыл обе проблемы разом:
- Сессии живут в фоне. Можно закрыть терминал и уйти. Когда вернёшься, всё на месте.
- Один раз собрал окружение (сессию с окнами и панелями) и больше не пересобираешь его каждое утро.
Для меня tmux не про редактор. Он про то, чтобы не пересобирать рабочее место заново.
База: шорткаты и сценарии
Всё держится на одном префиксе: Ctrl + b. Жмёшь его и отпускаешь. Дальше идёт команда. Больше почти ничего учить не нужно. А когда перейдёте на herdr, там та же модель с префиксом ctrl+b.
Сессии: главное
tmux new -s myproject # создать именованную сессию
tmux a -t myproject # вернуться в неё
tmux ls # список живых сессий
Сценарий: запустил дев-сервер в сессии, нажал Ctrl + b → d (detach), закрыл терминал. Сервер работает. Вернулся и подключился обратно: tmux a -t myproject.
Окна (вкладки)
| Действие | Хоткей |
|---|---|
| Новое окно | Ctrl + b → c |
| Переключиться по номеру | Ctrl + b → 0 (или 1, 2…) |
| Переименовать | Ctrl + b → , (запятая) |
Сценарий: одно окно под дев-сервер, другое под CLI-агента.
Панели (сплиты)
| Действие | Хоткей |
|---|---|
| Вертикальный сплит | Ctrl + b → % |
| Горизонтальный сплит | Ctrl + b → " |
| Навигация | Ctrl + b → стрелки |
| Закрыть | exit / Ctrl + d |
Сценарий: сервер слева, консоль справа.
Конфиг под OpenCode в Windows Terminal
«Голый» tmux работает. Но когда внутри него запущен OpenCode (TUI) в Windows Terminal, вылезают мелочи. Ниже конфиг, который их чинит.
Файл: ~/.tmux.conf
# 1. Окружение терминала
set -g default-terminal "tmux-256color"
# 2. Всё, что нужно для Windows Terminal в одной строке
# RGB (TrueColor): чинит фоны в OpenCode
# extkeys: Shift+Enter (мягкий перенос)
# clipboard: буфер обмена
# cstyle: форма курсора
set -as terminal-features ",xterm-256color:RGB:extkeys:clipboard:cstyle"
# 3. Мышь и расширенные клавиши
set -g mouse on
set -s extended-keys on
# 4. Буфер обмена для OpenCode
set -g set-clipboard on
set -g allow-passthrough on
# 5. Защита от мусора при клике по статус-бару
# (OpenCode включает mouse tracking, и Windows Terminal шлёт эхо)
set -g focus-events off
bind-key -n MouseDown1Status select-window -t= \; send-keys -M
Что за проблемы?
Проблема 1: копирование не работает. OpenCode пишет «Copied», но в буфере Windows пусто. Причина: tmux по умолчанию не пропускает ANSI-коды OSC 52. Решение: allow-passthrough on.
Проблема 2: мусор в строке ввода при клике по статус-бару. Кликаешь на 0:bash*, и в консоль летит мусор вроде 7070b8b/a8a8e3e3.... Причина: OpenCode держит терминал в режиме mouse/focus tracking; клик по статус-бару порождает эхо-ответ от Windows Terminal, который пролетает сквозь tmux. Решение: focus-events off и перехват клика по статус-бару с переключением окна.
После правок перезагрузите сервер:
tmux kill-server
При новом запуске всё чисто.
Координация агентов
Это, по-моему, и есть смысл всей затеи: tmux как прослойка между AI-агентами. У меня сейчас в работе OpenCode (оркестратор) и Pi Agent. Каждый в своей панели, оркестратор шлёт запросы в исполнитель и читает ответ прямо через tmux.
Идея на потом: Claude Code и locked-in тарифы
У Anthropic два режима оплаты Claude Code, и разница в них большая:
- Интерактив. Ты в терминале смотришь на ответы, расход списывается с подписки Pro/Max по квотам. Дёшево.
- Программное управление. API-ключ (оплата за токен),
claude -p, Agent SDK, CI. Это считается автоматизацией: платишь отдельно, без льгот подписки. При активном использовании разница доходит до порядка.
У меня тут простой тезис: на любой locked-in рано или поздно находится правильное решение автоматизации. В случае Claude Code потенциальная лазейка такая: гнать оркестрацию не через API/Agent SDK, а через интерактивный TUI. Открыл Claude Code в соседней панели tmux и управляешь им напрямую, отправляешь нажатия, читаешь ответ. Тогда использование формально остаётся «интерактивным» и держится в дешёвом режиме подписки, а не уходит в дорогую автоматизацию.
Честно скажу: это гипотеза, которую я ещё не проверял на практике, а не готовый рецепт. Держу её на потом. Пока что для моих задач оркестрации полностью хватает связки ollama cloud + opencode / pi. Отдельный Claude Code мне не нужен. Если гипотеза подтвердится, допишу отдельную заметку с пруфом.
Дальше: herdr
Если агенты становятся основным сценарием, следующий шаг herdr. Это не tmux, а отдельный мультиплексор под агентов: та же модель с префиксом ctrl+b, но биндинги свои. Зато из коробки мышь работает как надо и звук бьёт, когда агент ждёт тебя. А в сайдбаре видно, кому из агентов нужно внимание. tmux вы учите именно ради того, чтобы потом не переучиваться на подход, а сразу зайти в herdr.
Шпаргалка
# Сессии
tmux new -s <name> # создать
tmux a -t <name> # подключиться
tmux ls # список
tmux kill-server # перезагрузка всего
# Внутри tmux (Prefix = Ctrl + b)
Prefix + d # detach
Prefix + c # новое окно
Prefix + , # переименовать окно
Prefix + % # сплит по вертикали
Prefix + " # сплит по горизонтали
Prefix + стрелки # навигация
Prefix + 0-9 # окно по номеру
Заметка собрана по следам реальной настройки. База и конфиг проверены на себе. Идея про Claude Code через tmux остаётся гипотезой на потом.