Насколько я могу судить, tmux не имеет никаких настроек для фиксации ширины до минимального значения, только до максимального значения. Это связано с тем, что размеры окон терминала могут быть меньше минимального значения tmux, а tmux может не иметь подходящего способа справиться с этим.
При этом, если у вас открыты другие панели tmux, вы можете добавить небольшой скрипт в PS1 (PS1='$(resizePane $id)other-stuff'
) или PROMPT_COMMAND, чтобы постоянно изменять размер информационной панели, которую вы хотите придерживайтесь ширины 20c, так как вы используете другие панели в tmux. По сути, 1) вы можете открыть программу, 2) изменить размер терминала, 3) перейти на другую панель, 4) набрать Enter
и blam, размер панели будет изменен.
Вы должны посмотреть на страницы руководства для
resize-pane [-DLRU] [-t target-pane] [adjustment]
Если вы находитесь на нужной панели, все, что нужно сделать, это уменьшить ширину слева -L или справа -R на x символов, необходимых для достижения 20. По сути, если панель находится напротив стены выше, чем панель, используйте ее направление для сжатия, а противоположное - для увеличения. Если моя панель находится рядом с правой стеной, используйте -R, чтобы уменьшить ширину, и -L, чтобы увеличить ее.
Чтобы получить правильное количество символов, вам нужно знать текущую ширину панели, которую можно найти вместе с идентификатором панели, если вы наберете
tmux list-panes
Я пока не уверен, как определить номер панели, кроме Prefix+q
или ввода
tmux display-panes
Это даст нам номер идентификатора всех панелей в текущем окне. Если мы знаем id # ($ id), предполагая, что он у правой стены, мы можем изменить размер панели до 20 символов в ширину:
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
Обратите внимание, что resizeNum не может быть отрицательным. Если оно отрицательное, используйте другую сторону, чтобы изменить размер до абсолютного значения resizeNum (это можно автоматизировать, но я оставлю это на ваше усмотрение). Кроме того, если вы включите это в код своей программы, вы можете пренебречь частью «-t $ id», но я не знаю способа автоматизировать поиск $ id из вашей программы.
Также может быть полезно взглянуть на tmux setw main-pane-width
tmux setw other-pane-width
, который установит конкретную ширину панели, если вы перезагрузите новый формат листов. Для циклического форматирования используйте Prefix+space
Надеюсь это поможет!
--- отредактировано, чтобы добавить дополнительную информацию об автоматизации ---
Моя предыдущая мысль была для вас - перейти на новую панель и запустить PS1="$(resizePane $id)${PS1}"
а затем нажать ENTER
на другой панели, чтобы вы могли продолжить работу на новой панели изменения размера, но Я рассмотрел новый вариант, который может работать для вас ...
Я переосмыслил эту идею с момента первоначальной публикации и думаю, что она может быть разумно автоматизирована, если запущенная программа имеет цикл, который может отправлять команды оболочки. Это потому, что мы можем запустить программу, по существу разделив окно. Вот пример того, что я имею в виду. Следующий код
- Пользователь запускает
runCodeSplit.sh
, который
- разбивает новую панель по горизонтали (ширина 20c) справа от последней панели и запускает
test.sh
- Введите цикл
- проверяет текущий размер панели и пытается изменить ее размер
- Спит 10 секунд (но вы можете изменить это, чтобы сделать все, что вы хотите)
- повторяется 3 и 4 раза 10, затем выходит
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
ПРИМЕЧАНИЕ: К сожалению, как я реализовал выше, вы должны запускать его только один раз для каждого окна tmux. Проблема в том, что каждый раз, когда вы запускаете его, они собираются рядом друг с другом, что, в свою очередь, приводит к тому, что они конкурируют за место (одно сокращает другое, чтобы расширяться, и наоборот). Возможно, вы сможете обойти эту проблему, но я оставлю это на ваше усмотрение, чтобы выяснить.