最近、自宅の開発環境にUbuntuデスクトップを迎えました。 その環境では、普段使っている*.tmux.conf*だと、reattach-to-user-namespaceを要求してしまい起動しなかったので、起動させるために条件分岐させました。

環境

まず、環境。

  • Tmux … 2.1
  • Zsh … 5.1.1

条件分岐させる

とりあえず変更前の*tmux.conf*。

# Window
set-window-option -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
set -g default-command "reattach-to-user-namespace -l ${SHELL}" # ここ
set-option -g renumber-windows on

# Status Line
set-option -g default-terminal xterm-256color
set -g status-bg default
set -g status-fg colour253
set-window-option -g xterm-keys on
set-window-option -g window-status-fg default
set-window-option -g window-status-bg default
set-window-option -g window-status-current-fg colour178
set-window-option -g window-status-current-bg default
set-option -g status-position top
set-option -g status on
set-option -g status-interval 2
# set-option -g status-utf8 on
set-option -g status-justify "centre"
set-option -g status-left-length 60
set-option -g status-right-length 90

# Neovim
set -s escape-time 0

default-commandで指定してますね。 ここで落ちます。 だって、reattach-to-user-namespace入れてないし。

というわけで、以下の条件を満たす場合のみ、default-command先程の行を実行させようと思います。

まずは条件から。

  • reattach-to-user-namespaceが実行可能である

実行可能ではなかったり、参照出来ないのであれば、する必要はないですからね。 これで条件の洗い出しは終わり。 本当はもう少し検討した方がいいのかもしれないけど、今の使っている複数の環境では困ってないからOK。

次に、条件分岐のさせ方。 Tmuxには、条件分岐させるためにãif-shellというコマンドがあり、今回はこいつを使う。 第一引数には、条件となるコマンドを文字列で指定。 第二引数には、条件が真となる場合に実行される処理を文字列で指定。

これらを元に書くと、対象の行を書き換える。

if-shell "[ -x $(where reattach-to-user-namespace) ]" 'set -g default-command "reattach-to-user-namespace -l ${SHELL}"

これで動くようになった。 良かった良かった。

if-shellを使うのは今回が初めてなんだが、ハマりどころがないことを祈りたい。 便利だからね。