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

11

Estou tentando ligar X para fazer o seguinte:

  • avisa o usuário se a sessão deve ser eliminada
  • se y for inserido, mate a sessão
  • após a sessão ser eliminada, selecione outra sessão (última, anterior ou próxima sessão)

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 eliminação:

    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\""
    
por Trey Hunner 15.12.2012 / 20:00

3 respostas

11

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

    
por 16.12.2012 / 06:58
1

Apenas no caso, se alguém se depara com esta questão - tmux-sessionist fornece essa funcionalidade, juntamente com muitos outros.

    
por 16.09.2015 / 20:01
0

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

Se você quiser o comportamento padrão choose-session com o recurso adicional que mata a sessão original, se nenhum outro cliente permanecer anexado a ela, essa questão também pode ser de interesse.

    
por 05.02.2017 / 15:37

Tags