Совет: запускайте tmux скриптом

Я использую tmux, но делаю это не очень продуктивно. Недавно я решил, что tmux — один из инструментов моей работы, поэтому нужно научиться использовать tmux эффективно.

Начал читать по этому поводу книгу tmux 2: productive mouse-free environment и в целом думать об этом, и решил заодно публиковать советы, как же лучше использовать инструменты, в том числе и tmux, под соответствующими тегами.


Сегодняшний совет: запускайте tmux скриптом, а не просто командой tmux.

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

#!/bin/sh

tmux kill-session -t remote

tmux new -s remote -n shell -d
tmux new-window -t remote -n logs

tmux send-keys -t remote:0.0 "cd projects/super-secret-project" C-m
tmux send-keys -t remote:1.0 "tail -n 30 -f /var/log/super-secret-project/error.log" C-m

tmux select-window -t remote:0.0
tmux attach -t remote

В результате получается сессия с названием remote1 с двумя окнами: в одном уже открыта папка с проектом, в другом уже открыт tail -f нужного логфайла; фокус на окне с башем; можно сразу приступить к работе.

Команда send-keys отправляет в указанную панель нажатия кнопок, как если бы вы их сами нажимали, поэтому для команд, которые должен исполнить шелл, надо указать в конце C-m (это способ указать ^M, а это, в свою очередь, способ описать, что был нажат Enter. Я всё ещё пишу пост про историю консоли, да).

-t обозначает окно или панель, формат простой: sessionName:windowIndex.paneIndex. Поэтому скрипт может работать сразу с несколькими сессиями (или принимать имя сессии как параметр, например). Можно сделать разные скрипты для разных проектов, или один большой скрипт, который сразу открывает всё необходимое для нескольких проектов.

Ещё две детали про этот скрипт: в самом начале я прибиваю предыдущую сессию на всякий случай, и в конце делаю attach — первое скорее всего необязательно в большинстве случаев, а если не делать attach, то можно делать скрипты, которые меняют текущую сессию tmux — например, условный debug-mode, который создаёт новое окно, запускает в нём дебаггер и открывает рядом логи — но я пока этого не делал.

В итоге я подключаюсь по ssh и выполняю ~/start-tmux, чтобы получить готовое окружение.

1

Такое название помогает мне отделить локальный tmux от tmux на удаленной машине (и поэтому сессия на удаленной машине называется remote). Tmux в tmux работает неплохо, если забиндить C-a C-a на send-prefix; но доходить до tmux в tmux в tmux мне приходилось только несколько раз, не рекомендую.