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.