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-before
não faz status-left
substituiçõ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-shell
tenha 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-shell
comandos. Existe uma entrada TODO sobre obter if-shell
e run-shell
dar suporte (opcional?) status_replace()
( status-left
Ou 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!