普段開発ではターミナル上でほぼ全て開発をしており、エディタもneovimを使ってコードを書いています。 ターミナルではtmuxを使って作業内容やリポジトリごとに分割しており、エディタや立ち上げたサーバーのログを表示する画面、コマンド実行するなどの作業用途ごとで分けています。 また、仕事では複数のプロジェクトがあり、同じような画面構成でsessionを分けて使用しています。
上記のような画面構成はPCを立ち上げ直すたびに作成していて、サーバーの立ち上げなど色々なコマンドを実行したりと煩雑になっていました。
このような作業を自動化するためにtmuxでの作業環境を構築するスクリプトを作成しました。
動作環境
- zsh 5.8.1 (x86_64-ubuntu-linux-gnu)
- tmux 3.2a
画面構成
普段作業しているtmuxの画面構成はプロジェクトごとに異なっていますが、基本下記のような構成にしています。
上のpaneではneovimを開いており、下のpaneにそれぞれサーバーのログの表示とコマンドの実行などの作業を行っています。
また別のwindowでは新たに作業画面が必要になったときに使用できるよう分割をしていないwindowを作成しています。
上記のような構成を各プロジェクトごとにsessionで分けて作成しています。 
スクリプト
自動化をするためのスクリプトのサンプルを下記に記載します。
それぞれのコマンドの説明を記載します。
tmux-startup() {
local session
local window
local window_name
local session_path
# session 1
session="<session名を記載>"
session_path="$HOME/<pathを記載>"
tmux new-session -d -s $session -c "$session_path" -x- -y-
window=0
window_name="main"
tmux rename-window -t $session:$window "$window_name"
tmux send-keys -t $session:$window "<vimなど>" C-m
tmux split-window -v -t $session:$window -c "$session_path" -p 30
tmux send-keys -t $session:$window.1 '<serverの立ち上げスクリプトなど>' C-m
tmux split-window -h -t $session:$window -c "$session_path"
window=1
window_name="sub"
tmux new-window -d -t $session:$window -n "$window_name" -c "$session_path"
# session 2
session="<session名を記載>"
session_path="$HOME/<pathを記載>"
tmux new-session -d -s $session -c "$session_path" -x- -y-
window=0
window_name="main"
...
# プロジェクトごとに作成したい画面構成を作成していく
# tmux起動時のpaneの選択
session="<tmux起動時にアクセスしたいsessionを指定>"
window="<tmux起動時にアクセスしたいwindowを指定>"
tmux select-pane -t $session:$window.0
tmux attach-session
}
変数を定義
session名やwindow名、pathなどを指定するための変数を定義します。
この変数を使ってsession名やwindow名の設定、ディレクトリのpathなどを指定します。
local session
local window
local window_name
local session_path
# session 1
session="<session名を記載>"
session_path="$HOME/<pathを記載>"
sessionの作成
new-sessionで新しくsessionを作成します。
-dでバックグランドで作成するようにします。
-sで作成するsession名に名前をつけます。
-cでsessionが開始されるディレクトリを指定します。
-x -yはバックグラウンドで開始するときにサイズを指定するためのオプションですが、のちにpaneを分割するときのサイズを調整したいので、スクリプトを実行したときの画面サイズに合わせるために-x-, -y-で指定しています。
tmux new-session -d -s $session -c "$session_path" -x- -y-
windowのリネーム、paneの分割やスクリプトの実行
変数にwindowのインデックスや名前を指定します。
sessionを作成したときに自動的にwindowも作成されるのでrename-windowでリネームしています。-tでターゲットのsession, windowを指定しリネームしたい名前をつけます。
次にsend-keysでpaneにコマンドを送信します。-tでターゲットのsession, windowを指定します。またC-mでコマンドを実行します。
split-windowでpaneを分割します。
-vで水平に分割し、-hで垂直に分割します。
-tはターゲットのsession, windowを指定します。
-cで新しいpaneのディレクトリを指定します。
-pはpaneのサイズをパーセンテージで指定します。sessionの作成で-x- -y-を指定したのは画面サイズに合わせて調整するためです。
window=0
window_name="main"
tmux rename-window -t $session:$window "$window_name"
tmux send-keys -t $session:$window "<vimなど>" C-m
tmux split-window -v -t $session:$window -c "$session_path" -p 30
tmux send-keys -t $session:$window.1 '<serverの立ち上げスクリプトなど>' C-m
tmux split-window -h -t $session:$window -c "$session_path"
新しいwindowの作成
メインの作業windowとは別にサブのwindowを作成しています。
新しくwindowを作りたい場合はnew-windowで作成します。
-tはターゲットのsession, windowを指定します。
-nでwindowの名前をつけます。
-cで新しいpaneのディレクトリを指定します。
window=1
window_name="sub"
tmux new-window -d -t $session:$window -n "$window_name" -c "$session_path"
subでもpaneを分割したい場合はpaneの分割で記載したコマンドを実行して画面構成を作成していきます。
別のsessionの作成
新たにsessionを作成したい場合は上記を同じように繰り返します。
画面構成を作成する前にsessionやwindow_nameなどの変数を設定し、windowのインデックスを0に戻しておきます。
# session 2
session="<session名を記載>"
session_path="$HOME/<pathを記載>"
tmux new-session -d -s $session -c "$session_path" -x- -y-
window=0
window_name="main"
tmux起動時にアクセスしたい作業画面を指定
変数にtmuxを起動したときにアクセスしたいsession, windowを記載します。
paneは指定できないのでインデックスで指定する必要があります。
select-paneで指定したpaneをアクティブにしてtmux起動時にアクセスできるようにします。
-tでsession, window, paneを指定します。
attach-sessionで作成したsessionにアタッチします。
# tmux起動時のpaneの選択
session="<tmux起動時にアクセスしたいsessionを指定>"
window="<tmux起動時にアクセスしたいsessionを指定>"
tmux select-pane -t $session:$window.0
tmux attach-session