Acho que isso está perto do que você quer:
bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\; kill-session -t \"\$(tmux display-message -p \"#S\")\"'"
Sua abordagem # 3 está no caminho certo, mas o problema é que confirm-before
não faz substituições no estilo status-left
(por exemplo, #S
) em sua cadeia de comando.
Uma ressalva para a ligação acima é que, como tudo é feito em run-shell
, os comandos são executados fora do contexto de qualquer cliente ou sessão em particular. Realmente funciona apenas porque o cliente "padrão" (para switch-client
) e a sessão "padrão" (para #S
in display-message -p
) são os mais ativos recentemente. Isso funciona como você esperaria desde que você tenha apenas um único cliente ativo (por exemplo, um único usuário que não digita em outro cliente tmux até que os comandos do shell tenham terminado a execução); ele poderia falhar drasticamente se (por exemplo) você acionar a ligação no cliente tmux A, mas a nova entrada for recebida pelo cliente tmux B antes que o shell tenha iniciado por run-shell
uma chance de executar seus comandos.
Esta condição de corrida em particular parece ser uma boa motivação para fornecer informações de cliente / sessão / janela / painel aos comandos run-shell
. Há uma entrada TODO sobre como obter if-shell
e run-shell
para suportar (opcional?) status_replace()
(isto é, status-left
substituições no estilo), embora talvez uma escolha melhor seja format_expand()
, que é mais recente super-conjunto de status_replace
(ofertas #{client_tty}
, etc.).