Existe alguma maneira de redesenhar a janela do tmux ao mudar o monitor menor para o maior?

400

Digamos que você esteja se conectando a um servidor remoto pelo ssh com o Terminal.app. Quando você "anexa o tmux" com um monitor de maior resolução a partir de um monitor menor que você iniciou anteriormente, o tmux desenha pontos ao redor do console. Não se encaixa no novo tamanho da janela. Existe alguma maneira de redesenhar e limpar a janela? CTRL+ Lou CTRL- B+ Rnão ajuda. Não consegui encontrar nenhum comando adequado para o homem.

% tmux -V
tmux 1.5
Nobu
fonte
7
Eu gostaria de saber como redesenhar todas as sessões sem desanexar nenhuma delas.
PJ Brunet
3
todo mundo se destaca ... você encontrou uma maneira?
Patoshi # 25/16
Para referência rápida: learnbatta.com/blog/tmux-working-with-split-terminal-95
anjaneyulubatta505
Sim, eu ainda adoraria saber a resposta para a pergunta: "Existe alguma maneira de redesenhar e limpar a janela?"
jaydel 6/03

Respostas:

580

O tmux limita as dimensões de uma janela ao menor de cada dimensão em todas as sessões às quais a janela está conectada. Se não o fizesse, não haveria maneira sensata de exibir toda a área da janela para todos os clientes conectados.

A coisa mais fácil a fazer é desanexar outros clientes das sessões quando você anexa:

tmux attach -d

Como alternativa, você pode mover qualquer outro cliente para uma sessão diferente antes de anexar à sessão:

takeover() {
    # create a temporary session that displays the "how to go back" message
    tmp='takeover temp session'
    if ! tmux has-session -t "$tmp"; then
        tmux new-session -d -s "$tmp"
        tmux set-option -t "$tmp" set-remain-on-exit on
        tmux new-window -kt "$tmp":0 \
            'echo "Use Prefix + L (i.e. ^B L) to return to session."'
    fi

    # switch any clients attached to the target session to the temp session
    session="$1"
    for client in $(tmux list-clients -t "$session" | cut -f 1 -d :); do
        tmux switch-client -c "$client" -t "$tmp"
    done

    # attach to the target session
    tmux attach -t "$session"
}
takeover 'original session' # or the session number if you do not name sessions

A tela diminuirá novamente se um cliente menor mudar para a sessão.

Há também uma variação em que você apenas "assume" a janela (vincula a janela a uma nova sessão, define aggressive-resizee alterna quaisquer outras sessões que tenham essa janela ativa para outra janela), mas é mais difícil criar scripts em geral case (e diferente de "exit", pois você deseja desvincular a janela ou interromper a sessão em vez de apenas desconectá-la da sessão).

Chris Johnsen
fonte
Observe que você pode obter a sessão atual com $(tmux display-message -p '#S'), consulte: superuser.com/questions/410017/… .
GManNickG
3
Esta resposta obtém adereços para detalhes e base de conhecimento. Mas veja a resposta de Shi B. Ctrl-b + Dpara facilitar o uso (e lembrar).
Fbicknel 8/09
"tmux desanexar -a" funcionou para mim; "tmux anexar-d" não.
mahemoff
(1) erros mais recentes do tmux ativados set-option... set-remain-on-exit on. Veja tmux # 787 . Agora, use: tmux set-hook -t "$tmp" window-linked 'set remain-on-exit on.
user1902689
11
(2) no tmux mais recente, use o new-windowúltimo argumento de algo como 'echo "Use Prefix + L (i.e. ^B L) to return to session.'; while(true); do read; done"ou você não verá a mensagem. (Em algumas circunstâncias, você o verá se rolar para cima ou se o terminal for mais alto.) Se você usar isso, provavelmente estará melhor sem o meu comentário "(1)" ou qualquer outra configuração remain-on-exit.
user1902689
462

Você sempre pode pressionar CTRL- B+ SHIFT- Dpara escolher qual cliente deseja desanexar da sessão.

O tmux listará todas as sessões com sua dimensão atual. Então você simplesmente se desconecta de todas as sessões de tamanho menor.

Shi B.
fonte
6
Esclarecimento. É o capital D. Small 'd' desanexa o cliente.
Raghuram Murthy P
2
CTRL-Bse esse é o seu prefixo. O meu é CTRL-Adesde que mudei de tela.
Blaskovicz
11
Na verdade, você precisa se desconectar de todas as sessões de menor tamanho do mesmo grupo de sessões. No entanto, CTRL-B + SHIFT-D não mostra que cada sessão pertence a qual grupo. Eu preferiria executar o tmux list-sessionsque mostra o nome da sessão, tamanho e informações do grupo e depois tmux kill-session -t <session_name>matar as sessões do mesmo grupo.
Zhichang Yu 9/08/19
180

Uma solução mais simples nas versões recentes do tmux (testadas no 1.9) agora você pode:

tmux detach -a

-a é para todos os outros clientes nesta sessão, exceto o atual

Você pode criar um alias no seu. [Bash | zsh] rc

alias takeover="tmux detach -a"

Fluxo de trabalho: você pode conectar-se à sua sessão normalmente e, se você se incomodar com outra sessão que reduziu o tamanho da janela do tmux, basta ligar takeover.

gbin
fonte
13
Muito obrigado! trabalhou. Se você está fazendo isso em uma sessão tmux ativo, basta pressionar CTRL + (o que o seu comando personalizado tmux ou) B, em seguida,:detach -a
Iacchus
Ou apenas execute tmux detach -ana linha de comando do shell dentro do Tmux.
Jdhao # 22/18
4

As outras respostas não me ajudaram, pois eu só tinha o cliente anexado (a anterior que iniciou a sessão já estava desanexada).

Para corrigi-lo, segui a resposta aqui (não estava usando o xterm).

O que simplesmente dizia:

  1. Desanexar da sessão tmux
  2. Executar resizecomando linux
  3. Reconecte à sessão do tmux
pev.hall
fonte
3

Acabei de encontrar este problema e me deparei com uma situação diferente. Embora seja provavelmente apenas um unicórnio, pensei em explicar.

Eu tive uma sessão menor e notei que os tamanhos das fontes eram diferentes: a sessão menor tinha as fontes menores. Aparentemente, eu havia mudado o tamanho da fonte da janela por algum motivo.

Então, no OS X, acabei de fazer Cmd-+uma sessão de tamanho menor e ela se encaixou novamente.

JESii
fonte
Esse posicionamento estranho e fixo da barra de status do tmux no terminal macOS. Quando tenho abas de terminal abertas, ele altera a posição da barra de status do tmux. Jogando com zoom via cmd-+ou -corrigi-lo.
Paul
0
ps ax | grep tmux
17685 pts/22   S+     0:00 tmux a -t 13g2
17920 pts/11   S+     0:00 tmux a -t 13g2
18065 pts/19   S+     0:00 grep tmux

mate o outro.

Balamadras
fonte
8
Parece uma resposta válida para a pergunta do título, apesar de haver respostas melhores. Eu não entendo por que foi rebaixado ao esquecimento.
JOL
yessss, esta é a única resposta que funcionou para mim
Yasir Hantoush
0

Eu uso Ctrl- b+, o qque torna o número do flash para cada painel, redesenhando-os no caminho.

auselen
fonte