Mate uma sessão do tmux e selecione outra sessão do tmux


11

Estou tentando ligar Xpara fazer o seguinte:

  • solicitar ao usuário se a sessão deve ser interrompida
  • se yfor inserido, mate a sessão
  • depois que a sessão for encerrada, selecione outra sessão (última, anterior ou próxima)

Alguns comandos semelhantes que não estão certos

  1. Mate a sessão e feche o terminal:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Solicite ao usuário o nome da sessão para matar e selecione a próxima sessão após a morte:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Não consegui encontrar exemplos de comandos semelhantes. Aqui está uma solução que não funciona:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    

Respostas:


12

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.).


Isso parece fazer exatamente o que eu estava procurando. Eu tentei um método semelhante depois de encontrar o tmux display-message -p "#S"truque em outra resposta. Parece que envolver tudo no run-shell foi a chave. Obrigado!
Trey Hunner

Como você faz isso sem confirm-before? Estou tendo problemas para conseguir a fuga certa.
Miles

2
@Miles: Tente esta: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ run-shellexpande #Sdiretamente, por isso podemos omitir o display-messagee sua extra de citar)
Chris Johnsen


0

outra pergunta que faz uma pergunta semelhante, mas é um pouco diferente.

Se você deseja o choose-sessioncomportamento 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.


0

Expandindo da resposta de Chris Johnsen (nos comentários) acima, sobre como fazê-lo sem aviso prévio ou confirm-before:

bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'

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:

bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
                    "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
                    "run-shell 'tmux kill-session -t \"#S\"'"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.