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

3

Esta é quase uma pergunta revisão de código , mas muito * nixy e mais sobre configuração do que código. Durante anos, desde que mudei para tmux de screen , tive alguns problemas incômodos que não consegui fazer funcionar do jeito que eu queria. Desde que eu configurei meu shell para exec em uma sessão do tmux eu finalmente decidi que era hora de consertar este.

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 em que 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 desassociar dois clientes tmux conectados à mesma sessão. Isso é fácil o suficiente se você estiver fora do tmux e lançar um novo cliente. Basta iniciar uma nova sessão com uma referência à principal:

tmux new-session -t original_session -s new_session

No entanto, tente fazer isso depois você está em um cliente e deseja desvinculá-lo de qualquer outro cliente que esteja compartilhando essa sessão e as coisas ficam mais complicadas. Eu tentei dezenas de maneiras e nunca bati em um que funcionou bem. O mais próximo que cheguei foi usar bind <key> prompt-command ... para solicitar os nomes das sessões antiga e nova. Por alguma razão, o tmux não expande a variável #{session_name} dentro de argumentos para um new-session ou prompt-command . Ele faz em argumentos para muitos outros comandos (por exemplo, eu uso em run abaixo) mas sem essa expansão, essa tarefa em particular torna-se subitamente complicada. Mesmo com a inserção manual dos valores, apenas funcionou.

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

Solução de hoje saiu algo assim ( meu arquivo .tmux.conf 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 que isso funciona. A partir de um cliente tmux em execução, Ctrl + B Ctrl + C cria uma nova sessão com um número anexado ao nome do atual, usa o atual como um alvo para os painéis e alterna para ele.

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?

    
por Caleb 21.06.2014 / 21:26

1 resposta

0

Isso é 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 isto faz é criar uma nova sessão da sessão chamada '0' (o que a primeira sessão é nomeada se você não especificar), nomeada algo aleatoriamente único (usando o uuidgen) e depois matá-la quando eu destacar.

Note que estou usando o zsh. 'ta' é a abreviação de 'tmux attach'

    
por 20.08.2016 / 03:40