No tmux, como posso substituir a sessão atual selecionando outra e eliminando a atual?

4

Eu gostaria que um comando Tmux fosse semelhante a choose-session ( PREFIX s ), mas mata a sessão atual se outro estiver selecionado.

Idealmente, o comando desanexará a sessão atual se ela estiver anexada em outro lugar, mas a matará se esse for o único anexo. Isso pode ser descoberto com tmux display -p '#{session_many_attached}'

há uma pergunta semelhante mas é bem antiga e faz a pergunta na ordem inversa (query, kill, connect).

    
por starfry 05.02.2017 / 15:27

1 resposta

5

Isso liga PREFIX C-s para escolher uma sessão, alternar para ela e depois matar a sessão anterior:

bind-key C-s \
  if-shell "(($(tmux display -p '#{session_many_attached}') > 0))" \
    choose-session \
    "run-shell \"tmux choose-session \\"switch-client -t '%%'; kill-session -t '$(tmux display -p '#S')'\\"\""

Eu usei expressões shell ( outra resposta que não usou o shell seria ótima! ). Primeiro eu uso o if-shell do Tmux para decidir se há vários clientes conectados. Se houver, invoco o comando padrão choose-session .

No entanto, se este for o único cliente anexado à sessão, eu passo um comando personalizado para choose-session , mas faço isso no shell (com run-shell ) para poder construir a linha de comando passada para choose-session .

Essa linha de comando é composta de dois comandos:

  • switch-client -t '%%' , que é o que choose-session usa por padrão (veja man tmux para uma explicação).
  • kill-session -t '$(tmux display -p '#S')' primeiro usa um subshell para obter o nome da sessão atual (ainda não foi destruída) e passa isso como um parâmetro para kill-session .

O comando final requer muito escape para que ele funcione. O if-shell recebe três argumentos: um comando shell e dois comandos tmux. Estes precisam ser citados se contiverem espaços em branco. Portanto, o terceiro argumento run-shell... é bastante desagradável!

(tmux 2.3)

    
por 05.02.2017 / 15:27

Tags