Tanto quanto eu posso dizer, o tmux não possui configurações para fixar a largura a um valor mínimo, apenas para um valor máximo. Isso ocorre porque as janelas de terminal podem ser redimensionadas para um valor menor que o mínimo do tmux e o tmux pode não ter uma maneira adequada de lidar com isso.
Dito isso, se você tiver outros painéis tmux abertos, você pode adicionar um script pequeno ao PS1 ( PS1='$(resizePane $id)other-stuff'
) ou PROMPT_COMMAND para redimensionar constantemente o painel de informações que deseja manter na largura de 20c à medida que você usa outros painéis dentro do tmux. Essencialmente, 1) você pode abrir o programa, 2) redimensionar o terminal, 3) mover para outro painel, 4) digite Enter
e blam, o painel é redimensionado.
Você deve olhar as páginas do manual para
resize-pane [-DLRU] [-t target-pane] [adjustment]
Se você estiver no painel desejado, tudo o que deve ser feito é reduzir a largura da esquerda -L ou da direita -R por x caracteres necessários para chegar a 20. Essencialmente, se o painel for contra uma parede mais alta que a vidraça, use a direção para encolher e o oposto para aumentar. Se meu painel estiver ao lado da parede da direita, use -R para reduzir a largura e -L para ampliá-lo.
Para obter a quantidade certa de caracteres, você precisa saber a largura atual do painel, que pode ser encontrado junto com o ID do painel se você digitar
tmux list-panes
Ainda não tenho certeza de uma maneira de saber em qual painel você está, exceto por Prefix+q
ou digitando
tmux display-panes
Isso nos dará o número de identificação de todos os painéis na janela atual. Se soubermos o id # ($ id), assumindo que é contra a parede direita, podemos redimensionar o painel para 20 caracteres de largura:
paneWidths=$(tmux list-panes | awk '{print $2}' | cut -c 2- | cut -f 1 -d'x')
currentWidth=$(echo $paneWidths | sed $id'q;d')
resizeNum=$(expr $currentWidth - 20)
tmux resize-pane -R -t $id $resizeNum
Observe que o resizeNum não pode ser negativo. Se for negativo, use o outro lado para redimensionar para o valor absoluto de resizeNum (isso pode ser automatizado, mas vou deixar isso para você). Além disso, se você incorporar isso no código do seu programa, poderá negligenciar a parte "-t $ id", mas não sei como automatizar a localização do $ id a partir do seu programa.
Também pode ser útil ver tmux setw main-pane-width
tmux setw other-pane-width
, que definirá a largura específica do painel se você recarregar um novo formato de bloco. Para ciclos de formatos, use Prefix+space
Espero que isso ajude!
--- editada para adicionar mais informações sobre automação ---
Meu pensamento anterior era que você fosse para um novo painel e executasse PS1="$(resizePane $id)${PS1}"
e, em seguida, atingisse ENTER
dentro do outro painel para continuar trabalhando no novo painel de redimensionamento, mas considerei uma nova opção que pode funcionar para você ...
Eu tenho repensado essa ideia desde o lançamento original e acho que pode ser razoavelmente automatizado se o programa rodando tiver um loop que possa enviar comandos shell. Isso ocorre porque podemos executar o programa basicamente dividindo a janela. Aqui está um exemplo do que quero dizer. O seguinte código
- O usuário executa
runCodeSplit.sh
, que - divide um novo painel horizontalmente (20c de largura) à direita do painel final e executa
test.sh
- Insira o loop
- verifica o tamanho atual do painel e tenta redimensionar
- Dorme por 10 segundos (mas você pode mudar isso para fazer o que quiser)
- repete 3 & 4 10 vezes e, em seguida, sai
runCodeSplit.sh:
#!/bin/bash
# runCodeSplit.sh
paneID=$(tmux list-panes | wc -l)
echo "pane: $paneID"
echo $(expr $paneID - 1)
# now, open a new pane and run the func
tmux split-window -h -l 20 -t $(expr $paneID - 1 ) "~/test.sh $paneID"
test.sh:
#!/bin/bash
# test.sh
if [[ $# -lt 1 ]] ; then
echo "please provide the pane-number"
exit
fi
paneID=$1
i=0
while [[ i -lt 10 ]] ; do
# find the current width and resize it at every loop
width=$(tmux list-panes | awk '{print $2}' | cut -c 2- | cut -f 1 -d'x' | sed $(expr $paneID + 1)'q;d')
resizeNum=$(expr $width - 20)
echo "$paneID : w $width r $resizeNum"
if [[ $resizeNum -gt 0 ]] ; then
tmux resize-pane -R -t $paneID $resizeNum
elif [[ $resizeNum -lt 0 ]] ; then
tmux resize-pane -L -t $paneID $(expr 0 - $resizeNum)
fi
#now, we can do stuff ...
let i++
echo "i= $i / 10"
sleep 10
done
read -p "Press any key to close this pane ... " -n1 -s
NOTA: Infelizmente, da maneira como eu o implementei acima, você só deve executá-lo uma vez por janela do tmux. O problema é que cada vez que você executá-lo, eles irão se agrupar próximos um do outro, o que, por sua vez, os colocará competindo pelo espaço (um irá encolher o outro para expandir e vice-versa). Você pode resolver esse problema, mas deixo isso para você descobrir.