Não é possível redimensionar o painel tmux do script bash

3

Antecedentes e problema:

Eu criei um script tmux para abrir algumas janelas. Ele funciona muito bem, mas eu queria colocar um painel dividido verticalmente em uma janela e redimensioná-lo para 5 caracteres de altura. Não consigo fazer meu script bash redimensionar o painel corretamente. Dependendo dos comandos que eu tento, ele aumenta ou diminui o tamanho, mas age como se estivesse ligado a algum intervalo ao executar a partir do bash.

Alguns comandos / variações que experimentei:

  1. tmux split-window -v -l 5 -t 0 com e sem o -t 0
  2. tmux split-window -v -p 5 -t 0 com e sem o -t 0
  3. tmux split-window -v seguido por tmux resize-pane -D 23 -t 1 com e sem o parâmetro -t
  4. Eu também tentei variações de: tmux send-keys C-b '"' C-m seguidas por tmux send-keys C-b ':resize-pane -D 20' , mas que normalmente copia a cotação e o comando resize-pane para o buffer de terminal real em vez de executar o comando usando o tmux.

O melhor cenário de qualquer número é o painel redimensiona da metade da tela (56 linhas / 2 = 28 linhas) para 20 linhas de altura (meu terminal tem 56 linhas de altura e, portanto, metade - 20 = 8). Ou, se eu definir o comando resize-pane como -U para cima e, em seguida, definir um número alto, ele tornará o painel muito mais alto, mas continuará tão grande, mantendo o painel 0 a uma certa altura. Eu simplesmente não consigo criar um painel e redimensioná-lo para 5 a 10 linhas de altura de um script bash. Eu posso executar todos os comandos listados em dentro de tmux usando C-b e: (minha chave de prefixo padrão) e eles funcionam exatamente como esperado.

Meu script do tmux bash:

# the name of your primary tmux session
SESSION=$USER

# if the session is already running, just attach to it.
tmux has-session -t $SESSION
if [ $? -eq 0 ]; then
    echo "Session $SESSION already exists. Attaching..."
    sleep 1
    tmux -2 attach -t $SESSION
    exit 0;
fi

# create a new session, named $SESSION, and detach from it
tmux -2 new-session -d -s $SESSION

# Now populate the session with the windows you use every day

# 0 - VIM
tmux new-window  -t $SESSION:0 -k -n VIM 
tmux send-keys   -t $SESSION:0 'cd /home/aDir/myDir/' C-m 
tmux send-keys   -t $SESSION:0 'vim .' C-m 

tmux split-window -v -l 5 -t 0 <--- HERE IS WHERE I WAS SWAPPING/TRYING COMMANDS

# 1 - MySQL
tmux new-window -t $SESSION:1 -k -n MySQL 'mysql -u root -p******** mydb'

# 2 - Shell
tmux new-window -t $SESSION:2 -k -n Shell 'sudo -s'

tmux select-window -t $SESSION:0
tmux -2 attach -t $SESSION

Além disso, tentei remover tudo, exceto a inicial, criar nova janela e tentei dividir e redimensionar sem nenhum outro comando ser enviado (por exemplo, adicionando as janelas adicionais e abrindo um diretório no VIM).

Como um aparte, na execução deste script, recebo uma mensagem terminal dizendo "falha ao conectar ao servidor: Conexão recusada" mensagem mas todas as minhas janelas estão trabalhando e operando como esperado (MySQL e VIM abrem perfeitamente e meu sudo comandos aguarda minha senha). Não tenho certeza de qual servidor está tentando se conectar (o MySQL é local) e falhando, mas aparentemente não afetando nenhuma funcionalidade que eu procure.

    
por Eric H 07.11.2011 / 19:22

1 resposta

8

De acordo com a documentação, quando você cria uma sessão desanexada ( new-session -d ), o padrão é um tamanho de 80 × 24. Se você anexar uma janela de terminal com 24 linhas de altura (ou 25, já que tmux usa uma para uma linha de status), você deve descobrir que o painel Vim abaixo acaba apenas cinco linhas.

O problema surge quando você anexa a sessão com uma janela de terminal muito mais alta que 24 linhas. Quando você faz isso, o tmux redimensiona os painéis para preencher a janela completa do terminal. O painel inferior cresce além das cinco linhas originais quando isso acontece.

Uma maneira de contornar esse problema é criar a sessão desanexada com um tamanho inicial que corresponda ao da janela do terminal a partir do qual você será anexado à sessão. Uma forma semi-portátil de fazer isso é analisar a saída de stty size (alguns shells também fornecem parâmetros LINES e COLUMNS (especialmente quando no modo interativo), mas esses parâmetros nem sempre estão disponíveis e são confiáveis em scripts shell).

set -- $(stty size) # $1 = rows $2 = columns
tmux -2 new-session -d -s "$SESSION" -x "$2" -y "$(($1 - 1))" # status line uses a row

A mensagem failed to connect to server: Connection refused vem do seu comando tmux has-session . Está informando que não há servidor existente. Como você está interessado apenas no código de saída, provavelmente é possível enviar a saída para /dev/null para evitar vê-la. Você também pode colocar o comando diretamente na instrução if :

if tmux has-session -t "$SESSION" 2>/dev/null; then
    ⋮
fi

Aliás, você deve quase sempre colocar suas expansões de parâmetros entre aspas duplas (para evitar a divisão de palavras e a expansão glob). Você só tem um parâmetro e seu valor (copiado de USER ) é (geralmente) provavelmente seguro para não citar, mas é um bom hábito sempre citar suas expansões em quase todos os contextos.

    
por 08.11.2011 / 06:04