tmux підтримує заголовки на окремі панелі, але не забезпечує розташування на панелі для відображення цих заголовків.
Ви можете встановити заголовок панелі за допомогою екрануючої послідовності ESC ]2;
... ESC \
(наприклад, див. Розділ " Імена та заголовки" на сторінці сторінки tmux ). Ви можете зробити це з оболонки так:
printf '\033]2;%s\033\\' 'title goes here'
Заголовок кожної панелі за замовчуванням відповідає імені хосту системи. За замовчуванням заголовок активної панелі відображається праворуч від рядка стану tmux (за замовчуванням глобальне значення змінної сеансу status-right
- "#22T" %H:%M %d-%b-%y
це 22 символи заголовка панелі, часу та дати).
Отже, поки ви задоволені можливістю побачити заголовок активної панелі (тобто бажаєте переключити панелі, щоб побачити заголовок неактивної панелі), ви можете обійтись функціоналом за замовчуванням. Просто надішліть відповідну послідовність екранів для встановлення заголовка, перш ніж запускати головну команду для кожної панелі.
Якщо вам абсолютно потрібен виділений рядок для відображення певної інформації на окремій панелі, то вкладені сеанси 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 можливості.