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


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

tmux2.1以降

tmux 2.1でマウス関連のオプションが全部 mouse ていうオプションにまとめられたようなので↓これだけで良くなった模様。

~/.tmux.conf
# マウス関連(デフォルトはOFFにしておいて、prefix+mで切替える)http://bit.ly/1N6URvr
set-option -g mouse off
bind-key m if-shell "tmux show-options -g mouse | grep off" "set-option -g mouse on" "set-option -g mouse off"

但しこれだけだとホイールスクロールはまだ効かないらしい。だが自分はどうやらマウスホイールでtmuxをスクロールする操作を殆どやらないっぽいので切替設定作るの面倒なので割愛。
必要な人は、tmux v2.1からmouse関連の設定が変わった - Qiita とかを見てください。

tmux2.0以前

昔頑張った設定。但し最新のtmuxだと以下はどれもエラーになるオプションになった過去の遺物と化した。

初期:とりあえずマウス使ってみよう

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

~/.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

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

中期:mMで切り替えられるようにする

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

~/.tmux.conf
# 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を繋げるやり方にしてみた。ちょっと長くなったけど上手く行った。

~/.tmux.conf
# マウス関連(デフォルトはOFFにしておいて、prefix+mでマウスモードを切替える)http://bit.ly/ZzG7iN
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の出力)が変わってウザいからである。

1.6系への対応

コメントで指摘されたので補足。
set-optionの-qオプションは1.7から追加されたものなので、1.6系をお使いの方は最終形の設定から -q を外してやればOKです。但しステータスラインに表示されるメッセージは切り替えの度に異なって何かウザいのを我慢してください(^^

はてダからのセルフ転載です

via. http://d.hatena.ne.jp/y-kawaz/20130308/1362735393
新はてダの存在により旧はてダが阻害されてる感に辟易したので脱出中