若干、ニッチな要件なような気がしないでもないですが、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のポータビリティを上げる上で結構ポイントになるかな、と思っています。とにかく快適になりました。
コメント