tmuxで最後のwindowの最後のpaneであるときだけ確認メッセージを出して、それ以外はそのままkillする

More than 3 years have passed since last update.


導入

最近tmuxを使い始めました。xmonadも使っているので、その存在価値はあるのかとかも言われそうですが、僕は分割が使いたいんじゃなくて、カッコいいタブ(windowのこと)と、間違って消してしまっても死なない存在がほしいだけなんです。

screen_003.jpg

というわけで、表題の通り、これ書いとくと便利かもよという設定です。お役に立てれば幸いです。


やりたいこと

一つのセッションの中の最後のwindowの中の最後のpaneであるときのみ、paneを消すときに確認メッセージを出すようにして、それ以外のときは確認せずにpaneを消すようなキーバインドがほしい。


方法

答えから言ってしまうと、

# if session has > 1 windows in current, kill-pane without confirmation.

# But confirm before killing pane when it is the last pane in the last window.
bind -n M-x if "tmux display -p \"#{session_windows}\" | grep ^1\$ && tmux display -p \"#{window_panes}\" | grep ^1\$" \
"confirm-before -p \"Kill the only pane in the only window? It will kill this session too. (y/n)\" kill-pane" \
"kill-pane"

と書いてしまえばいいです。これで、メタキー(MacだとCommandキー、Windows、LinuxだとAltキー)を押しながらxキーを押すことで、それがそのセッションの最後のwindowの最後のpaneで無い限り、確認なしでkill-paneします。


解説

tmux.confの中ではif文を使用することができます。

if "特殊文字をエスケープさせたシェルコマンド" \

tmux内のコマンド(返り値0で実行される)” \
"tmux内のコマンド(それ以外のとき実行される)"

という形式で書くことができます。更にネストできるかどうかはやってないのでわかりませんが、多分できそうな気もします。

ちなみに、設定ファイルの中ではバックスラッシュでエスケープできるので、上のような書き方をしても大丈夫です。

やっていることは、tmux display "#{session_window}"で現在のセッションの持つwindowの数を出して、それが1であるときだけ次の条件を見ます。次はtmux display -p "#{window_pane}"で、そのwindow内のpaneの数を見て、それが1であるときとそうでない時に条件を分けます。これが真であるときには、確認メッセージを出し(confirm-before -p "..." kill-pane)、そうでない時は何も言わずにkill-paneすることになります。

また、これと全く同じようにして、最後のwindowであるときにだけ確認してkill-windowするように設定を書くことができて、

# if session has > 1 windows in current, kill-window without confirmation.

# But confirm before killing window when it is the last window in the session.
bind -n M-X if "tmux display -p \"#{session_windows}\" | grep ^1\$"\
"confirm-before -p \"Kill the only window in this session? It will kill the session too. (y/n)\" kill-window" \
"kill-window"

のようにすればMetaキー+Xにそのようにキーを割り当てることができます。


まとめ

簡単な設定だけど、自分なりにはかなり便利になったと思います。他にもxmonadライクなキーバインドを設定しているので、よかったら自分のtmux.confも見てやってください。