tmux поддерживает заголовки для каждой панели, но не обеспечивает расположение для каждой панели для отображения этих заголовков.
Вы можете установить заголовок панели с помощью escape-последовательности ESC ]2;
… ESC \
(например, см. Раздел « Имена и заголовки» на странице руководства tmux ). Вы можете сделать это из оболочки следующим образом:
printf '\033]2;%s\033\\' 'title goes here'
Заголовок каждой панели по умолчанию соответствует имени хоста системы. По умолчанию заголовок активного окна выводится на дисплее на правой стороне tmux строки состояния ( по умолчанию глобального значения переменного сеанса status-right
является "#22T" %H:%M %d-%b-%y
, которая показывает 22 символов из заголовке панели, времени и даты).
Итак, до тех пор, пока вы удовлетворены тем, что можете видеть заголовок активной панели (т.е. желаете переключить панели, чтобы увидеть заголовок неактивной панели), вы можете обойтись функциональностью по умолчанию. Просто отправьте соответствующую escape-последовательность для установки заголовка перед запуском основной команды для каждой панели.
Если вам абсолютно необходима выделенная строка для отображения некоторой информации о каждой панели, то вложенные сеансы tmux могут быть не такими (ненужными) «излишними», как вы могли сначала подумать.
В общем случае, чтобы обеспечить нерушимую строку состояния на каком-либо данном терминале, вам понадобится полный (пере) эмулятор терминала, который находится между исходным терминалом и новым терминалом (один с на одну строку меньше). Такая (повторная) эмуляция необходима для трансляции управляющих последовательностей, отправленных на внутренний терминал, и их трансляции для исходного терминала. Например, чтобы поддерживать строку состояния в нижней части внешнего терминала, команда
Перейти к последней строке.
отправлено на внутренний терминал должен быть
Перейти к предпоследней строке.
при переводе и отправке на внешний терминал. Точно так же LF, отправленный на внутренний терминал, должен стать
Если курсор находится на предпоследней строке, прокрутите эту строку и все строки над ней на одну строку вверх, чтобы очистить предпоследнюю строку (защищая строку состояния на последней строке). В противном случае отправьте LF.
во внешнем терминале.
Такие программы, как tmux и screen, являются такими эмуляторами терминала. Конечно, эмулятор терминала обладает множеством других функций, но вам понадобится большой кусок кода эмуляции терминала, чтобы обеспечить надежную строку состояния.
Однако есть облегченное решение, если
- ваши программы ( экземпляры Node.js ) имеют ограниченное взаимодействие терминала с панелями, в которых они работают (т.е. без позиционирования курсора), и
- вы не изменяете размер панелей во время работы ваших программ.
Как и многие эмуляторы терминала, tmux поддерживает команду управления терминалом «установить область прокрутки» на своих панелях. Вы можете использовать эту команду, чтобы ограничить область прокрутки верхними (или нижними) строками N-1 терминала и записать какой-то текст, идентифицирующий экземпляр, в строку без прокрутки.
Ограничения (запрещение команд перемещения курсора, отсутствие изменения размера) необходимы, поскольку программа, генерирующая вывод (например, экземпляр Node.js ), не знает, что прокрутка была ограничена определенной областью. Если программа, генерирующая вывод, переместила курсор за пределы области прокрутки, то вывод может стать искаженным. Точно так же эмулятор терминала, вероятно, автоматически сбрасывает область прокрутки при изменении размера терминала (так что «строка без прокрутки», вероятно, закончится прокруткой).
Я написал сценарий, который использует tput
для генерации соответствующих управляющих последовательностей, записи в строку без прокрутки и запуска программы после перемещения курсора в область прокрутки:
#!/bin/sh
# usage: no_scroll_line top|bottom 'non-scrolling line content' command to run with args
#
# Set up a non-scrolling line at the top (or the bottom) of the
# terminal, write the given text into it, then (in the scrolling
# region) run the given command with its arguments. When the
# command has finished, pause with a prompt and reset the
# scrolling region.
get_size() {
set -- $(stty size)
LINES=$1
COLUMNS=$2
}
set_nonscrolling_line() {
get_size
case "$1" in
t|to|top)
non_scroll_line=0
first_scrolling_line=1
scroll_region="1 $(($LINES - 1))"
;;
b|bo|bot|bott|botto|bottom)
first_scrolling_line=0
scroll_region="0 $(($LINES - 2))"
non_scroll_line="$(($LINES - 1))"
;;
*)
echo 'error: first argument must be "top" or "bottom"'
exit 1
;;
esac
clear
tput csr $scroll_region
tput cup "$non_scroll_line" 0
printf %s "$2"
tput cup "$first_scrolling_line" 0
}
reset_scrolling() {
get_size
clear
tput csr 0 $(($LINES - 1))
}
# Set up the scrolling region and write into the non-scrolling line
set_nonscrolling_line "$1" "$2"
shift 2
# Run something that writes into the scolling region
"$@"
ec=$?
# Reset the scrolling region
printf %s 'Press ENTER to reset scrolling (will clear screen)'
read a_line
reset_scrolling
exit "$ec"
Вы можете использовать это так:
tmux split-window '/path/to/no_scroll_line bottom "Node instance foo" node foo.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance bar" node bar.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance quux" node quux.js'
Сценарий также должен работать вне tmux, если терминал поддерживает и публикует свои возможности csr
и cup
terminfo.