Заголовок панели в Tmux
на моей локальной машине у меня 3 узла.экземпляры js работают одновременно. Каждый имеет свою собственную панель в окне tmux под названием "серверы". Проблема в том, что не так просто выяснить, какой узел работает в какой области, потому что их журналы похожи.
Мне нужно название для каждой панели. Как я понял, tmux сам по себе не имеет этой функции: он имеет только заголовки для окон, а не для панелей. Запуск отдельного сеанса tmux внутри каждой панели для каждого узла.экземпляр js похоже, это перебор.
Итак, есть ли небольшая программа, которая запускает команду, обертывая ее вывод с указанной строкой состояния?
спасибо заранее
7 ответов
tmux поддерживает заголовки на панели, но не предоставляет расположение на панели для отображения этих заголовков.
вы можете установить заголовок панели с escape-последовательностью ESC ]2;
... ESC \
(см. раздел имена и названия на tmux manpage). Вы можете сделать это из оболочки следующим образом:
printf '3]2;%s3\' 'title goes here'
заголовок каждой панели по умолчанию имеет имя хоста системы. По умолчанию заголовок активной области отображается в правой части tmux строка состояния (глобальное значение по умолчанию переменной Session status-right
is "#22T" %H:%M %d-%b-%y
, который показывает 22 символа заголовка панели, время и дату).
Итак, пока вы удовлетворены тем, что можете видеть заголовок активной панели (т. е. готовы переключать панели, чтобы увидеть заголовок неактивной панели), вы можете обойтись функциональностью по умолчанию. Просто отправьте соответствующую escape-последовательность настройки заголовка перед запуск основной команды для каждой панели.
Если вам абсолютно нужна выделенная строка для отображения некоторой информации на панели, то вложенные tmux сеансы могут быть не такими (ненужными)" излишними", как вы могли бы подумать.
в общем случае, чтобы обеспечить неприкосновенную строку состояния на каком-либо данном терминале, вам понадобится полный эмулятор терминала (re), который находится между исходным терминалом и новым терминалом (один с одним меньше строк). Такие (re) эмуляция необходима для перевода управляющих последовательностей, отправленных на внутренний терминал, и перевода их на исходный терминал. Например, чтобы сохранить строку состояния в нижней части внешнего терминала, команда
перейти к последней строке.
отправлено на внутренний терминал должно стать
перейти к предпоследней строке.
при переводе и отправке на внешний терминал. Аналогично, LF, отправленный на внутренний терминал, должен стать
если курсор находится на предпоследней строке, прокрутите эту строку и все строки над ней вверх по одной строке, чтобы обеспечить четкую предпоследнюю строку (защищая строку состояния на последней строке). В противном случае отправьте LF.
во внешнем терминале.
программы, как tmux и как раз такие терминальные ре-эмуляторы. Конечно, есть много других функциональность обернута вокруг эмулятора терминала, но вам понадобится большой кусок кода эмуляции терминала только для обеспечения надежный строка состояния.
существует, однако, легкий вес решение до тех пор, как
- ваши программы (узел.js экземпляры) имеют ограниченные терминальные взаимодействия с областями, в которых они работают (т. е. нет позиционирования курсора), и
- вы не изменяете размер панелей в то время как ваши программы работают.
как и многие эмуляторы терминалов, tmux поддерживает команду управления терминалом "set scrolling region"на своих панелях. Вы можете использовать эту команду, чтобы ограничить область прокрутки до верхних (или нижних) N-1 строк терминала и записать какой-то текст, идентифицирующий экземпляр, в строку без прокрутки.
ограничения (никакие команды движения курсора не позволены, никакой изменять размер) необходимы потому что программа которая генерация вывода (например, a узел.js instance) понятия не имеет, что прокрутка ограничена определенным регионом. Если программа, генерирующая выходные данные, перемещает курсор за пределы области прокрутки, вывод может быть искажен. Аналогично, эмулятор терминала, вероятно, автоматически сбрасывает область прокрутки при изменении размера терминала (так что "линия без прокрутки", вероятно, закончится прокруткой).
я написал сценарий, который использует 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=
COLUMNS=
}
set_nonscrolling_line() {
get_size
case "" 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 ""
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 "" ""
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.
эта функция была добавлена в tmux git в этот коммит. Дело не в версии 2.2, но, похоже, это будет в 2.3.
чтобы включить это:
tmux set -g pane-border-status top
или, если вы предпочитаете:
tmux set -g pane-border-status bottom
чтобы установить пользовательский текст в качестве строки состояния границы панели, вы можете использовать pane-border-format
, например, вот так:
tmux set -g pane-border-format "#{pane_index} #{pane_current_command}"
Я работаю над строкой состояния панели для tmux-ticket. Мою ветку разработки можно найти здесь, на github: https://github.com/jonathanslenders/tmux
прямо сейчас, это уже добавляет рабочий переименовать-панели "заголовок". Есть еще некоторые ошибки, и API будет совершенствоваться. Идея состоит в том, чтобы создать строку состояния на панели, которая может иметь некоторое форматирование, например строку состояния сеанса. Как и остальная часть tmux, все должно стать сценарием, и настраиваемый. Когда законченный и стабилизированный, он вероятно будет включен в официальном tmux.
Я использую tmux версии 2.3, я думаю, что стиль границы не поддерживается в предыдущих версиях. вот что сработало для меня:
для каждой панели установить заголовок:
printf '3]2;My Pane Title3\'
затем:
tmux set -g pane-border-format "#{pane_index} #T"
Да есть такая команда: tmux
. Дайте вашему сеансу имя, и он будет отображаться во внутренней строке состояния:
TMUX=0 tmux new-session -s my-new-session
Это не полезно в краткосрочной перспективе, но есть запрос функции для заголовков на панели в tmux: http://sourceforge.net/tracker/?func=detail&aid=3495916&group_id=200378&atid=973265#
тем временем, как упоминали другие, вложенность tmux работает прилично.
gif стоит тысячи слов. (источник)
tmux-xpanes основанный на tmux терминальный рассекатель, который поддерживает отображение заголовка для каждой панели через недавно добавленный .