- Shell 100%
|
|
||
|---|---|---|
| _install | ||
| forthebadge | ||
| tmux | ||
| clone_tmux.sh | ||
| local_install.sh | ||
| README.md | ||
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, renamer/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нельзя дополнить — только целиком переопределить.