Я думаю, что это близко к тому, что вы хотите:
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 было ключом. Спасибо!