tmux поддерживает заголовки для отдельных панелей, но не предоставляет расположение для отображения этих заголовков.
Вы можете установить заголовок панели с помощью управляющей последовательности 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.
person
Chris Johnsen
schedule
18.03.2012