hideoka.dev

tmuxでの開発環境を自動化

普段開発ではターミナル上でほぼ全て開発をしており、エディタもneovimを使ってコードを書いている。 ターミナルではtmuxを使って作業内容やリポジトリごとに分割しており、エディタや立ち上げたサーバーのログを表示する画面、コマンド実行するなどの作業用途ごとで分けている。 また、仕事では複数のプロジェクトがあり、同じような画面構成でsessionを分けて使用している。

上記のような画面構成はPCを立ち上げ直すたびに作成していて、サーバーの立ち上げなど色々なコマンドを実行したりと煩雑になっていた。

このような作業を自動化するためにtmuxでの作業環境を構築するスクリプトを作成した。

動作環境

画面構成

普段作業している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