akishin999の日記

調べた事などを書いて行きます。

tmux + tmuxinator が便利

最近ローカルの開発環境を Ubuntu 12.10 に上げていろいろ弄っていたのですが、遅ればせながらやっと導入してみた tmux + tmuxinator がかなり便利だったのでご紹介。

tmux は GNU screen などと同様のターミナルマルチプレクサと呼ばれるソフトウェアです。
tmuxinator はその tmux のセッション(いろいろな作業用ウインドウの組合せ)を予め定義しておき、一回のコマンド入力で定義したセッションを起動できるようにしてくれるツールです。

サーバマシンであれば滅多にシャットダウンや再起動はしないと思うので、基本的にはアタッチ、デタッチしか使わないため、あまりメリットが感じられないかも知れません。
とはいえ、ローカル環境では Linux といえどもシャットダウンや再起動したくなる事も多いので、tmuxinator を使っているのと使っていないのとでは開発環境の復元(起動)の手間が天と地ほどと言っても過言ではないと思います。

ちなみに今まではずっと GNU screen を使っていたんですが、screen にも同様の screeninator というツールがあるんですね。

jondruse/screeninator
https://github.com/jondruse/screeninator

もっと早く知っておけば良かった・・・。

tmuxinator についてはこちらの記事の通りに設定しました。

tmuxinatorで一瞬で開発環境を起動する #Ruby #開発環境 #AdventCalendar #tmux - Qiita
http://qiita.com/items/869b00fdde27c2225989

やったことはこのままなんですが、一応自分がやった時の手順を記しておきます。

環境は Ubuntu 12.10 になります。
また、tmuxinator は gem で提供されているので、Ruby がインストールされている必要があります。

tmux のインストール

まずは tmux 本体をインストールします。

% sudo apt-get install tmux

screen に慣れているので、キーバインドを screen 風に変更しました。
以下のファイルをコピーすれば screen と同じキーバインドになります。

% cp /usr/share/doc/tmux/examples/screen-keys.conf ~/.tmux.conf

マウスホイールによるスクロールバックなどを行えるようにするため、コピーした設定ファイルを編集します。

% vi ~/.tmux.conf

以下を追記しました。

# kill session
bind C-b kill-session
# copy mode
set-window-option -g mode-keys vi
# mouse setting                                                                                                              
set-window-option -g mode-mouse on
set-option -g mouse-select-window on
set-option -g mouse-select-pane on
set-option -g mouse-resize-pane on

これで tmux については完了です。

tmuxinator

gem からインストールします。

% gem install tmuxinator

インストールが完了したら、インストール後に表示される指示に従って初期設定を行います。

% echo "[[ -s $HOME/.tmuxinator/scripts/tmuxinator ]] && source $HOME/.tmuxinator/scripts/tmuxinator" >> ~/.zshrc
% source ~/.zshrc

tmuxinator は環境変数 $EDITOR と $SHELL を使用しているそうです。
確認したところ、手元の環境では $EDITOR のみ設定されていなかったので .zshenv に以下の行を追加しました。

% echo 'export EDITOR=/usr/bin/vi' >> ~/.zshenv

追加したら忘れずに再読込みしておきます。

% source ~/.zshenv 

設定されているかを確認します。

% echo $EDITOR $SHELL  
/usr/bin/vi /usr/bin/zsh

両方とも値が表示されているので問題なさそうです。

これでインストールは完了しました。

tmuxinator のプロジェクトを作成

早速 tmuxinator のプロジェクトを作成してみます。
プロジェクトの作成には [mux new プロジェクト名] というコマンドを実行します。

ここではとりあえず devel というプロジェクト名にしました。

% mux new devel

実行すると $EDITOR に設定したエディタで ~/.tmuxinator ディレクトリ以下に作成された yml ファイルが開きます。

# ~/.tmuxinator/devel.yml                                                                                                                    
# you can make as many tabs as you wish...

project_name: Tmuxinator
project_root: ~/code/rails_project
socket_name: foo # Not needed.  Remove to use default socket
rvm: 1.9.2@rails_project
pre: sudo /etc/rc.d/mysqld start
tabs:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - #empty, will just run plain bash
        - top
  - shell: git pull
  - database: rails db
  - server: rails s
  - logs: tail -f logs/development.log
  - console: rails c
  - capistrano:
  - server: ssh me@myhost

これらの値を適当に自分好みにカスタマイズしていきます。

tabs が tmux のウインドウ定義、panes が tmux のペイン定義です。
tabs の下の - に続く文字(:の前まで)はウインドウの名前として使用されます。
その後に続くのはそのウインドウで起動時に実行しておくコマンドになります。
panes の方は名前が付けられない点が異なるだけで、同じく実行しておくコマンドを記述しておきます。

ここでは以下のような感じで変更してみました。

# ~/.tmuxinator/devel.yml
# you can make as many tabs as you wish...

project_name: devel
project_root: ~/
tabs:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - #empty, will just run plain bash
        - top
  - shell: cd ~/src/ruby/
  - database: mysql -uroot -p

設定が完了したら保存してエディタを終了し、[mux プロジェクト名] コマンドを実行して tmux を起動します。

% mux devel

これで以下のように予め定義した設定通りに tmux のセッションが起動されます。

一度行った定義を後から変更したくなった場合は、一旦 tmux のセッションを終了(デタッチではなく終了)し、先ほどの設定ファイルを再度開いて変更すれば OK です。

実際にはプロジェクト毎や開発言語毎に予め設定を複数作成しておくといい感じです。
すごく便利なので、ぜひ一度使用してみることをお勧めします。