Kill a tmux session and select another tmux session
I think this is close to what you want:
bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"
Your #3 approach is along the right lines, but the problem is that confirm-before
does not do status-left
-style substitutions (e.g. #S
) in its command string.
A caveat for the above binding is that since everything is done in from run-shell
, the commands are run outside the context of any particular client or session. It really only works because the “default” client (for switch-client
) and “default” session (for #S
) are the most recently active ones. This works out as you would expect as long as you only have a single active client (e.g. a single user that does not type into another tmux client until after the shell commands have finished running); it could fail dramatically if (e.g.) you trigger the binding in tmux client A, but new input is received by tmux client B before the shell started by run-shell
has had a chance to run its commands.
This particular race condition seems like a nice motivation for providing client/session/window/pane information to run-shell
commands. There is a TODO entry about getting if-shell
and run-shell
to support (optional?) status_replace()
(i.e. status-left
-style substitutions), though maybe a better choice would be format_expand()
, which is kind of a newer super-set of status_replace
(offers #{client_tty}
, etc.).
Just in case if someone stumbles upon this question - tmux-sessionist provides this functionality along with many others.