ばうあーろぐ TOP へ戻る

tmux でプロジェクト用のウィンドウをたくさん扱いたい

2015年最初の投稿です。本年もよろしくお願いいたします。

全然書いてなかったので書きます。 ブログは定期的に書いてないと書き方を忘れてしまいがちなので、 もう少し気軽に書いていければと思います。

tmux のウィンドウ、ペインの準備の時間を削りたい

tmux、めっちゃ便利ですよねー。

便利なので、開きっぱなしにしちゃいがちなんですが、 本当は使うもの以外を閉じておきたいのです。

そもそも tmux のセッション管理だとか、あるいは tmuxinator など色々便利なものがありますが、 もうちょっと気軽にさくっと扱えればいいなーと思ってました。

何がやりたいかというと・・・

  1. 少しのショートカットキーとプロジェクト名を入力するだけで準備が整う
  2. エディター、シェル、タスクランナーの3分割
  3. 上記構成を比較的柔軟に変えられる

このあたりができればいいなと思います。

構成を考える

特に tmux の細かな使い方が理解できていなかったので、 man tmux[prefix] ? などでドキュメントを読んでみました。

# ウィンドウを新しく作って、最初のディレクトリを合わせて指定
new-window -c "/path/to/dir"

# ウィンドウを上下に分割(水平)
split-window -h

# 現在のペインに対してキー入力を行う
send-keys "echo 'test123'"

# tmux で入力を受け付けて、シェルスクリプトを実行
command-prompt "run-shell 'cd /path/to/dir'"

他にもたくさんありますが、今回関連しそうなのはこのあたりっぽいですねー。

プロジェクト名を受け取り、画面を作るシェルスクリプト

まず、プロジェクト名の引数を1つとって、上記のコマンドの組み合わせでお好みのペインを作るところまでをシェルスクリプトで用意します。

たぶん人によってやりたいことは大分違ってきますし、 画面の分割以外にもシェルスクリプトでやれることなら色々と書けるはずなので、 僕の場合はタスクランナーを実際に走らせるところまでやっています。 (それ以上の細かいところは、これから考えていければと・・・)

#!/bin/sh

if [ $# -eq 1 ]; then
  TMUX_PROJECT_NAME="/var/www/$1"
else
  echo "usage: tmux-project (projectname)" 1>&2
  exit 1
fi

if [ ! -e $TMUX_PROJECT_NAME ]; then
  echo "no exist: $TMUX_PROJECT_NAME" 1>&2
  exit 1
fi

tmux new-window -c $TMUX_PROJECT_NAME
tmux split-window -c $TMUX_PROJECT_NAME -h
tmux split-window -c $TMUX_PROJECT_NAME -v

# has Gruntfile.js
if [ -e "$TMUX_PROJECT_NAME/Gruntfile.js" ]; then
  tmux send-keys "grunt watch^M"
fi

tmux select-pane -t 1

※実際はもっと具体的な記述になってますが、ざっくりこのような感じです。

このシェルスクリプトをとりあえず proj という名前にしておき、 ホームディレクトリの bin ディレクトリに入れて、パスを通して使ってます。 (&実行権限も)

tmux の command-prompt, run-shell を使い、引数付きのシェルスクリプトを呼び出す

今度は .tmux.conf に以下の設定を追記します。

# 予め用意した proj シェルスクリプトに tmux の入力受け付けで引数を渡す
# シェルスクリプト上でエディタ、シェル、タスクランナーなどに分割表示
bind-key P command-prompt -p "projectname:" "run-shell 'proj %1'"

プロジェクト管理ということなので、プレフィックスキーに続いて Shift-P キーで起動するようにしてみました。 command-prompt を割り当てた場合、そのキーを押すと以下のように入力部分が出てきます。

入力した文字が %1, %2 などで利用できるので、先ほどのシェルスクリプトと組み合わせると幸せになれますね。

まとめ

tmux のオプションがたくさんあって、調べるのにけっこう時間かかってしまいましたが、 同じペインの組み合わせを作ることがけっこう多いので、 そういった部分は可能な限り自動化されていると良いですよね。

試してみて、以下の組み合わせは有用だと思いました。

  1. tmux の command-prompt によるキーショートカット + キーワード入力
  2. tmux の run-shell とシェルスクリプトによる任意コマンド実行

ベースの部分がシェルスクリプトなので、今後新たなツールとかが出てきたとしても、 コマンドラインで動作できるものであれば、シェルスクリプトに落とし込みが可能です。 依存してるものが少ないというのもメリットなのかもしれませんね。

ではそろそろ、元々の仕事に戻りたいと思います・・・。

参考URL

もし記事内に誤りなどございましたら、 @girigiribauer までご一報いただけると助かります。