TmuxでPane分割を一括で実行する
普段の仕事で、tmuxでpane分割して12台のサーバに対してsynchronized-panesを利用して同時コマンド実行とかよく活用してます。
いままではtmuxのsplit-windowコマンドを大量発行して、なんとか分割してました。
「どう考えてもオプション(ry」と思ったものの、ぱっと見て見つからず。
さすがにそろそろムダな感じがしてきたので、pane分割スクリプト作っちゃいました。
実際、すぐに完成したので、もっと早く作っとけばよかったと後悔。多分生産性2割上がりました。
利用方法
以下のgitリポジトリをcloneして、dotfiles/bin以下をbashrc等でpathを通して貰えれば利用可能です。
git clone https://github.com/rksz/dotfiles.git
paneというファイルが実体コマンドです。bashで書かれています。
ほかにも便利コマンドが入っていますが、それらはまた別の機会に。
※2012/12/15 gitリポジトリ更新しました。
使い方
tmuxのsession中にこんな感じでコマンド叩くといい感じに分割してくれます
pane 10
optionにsをつけると、コマンド同期モード(synchronized-panes)で分割してくれます。
pane -s 3
3分割して、そのままsshコマンドを書き込んで、スムーズにリモート環境に3同時アクセスなんて芸当が簡単にできます。これが結構便利だったり。
ソースコード
https://github.com/rksz/dotfiles
#!/bin/bash # # Pane Splitter for TMUX @rksz # ######################################### ## get options ## readonly CMDNAME=`basename $0` while getopts :s opt do case $opt in "s" ) readonly FLG_S="TRUE" ;; * ) echo "usage: $CMDNAME [-s] pane_num" 1>&2 exit 1 ;; esac done shift `expr $OPTIND - 1` ## tmux pane split ## if [ $1 ]; then cnt_pane=1 while [ $cnt_pane -lt $1 ] do if [ $(( $cnt_pane & 1 )) ]; then tmux split-window -h else tmux split-window -v fi tmux select-layout tiled 1>/dev/null cnt_pane=$(( $cnt_pane + 1 )) done fi #OPTION: start session with "synchronized-panes" if [ "$FLG_S" = "TRUE" ]; then tmux set-window-option synchronize-panes 1>/dev/null fi
原理は単純に数字の回数だけ、split-windowを実行するのみです。
ポイントは回数毎にsplit-windowの向きを変え、さらにselect-layoutで整列させます。
これにより、paneを同一方向に分割しすぎることによる「幅が狭すぎて分割できません問題」を回避しています。今度はoption所をいろいろ追加するのも面白そうです。
tmuxは奥が深い!