4

Предпосылки и проблемы:

Я создал скрипт tmux, чтобы открыть несколько окон. Это прекрасно работает, но затем я хотел разместить вертикально разделенную панель в одном окне и изменить ее размер до 5 символов. Я не могу заставить мой bash-скрипт правильно изменить размер панели. В зависимости от команд, которые я пробую, он будет увеличивать или уменьшать размер, но при выполнении из bash он действует как ограниченный некоторым диапазоном.

Некоторые команды / варианты, которые я пробовал:

  1. tmux split-window -v -l 5 -t 0 с и без -t 0
  2. tmux split-window -v -p 5 -t 0 с и без -t 0
  3. tmux split-window -v за которым следует tmux resize-pane -D 23 -t 1 с параметром -t и без него
  4. Я также пробовал варианты: tmux send-keys C-b '"' C-m за которыми следуют tmux send-keys C-b ':resize-pane -D 20' но обычно это сбрасывает кавычки и команду resize-pane в реальный буфер терминала вместо Выполнение команды с помощью tmux.

Наилучшим сценарием из любого числа из них является изменение размера панели с половины экрана (56 строк / 2 = 28 строк) до 20 строк в высоту (мой терминал имеет высоту 56 строк и, следовательно, половина - 20 = 8). Или, если я установлю для команды resize-pane значение -U для up, а затем установлю какое-то большое число, это сделает панель намного выше, но все равно будет только настолько большой, сохраняя панель 0 определенной высоты. Я просто не могу создать панель и изменить ее размер до 5 - 10 строк от bash-скрипта. Я могу запустить все из перечисленных команд внутри tmux с использованием Cb и (мой ключ по умолчанию префикс) , и они работают точно так же , как и ожидалось.

Мой скрипт 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

Кроме того, я попытался удалить все, кроме начального окна создания нового, и попытался разбить и изменить размер, не отправляя другие команды (например, добавив дополнительные окна и открыв каталог в VIM).

Кроме того, при выполнении этого скрипта я получаю сообщение терминала, говорящее «не удалось подключиться к серверу: соединение отказано», но все мои окна работают и работают, как и ожидалось (MySQL и VIM открываются идеально, и мои команды sudo ждут мой пароль). Не уверен, к какому серверу пытаются подключиться (MySQL является локальным) и не работает, но, по-видимому, не влияет на какую-либо функциональность, которую я ищу.

1 ответ1

9

Согласно документации, при создании отдельного сеанса (new-session -d) он по умолчанию имеет размер 80 × 24. Если вы присоедините окно терминала, которое на самом деле имеет 24 строки в высоту (или 25, так как tmux использует одну для строки состояния), то вы должны обнаружить, что панель ниже Vim на самом деле заканчивается всего пятью строками.

Проблема возникает, когда вы присоединяетесь к сеансу с окном терминала, которое намного выше 24 строк. Когда вы делаете это, tmux изменяет размеры панелей, чтобы заполнить все окно терминала. Когда это происходит, нижняя панель выходит за исходные пять строк.

Один из способов обойти эту проблему - создать отдельный сеанс с начальным размером, соответствующим размеру окна терминала, из которого вы в конечном итоге присоединитесь к сеансу. Одним из полупортативных способов сделать это является анализ выходных данных stty size (некоторые оболочки также предоставляют параметры LINES и COLUMNS (особенно в интерактивном режиме), но эти параметры не всегда доступны и надежны в сценариях оболочки).

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

Не failed to connect to server: Connection refused сообщение об отказе в подключении поступило от вашей команды tmux has-session . Он сообщает, что у него нет существующего сервера. Поскольку вас интересует только код завершения, вы, вероятно, можете просто отправить вывод в /dev/null чтобы вообще его не видеть. Вы также можете поместить команду непосредственно в оператор if :

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

Кстати, вы почти всегда должны ставить расширения вашего параметра в двойные кавычки (чтобы избежать разбиения слов и расширения глобуса). У вас есть только один параметр, и его значение (скопированное из USER) (обычно), вероятно, безопасно не заключать в кавычки, но это хорошая привычка всегда заключать в кавычки ваши расширения почти во всех контекстах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .