ハマって1時間半くらいかかったのでメモ
問題: tpmの設定を行うファイルのパス指定にHOME以外の環境変数が使えない
source-fileを使ってtmux.confを分割するのはよくあるパターンだと思います。
source-file "$HOME/dotfiles/tmux/plugins.conf"
# ~/dotfiles/tmux/plugins.conf set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-sensible'
しかし、set -g @plugin
しているファイルをsource-fileするときに、パスにHOME以外の環境変数があるとtpmが動かなくなります。
# 指してるファイルは同じなのにDOTDIRの方は動作しない source-file "$HOME/dotfiles/tmux/plugins.conf" source-file "$DOTDIR/tmux/plugins.conf"
原因: tpm側が自力でパス解析してるから
tpmはインストール対象のプラグインを、以下のようにして集めます
set -g @plugin
をtmux.confから探して列挙する (コード)- source-file先のファイルも展開する(コード)、ただし HOME以外の環境変数は展開しない (コード)
- 得られたプラグインリストを元にインストール/更新などを行う
このように、tpmはプラグイン一覧を取得するために、 tmuxを介さずに手動で静的にtmux.confを解析するという荒業 をしています。 (昔のtpm_pluginsでの指定がdeprecatedになってるのを見るに、こうしないといけない事情があったのでしょうが…)
まとめ
というわけでまとめると以下になります。
- HOME以外の環境変数がsource-fileのパスに入っている場合、
set -g @plugin
はtmux.conf側で行う - 環境変数がHOMEのみであれば、source-file先に記述しても問題ない
tpmのコードを読まないと読み解けない仕様でそこそこ手こずりました…