はじめに

tmuxを使う上で依存しているコマンドなどがあった場合、起動時に確認してインストールされていなかったら警告メッセージを表示するようにしたい。

修正前

自分の場合、tmux上でのコピー操作をvimっぽくしつつ、クリップボードへも共有されるように設定している。
具体的には、 tmux.conf に以下のような設定が書いてある。

if "type xsel" '\
  bind -T copy-mode-vi y send -X copy-pipe-and-cancel "xsel -ib"; \
  bind -T copy-mode-vi enter send -X copy-pipe-and-cancel "xsel -ib"; \
'

xsel コマンドがなければ設定されないようになっているだけ。
まあ、これはこれで親切設定なんだけど、 xsel が入ってないなら即すようなメッセージを表示したい。

修正後

  if "type xsel" '\
    bind -T copy-mode-vi y send -X copy-pipe-and-cancel "xsel -ib"; \
    bind -T copy-mode-vi enter send -X copy-pipe-and-cancel "xsel -ib"; \
- '
+ ' '\
+   MESSAGE="display-message -p \"xsel is not installed\"; set-hook -gu session-created;"; \
+   set-hook -g session-created ${MESSAGE}; \
+ '

xsel コマンドがない場合の分岐を追加した。

やっていることは

  • 「メッセージを標準出力に表示する」命令をセッション作成時のフック処理に登録
  • メッセージ表示後に、登録したフック処理を削除(つまりお掃除)

という感じになる。

ちなみに、フックを使わずに

  if "type xsel" '\
    bind -T copy-mode-vi y send -X copy-pipe-and-cancel "xsel -ib"; \
    bind -T copy-mode-vi enter send -X copy-pipe-and-cancel "xsel -ib"; \
- '
+ ' '\
+   display-message -p "xsel is not installed"; \
+ '

みたいに書くと、セッション作成前にメッセージを出そうとするのか、 no current target といったエラーメッセージが表示されて意図したとおりに動かなかった。
奥が深い。

おわりに

tmuxにフックという概念があることを初めて知って勉強になった。
tmuxはかれこれ10年近く使っているツールだし、今後も使い続けそうなので、ある程度仲良くなっておきたいところ。