reattach-to-user-namespaceが無くてもTmuxを起動させる

最近、自宅の開発環境に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 "test -x reattach-to-user-namespace" 'set -g default-command "reattach-to-user-namespace -l ${SHELL}"'

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

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

tmux上のCtrl-a・Ctrl-eが動かない

Tmux2.5上でCtrl-a・Ctrl-eが効かなくなりました。
shellは、zshを使っています。

解決策はよく分からないのですが、superuserで転がっていた質問の対応で、期待通りの動きをするようにしました。
https://superuser.com/questions/523564/emacs-keybindings-in-zsh-not-working-ctrl-a-ctrl-e

bindkey -eをzshrcに追加しただけです。

Emacsモードのキーバインドだけっか…