導入
最近tmuxを使い始めました。xmonadも使っているので、その存在価値はあるのかとかも言われそうですが、僕は分割が使いたいんじゃなくて、カッコいいタブ(windowのこと)と、間違って消してしまっても死なない存在がほしいだけなんです。
というわけで、表題の通り、これ書いとくと便利かもよという設定です。お役に立てれば幸いです。
やりたいこと
一つのセッションの中の最後の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
も見てやってください。