Eu acho que isso é próximo do que você quer:
bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"
Sua abordagem nº 3 está no caminho certo, mas o problema é que confirm-beforenão faz status-leftsubstituições de estilo (por exemplo #S) em sua cadeia de comando.
Uma ressalva para a ligação acima é que, como tudo é feito a partir de run-shell, os comandos são executados fora do contexto de qualquer cliente ou sessão em particular. Realmente só funciona porque o cliente "padrão" (para switch-client) e a sessão "padrão" (para #S) são os mais ativos recentemente. Isso funciona como seria de esperar, desde que você tenha apenas um cliente ativo (por exemplo, um único usuário que não digita em outro cliente tmux até que os comandos do shell tenham terminado de executar); pode falhar drasticamente se (por exemplo) você acionar a ligação no cliente tmux A, mas uma nova entrada for recebida pelo cliente B do tmux antes que o shell iniciado run-shelltenha a chance de executar seus comandos.
Essa condição de corrida específica parece ser uma boa motivação para fornecer informações de cliente / sessão / janela / painel aos run-shellcomandos. Existe uma entrada TODO sobre obter if-shelle run-shelldar suporte (opcional?) status_replace()( status-leftOu seja, substituições no estilo), embora talvez seja uma opção melhor format_expand(), que é uma espécie de um superconjunto mais recente de status_replace(ofertas #{client_tty}, etc.).
tmux display-message -p "#S"truque em outra resposta. Parece que envolver tudo no run-shell foi a chave. Obrigado!