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!confirm-before
? Estou tendo problemas para conseguir a fuga certa.bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'
( tmux 1.8+run-shell
expande#S
diretamente, por isso podemos omitir odisplay-message
e sua extra de citar)Caso alguém se depare com essa questão - o tmux-sessionist fornece essa funcionalidade junto com muitas outras.
fonte
Há outra pergunta que faz uma pergunta semelhante, mas é um pouco diferente.
Se você deseja o
choose-session
comportamento padrão com o recurso adicional que mata a sessão original, se nenhum outro cliente permanecer anexado a ela, essa pergunta também poderá ser interessante.fonte
Expandindo da resposta de Chris Johnsen (nos comentários) acima, sobre como fazê-lo sem aviso prévio ou
confirm-before
:Se houver apenas 1 sessão restante (a sessão em que você está atualmente) e você executar o comando, receberá uma mensagem de "erro" e a sessão não será interrompida. Normalmente (se você é como eu), deseja que o comando continue matando a sessão, mesmo que não haja outra sessão para a qual possa mudar. Então, aqui está o que eu proponho:
fonte