Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

tmux.confを分割するときはtpmに気をつけよう

ハマって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はインストール対象のプラグインを、以下のようにして集めます

  1. set -g @plugin をtmux.confから探して列挙する (コード)
  2. source-file先のファイルも展開する(コード)、ただし HOME以外の環境変数は展開しない (コード)
  3. 得られたプラグインリストを元にインストール/更新などを行う

このように、tpmはプラグイン一覧を取得するために、 tmuxを介さずに手動で静的にtmux.confを解析するという荒業 をしています。 (昔のtpm_pluginsでの指定がdeprecatedになってるのを見るに、こうしないといけない事情があったのでしょうが…)

まとめ

というわけでまとめると以下になります。

  • HOME以外の環境変数がsource-fileのパスに入っている場合、set -g @plugin はtmux.conf側で行う
  • 環境変数がHOMEのみであれば、source-file先に記述しても問題ない

tpmのコードを読まないと読み解けない仕様でそこそこ手こずりました…