tmuxでマウスモードのON/OFFを単一キーで簡単に切り替えたい!

tmuxのマウスモードってたまに使いたくなるんだけど常時ONだと邪魔に感じることもしばしば。それでマウス関連の設定を簡単にON/OFF出来るようにしたいなーと思って試行錯誤した歴史。

初期:とりあえずマウス使えるらしいから使ってみよう

マウス関連オプションを全部有効にする設定を ~/.tmux.conf に↓こんな感じに書いていた。

## マウス関連
set-option -gw mode-mouse on
set-option -g mouse-utf8 on
set-option -g mouse-resize-pane on
set-option -g mouse-select-pane on
set-option -g mouse-select-window on

当然これだと常にマウスは有効。でもたまにネイティブのマウス動作を使いたくなった時に詰むので、適当なキーバインドで切り替えたいなーと思い始める。

中期:mとMで切り替えられるようにしてみた

とりあえずデフォルトONのまま、以下のようなキーバインドを更に追加してみた。

# prefix + m/M でマウスのON/OFFが切り替えられるようにする
bind-key m \
  set-option -g mode-mouse on \; \
  set-option -g mouse-utf8 on \; \
  set-option -g mouse-resize-pane on \; \
  set-option -g mouse-select-pane on \; \
  set-option -g mouse-select-window on \; \
  display-message "Mouse: ON"
bind-key M \
  set-option -g mode-mouse off \; \
  set-option -g mouse-utf8 off \; \
  set-option -g mouse-resize-pane off \; \
  set-option -g mouse-select-pane off \; \
  set-option -g mouse-select-window off \; \
  display-message "Mouse: off"

bind-keyのコマンドが \; で繋ぐと複数コマンドを実行できるという発見に喜びつつも、それはすぐに落胆に変わる。この設定には欠点があったのだ!
やってみてすぐに気がついたんだが、C-z した後の M(Shift-m) は非常に押しづらいという…。でもマウスを連想させる m/M 以外のキーに変えたら多分僕には覚えられないことも分かっていたので他のキーに変えることも出来なかった。
他にいい案が思い浮かばなかったのでしばらく運用してみることした。

最新版:mだけで切り替えたい!

やっぱり C-z M の入力は僕には敷居が高すぎた。
1週間もしないうちに嫌になった。前回は諦めたけど何とか覚えるキーを1つだけで切り替えが出来ないかと考え始める。
単一キーでON/OFFを切替えるならif文が必要だと思って調べたらif-shellというコマンドを発見した。でもif-shellは複数コマンド群を纏めて実行することは出来ないっぽいので、bind-keyにif-shellを繋げるやり方にしてみた。ちょっと長くなったけど上手く行った。

# マウス関連(デフォルトはOFFにしておいて、prefix+mでマウスモードを切替える)http://bit.ly/Z8fLmm
set-option -gw mode-mouse off
bind-key m \
  if-shell "tmux show-options -gw mode-mouse | grep off" "set-option -gq mouse-utf8 on" "set-option -gq mouse-utf8 off" \;\
  if-shell "tmux show-options -gw mode-mouse | grep off" "set-option -gq mouse-resize-pane on" "set-option -gq mouse-resize-pane off" \;\
  if-shell "tmux show-options -gw mode-mouse | grep off" "set-option -gq mouse-select-pane on" "set-option -gq mouse-select-pane off" \;\
  if-shell "tmux show-options -gw mode-mouse | grep off" "set-option -gq mouse-select-window on" "set-option -gq mouse-select-window off" \;\
  if-shell "tmux show-options -gw mode-mouse | grep off" "set-option -gw mode-mouse on" "set-option -gw mode-mouse off"

これで prefix + m だけで、マウスの有効無効が切り替え出来るようになった。快適!
ついでにステータスラインのどっかに #(tmux show-option -gw mode-mouse|sed 's/mode-//;s/ /:/') とかを足しておくと、「mouse:off」とか「mouse:on」とかって風に今のマウスモードが確認できて便利です。
ちなみに、上記設定の最後の1つ以外の set-option で -q を付けてるのは、どうやらif-shellの第2第3引数のtmuxコマンドは第1引数のシェル実行完了後に非同期で実行しされるようで、切り替えを実行する度にステータスラインに表示されるメッセージ(最後に実行されたset-optionの出力)が変わってウザいからである。

Qiitaに移転

http://qiita.com/items/7b15e18ca8e072c1dc57
新はてダの存在により旧はてダが阻害されてる感に辟易したので脱出中