RLB

Just sharing knowledge

TmuxでPane分割を一括で実行する

f:id:rksz:20121118200115p:plain
普段の仕事で、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は奥が深い!