Existe uma maneira mais elegante de desvincular dois clientes tmux compartilhando uma sessão dentro do tmux?

Existe uma maneira mais elegante de desvincular dois clientes tmux compartilhando uma sessão dentro do tmux?

Isto é quase umrevisão de códigopergunta, mas muito *nixy e mais sobre configuração do que código. Durante anos, desde que mudei tmuxde, screentive alguns problemas incômodos que não conseguia fazer funcionar do jeito que queria. Desde que configurei meu shell para executar em uma sessão tmux, finalmente decidi que era hora de consertar isso.

Por padrão, quando você anexa dois clientes tmux à mesma sessão, eles são bloqueados juntos. Alterne os painéis em um e ambos alternam em sincronia. Isso é diferente da tela onde o comportamento padrão era um conjunto compartilhado de painéis, mas o próprio cliente era independente.

O que eu queria era uma maneira de desvincular dois clientes tmux conectados à mesma sessão. Isso é fácil de fazer se você estiver fora do tmux e lançando um novo cliente. Basta iniciar uma nova sessão com uma referência à sessão pai:

tmux new-session -t original_session -s new_session

No entanto, tente fazer issodepoisvocê está em um cliente e deseja desvinculá-lo de qualquer outro cliente que esteja compartilhando aquela sessão e as coisas ficam mais complicadas. Tentei dezenas de maneiras e nunca encontrei uma que funcionasse bem. O mais próximo que cheguei foi usar bind <key> prompt-command ...para solicitar os nomes das sessões antigas e novas.Por alguma razão, o tmux não expande a #{session_name}variável dentro dos argumentos para a new-sessionou prompt-command.Ele funciona em argumentos para muitos outros comandos (por exemplo, eu o uso runabaixo), mas sem essa expansão esta tarefa específica torna-se subitamente complicada. Mesmo inserindo manualmente os valores, só funcionava.

Hoje finalmente consegui fazer funcionar. O resultado, porém, é mais feio do que eu gostaria. Requer uma função shell para fazer a maior parte da mágica. Para conter isso apenas no arquivo de configuração sem envolver scripts externos (para portabilidade de dotfile), estou usando um hack. A configuração, se você cortar as duas primeiras colunas, é na verdade executável como um script de shell. Com tudo envolvido em funções, você pode chamar apenas a parte do script necessária a partir de qualquer atalho de teclado. Os bits do shell script são comentários na configuração, enquanto no shell script feito o bit de configuração é descartado com um aqui-doc.

Solução de hojesaiu algo assim (meu .tmux.confarquivo completo):

# : << ENDOFCONF

# Clear the default binding
unbind C-c
# Pass the name of the current session to a function to clone it
bind C-c run "cut -c3- ~/.tmux.conf | sh -s clone #S"

# ENDOFCONF
# clone () {
#   orig=${1%-*}
#   copy="$orig-$(($( tmux list-sessions -F '#S' | sed -nE "/^${orig}-[0-9]+$/{s/[^0-9]//g;p}" | tail -n1 )+1))"
#   TMUX= tmux new-session -d -t $orig -s $copy
#   tmux switch-client -t $copy
#   tmux set -q -t $copy destroy-unattached on
# }
# $@

Veja bem, isso funciona. A partir de um cliente tmux em execução, Ctrl+ B Ctrl+ Ccria uma nova sessão com um número anexado ao nome da atual, usa a atual como destino para os painéis e alterna para ela.

Estou feliz com isso, exceto pela ideia incômoda de que acabei de tornar algo simples, muito mais complexo do que precisa ser. Existe uma maneira mais simples de conseguir isso?

Responder1

Isto é o que eu fiz:

alias ta='export NEW_SESSION=\$(uuidgen) ; tmux new-session -t 0 -s \$NEW_SESSION ; tmux kill-session -t \$NEW_SESSION'

O que isso faz é criar uma nova sessão a partir da sessão chamada '0' (o nome da primeira sessão se você não especificar), nomeada como algo exclusivamente aleatório (usando uuidgen) e, em seguida, eliminá-la quando eu desconectar.

Observe que estou usando zsh. 'ta' é a abreviação de 'tmux anexar'

informação relacionada