若干、ニッチな要件なような気がしないでもないですが、powerlineとtmuxの設定のちょっとした技です。ちょっとしたことですが、かなり快適になりました。
tmux.confは動的に設定を変えられない
結論から。こちらのリポジトリにあります。
まず、前提。私はdotfilesにて設定を管理しています。これを行うことで、どこのマシン環境でも、gitとmakeさえ入っていれば、シェル環境が一発で整う状態になっています。
% git clone dotfiles % cd dotfiles % make
これだけで、環境が整うので、とても便利です。
当然ながら、このdotfiles環境は、どこのマシンでも、外部ツールのインストール状況やモジュールのインストールパスを適宜判断して、それなりの環境になるようにしてあります。特にpowerlineはpythonモジュールということもあり、いろんなとこに入れてしまいがちです。なので、.zshrc等では、条件判断をかけています。
########################################
# powerline
PLUDIRS=(${HOME}/Library/Python/2.{1..9}/lib/python/site-packages ${HOME}/.local/lib/python2.{1..9}/site-packages)
PLSDIRS=(/usr/local/lib/python2.{1..9}/{site,dist}-packages)
PLCONF="powerline/bindings/zsh/powerline.zsh"
for DIR in ${PLUDIRS} ${PLSDIRS}; do
if [ -f ${DIR}/${PLCONF} ]; then
powerline-daemon -q
. ${DIR}/${PLCONF}
break
fi
done
そこまで要るのか?という疑問はありつつ、とりあえずこれくらい書いておけば、ユーザー環境に入れていようが、MacだろうがLinuxだろうが、大抵動きます。
ところが、一つだけ、これがうまく行かないものがあります。tmuxのconfです。
source "${HOME}/Library/Python/2.7/lib/python/site-packages/powerline/bindings/tmux/powerline.conf"
Macなら、こんな感じになるんですが、もちろんLinuxでは違いますし、ユーザー環境にインストールされていることもあって、条件分岐が必要です。ところがtmux.confでは当然ifとかforとか書けません。困りました。
設定ファイルを分けて別ファイルを読ませることで解決
考えた結果、以下の対応を取りました。
- .tmux.confは外部ファイルの読み込むように修正する。ここでは${HOME}/.tmux.ext.confを作っています。
- この.tmux.ext.confをdotfilesのMakefile、外部シェルで書き換える。
こうすることで、git clone後のmake時に、powerline.confのパスの判断を入れることができ、tmux.confファイル本体を操作するリスクも避けられます。
maketmuxext.shというシェルを作り、tmux.ext.confに、powerline.confを読むだけの設定を作成する処理を準備し、Makefileの中から呼び出します。シェルの中身は.zshrcと同じような内容です。
#!/bin/bash
TMUXEXT=${HOME}/.tmux.ext.conf
rm -f ${TMUXEXT} && touch ${TMUXEXT}
# powerline
PLUDIRS=$(echo ${HOME}/Library/Python/2.{1..9}/lib/python/site-packages ${HOME}/.local/lib/python2.{1..9}/site-packages)
PLSDIRS=$(echo /usr/local/lib/python2.{1..9}/{site,dist}-packages)
PLCONF="powerline/bindings/tmux/powerline.conf"
for DIR in ${PLUDIRS} ${PLSDIRS}; do
if [ -f ${DIR}/${PLCONF} ]; then
echo source \"${DIR}/${PLCONF}\" >> ${TMUXEXT}
break
fi
done
これで、どこにpowerline.confがインストールされていれも、tmuxが正しく見つけられるようになります。
小さなTipですが、この方法はdotfilesのポータビリティを上げる上で結構ポイントになるかな、と思っています。とにかく快適になりました。

コメント