Tmux (terminal multiplexer) — это консольная утилита, которая позволяет запускать несколько независимых сессий, окон и панелей терминала внутри одного реального окна, а также оставлять их работать в фоне при отключении от сервера
Find a file
2026-09-30 01:50:32 +05:00
_install Add My Custom Monitoring Plugins 2026-09-05 17:40:16 +05:00
forthebadge Add My Custom Monitoring Plugins 2026-09-05 17:40:16 +05:00
tmux Исправлен битый PROMPT_COMMAND (пустая команда между ; ломала каждый промпт) 2026-09-30 01:50:32 +05:00
clone_tmux.sh first commit 2026-08-22 10:16:31 +05:00
local_install.sh Обновить local_install.sh 2026-09-29 11:26:06 +05:00
README.md Add My Custom Monitoring Plugins 2026-09-05 17:40:16 +05:00

tmux-config

curl -O https://mygit.lkaz.ru/lukas91/le_tmux/raw/branch/main/clone_tmux.sh
chmod a+x clone_tmux.sh && ./clone_tmux.sh

Скачивает le_tmux в /tmp/le_tmux_clone и ставит конфиг через local_install.sh.

Что это

Конфигурация tmux на основе samoshkin/tmux-config: горячие клавиши, statusline, буфер обмена (в т.ч. по SSH), вложенные (nested) tmux-сессии, Oracle SID виджет.

Структура

clone_tmux.sh        # bootstrap: качает репо в /tmp и запускает local_install.sh
local_install.sh      # установка конфига в $HOME (офлайн, из _install/)
tmux/                  # сама конфигурация, копируется в ~/.tmux
├── tmux.conf           # основной конфиг
├── tmux.remote.conf    # доп. настройки при SSH-сессии
├── yank.sh             # copy-to-clipboard (pbcopy → xsel/xclip → remote-tunnel → OSC52)
├── copy_all.sh         # копирует весь scrollback пейна (right-click меню "Copy All")
├── oracle_sid.sh       # statusline-виджет: список запущенных Oracle-инстансов
├── oracle_sid_sync.sh  # шарит $ORACLE_SID пейна в tmux pane-option (source из .bashrc)
├── bash_history.sh     # общая bash history между всеми панами/окнами
├── renew_env.sh        # обновление env-переменных при переподключении к сессии
├── sidebar.sh           # открывает file-tree сайдбар слева, с сохранением layout
└── restore_sidebar.sh   # восстанавливает layout после закрытия сайдбара (pane-exited хук)
_install/
├── tmux/                # tmux, tree, xsel+X11-цепочка, libevent, htop, rlwrap — rpm (el8) и deb
└── plugins/              # tpm, tmux-sidebar, tmux-better-mouse-mode, tmux-prefix-highlight

Плагины (через TPM)

Плагин Назначение
tmux-plugins/tpm Tmux Plugin Manager
tmux-plugins/tmux-sidebar движок file-tree сайдбара (позиционирование переопределено — см. ниже)
nhdaly/tmux-better-mouse-mode скролл колесом мыши в панах (@scroll-speed-num-lines-per-scroll = 2)
tmux-plugins/tmux-prefix-highlight индикатор нажатого prefix / copy-mode в statusline

Ключевые блоки конфига

  • Base settings: history-limit 20000, индексация окон/панов с 1, mouse on, escape-time 0, auto-rename выключен.
  • Keybindings: сплиты, навигация по панам стрелками, resize, zoom +, kill pane/window/session, merge сессий C-u, rename r/R, reload конфига C-r.
  • Nested/remote sessions: авто-детект SSH ($SSH_CLIENT) → tmux.remote.conf (statusline снизу). F12 выключает prefix/keytable во внешней сессии для прозрачного управления вложенной по SSH.
  • Copy mode / clipboard: vi-style keys, кастомный скролл, yank.sh. Копирование выделенного — ALT+C (или Enter/y).
  • Shared bash history: bash_history.sh через PROMPT_COMMAND.
  • Theme: цвета вынесены в переменные (color_main, color_secondary, color_level_ok/warn/stress и т.д.).
  • Statusline: слева — имя сессии; справа — prefix-индикатор, [OFF]-индикатор (nested mode), zoom-индикатор [Z], Oracle SID, user@host+дата.

Sidebar слева

tmux-sidebar из коробки поддерживает только @sidebar-tree-position left|right со своей логикой сплита — не подошла. Бинд t переопределён на sidebar.sh (свой сплит tree | less).

Проблема: сплит -h внутри уже существующего -h-сплита схлопывает вложенность в один ряд, и при закрытии сайдбара место достаётся не соседней паре, а предыдущему пейну в ряду. Решение: sidebar.sh сохраняет #{window_layout} в tmux-опцию перед сплитом, restore_sidebar.sh восстанавливает его из глобального хука pane-exited (после того как пейн реально закрыт — восстановление в той же командной цепочке видит старое число пейнов и молча падает).

Правый клик по пейну (MouseDown3Pane)

Дефолтное меню tmux нельзя дополнить, только переопределить целиком — поэтому в tmux.conf это стандартное меню (as-is) плюс два новых пункта после "Copy Line": "Clear Scrollback" (C) и "Copy All" (A, весь scrollback пейна через copy_all.sh → yank.sh).

Гоча с порядком: send-keys -R (reset) должен идти до clear-history — reset сам заносит видимый экран в history, так что очистка после reset убирает и его тоже.

Установка local_install.sh

./local_install.sh

Требование tmux ≥ 3.0 (display-menu, хук pane-exited). Скрипт сам проверяет версию и под root сносит слишком старую перед установкой бандловой (el8_tmux-3.2.rpm / deb_tmux_3.5a.deb).

Пакеты — офлайн из _install/linuxpackages/, ставятся только под root:

  • tmux, tree — обязательные.
  • libevent (rpm/deb), libjemalloc2 (deb) — рантайм-зависимости tmux.
  • xsel + X11-цепочка (libXau→libxcb→libX11, для deb — libxau6/libxcb1/libx11-data/libx11-6) — одной транзакцией.
  • htop, rlwrap — опциональные, без root просто печатают TIP с ручной установкой.

Плагины — офлайн из _install/plugins/, копируются без root. local_install.sh ставит +x на все файлы внутри ~/.tmux/plugins/** — перенос через Windows сбрасывает executable-бит, без этого плагины падают с "returned 126/127".

Важно про sudo: запускать под тем же пользователем, для которого ставится конфиг (sudo ./local_install.sh, а не логин в root напрямую) — иначе $HOME окажется /root.

Copy All (буфер обмена через MobaXterm)

yank.sh перебирает backend'ы: pbcopy (OSX) → reattach-to-user-namespace → xsel/xclip (X11) → SSH remote-tunnel (nc, порт @copy_backend_remote_tunnel_port) → OSC52 fallback. Для MobaXterm рабочий путь — xsel через X11 forwarding: OSC52 в MobaXterm ненадёжен.

yank.sh вытягивает DISPLAY/SSH_TTY из tmux show-environment -g — см. грабли ниже, почему не напрямую из $ENV.

Oracle SID statusline-виджет

oracle_sid.sh (запускается из status-right, аргумент — #{@oracle_sid}) + oracle_sid_sync.sh (source из .bashrc, зеркалит $ORACLE_SID активного пейна в pane-option через PROMPT_COMMAND).

Показывает запущенные ora_pmon_<SID> через пробел:

  • активный (совпадающий с $ORACLE_SID пейна) — зелёный бейдж;
  • $ORACLE_SID пуст — жёлтый бейдж "ORACLE_SID EMPTY <<" перед списком;
  • $ORACLE_SID задан, но не совпадает ни с одним запущенным — жёлтый бейдж со значением перед списком.

tmux.remote.conf и tmux.conf должны включать $wg_oracle_sid в status-right идентично — иначе виджет пропадёт на SSH-сессиях.

Prefix key

Prefix — дефолтный tmux C-b (задан явно). tmux-prefix-highlight показывает [^B] в statusline при зажатом prefix ([Copy] в copy-mode).

Тестовый харнесс для oracle_sid.sh

На тестовом сервере (XX.XX.XX.XX, юзер oracle):

  • /home/oracle/ps_emulate.sh — эмулирует ps -eo args с реалистичными ora_pmon_*/ora_lmon_*/ora_dbw0_* строками.
  • /home/oracle/fakebin/ps — копия эмулятора в начале $PATH для тестирования виджета целиком (там $PATH прописывать литералом, без $ — см. грабли ниже).

Не переносить эти тестовые файлы на прод — там настоящий ps.

Известные грабли/особенности tmux

  • run-shell/copy-pipe/if-shell видят окружение tmux-СЕРВЕРА, не текущего клиента. tmux show-environment показывает то, что попадёт в НОВЫЕ пейны, но не то, что видят уже запущенные run-shell-команды — те получают окружение процесса сервера, застывшее на момент его старта. Для критичной логики не полагаться на $ENV_VAR внутри run-shell — тянуть через tmux show-environment -g.
  • tmux-опция не откатывается к дефолту сама при удалении set-строки из конфига. Нужен явный set обратно к нужному значению.
  • tmux-сервер завершается, если убить последнюю сессию.
  • tmux.conf — не bash, но поддерживает variable="value" + $variable-подстановку на этапе парсинга. Для шеллового $PATH/$HOME внутри #()-команд — писать литералом, а не $PATH.
  • Офлайн-плагины в _install/plugins/, склонированные на Windows, могут получить CRLF → /usr/bin/env: 'bash\r': No such file or directory. Проверять file <script> на CRLF перед добавлением нового плагина в бандл.
  • Дефолтное меню MouseDown3Pane нельзя дополнить — только целиком переопределить.