Я думаю, что это близко к тому, что вы хотите:
bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"
Ваш подход № 3 идет по правильному пути, но проблема в том, что confirm-beforeон не выполняет status-leftподстановки в стиле (например #S) в своей командной строке.
Предостережение для вышеупомянутой привязки состоит в том, что, поскольку все сделано из run-shell, команды выполняются вне контекста любого конкретного клиента или сеанса. Это действительно работает только потому, что клиент по умолчанию (для switch-client) и сеанс по умолчанию (для #S) являются самыми последними активными. Это работает, как и следовало ожидать, если у вас есть только один активный клиент (например, один пользователь, который не вводит данные в другой клиент tmux до тех пор, пока команды оболочки не будут завершены); он может резко потерпеть неудачу, если (например) вы инициируете привязку в клиенте tmux A, но клиент tmux B получает новый входной сигнал до того, как запущенная оболочка сможет run-shellвыполнить свои команды.
Это конкретное состояние гонки кажется хорошей мотивацией для предоставления run-shellкомандам информации о клиенте / сеансе / окне / панели . Существует запись TODO о получении if-shellи run-shellподдержке (необязательно?) status_replace()( status-leftТо есть подстановки в стиле), хотя, возможно, будет лучший выбор format_expand(), который является своего рода новым супер-набором status_replace(предложения #{client_tty}и т. Д.).
tmux display-message -p "#S"хитрости в другом ответе. Кажется, что завершение всего в run-shell было ключом. Спасибо!