Заголовок панели в Tmux


на моей локальной машине у меня 3 узла.экземпляры js работают одновременно. Каждый из них имеет свою собственную панель в окне tmux под названием "серверы". Проблема в том, что не так просто выяснить, какой узел работает в какой области, потому что их журналы похожи.

Что мне нужно, это название для каждой панели. Как я понял, сам tmux не имеет этой функции: у него есть только заголовки для windows, а не для панелей. Запуск отдельного сеанса tmux внутри каждой панели для каждого узла.Яш экземпляр похоже на перебор.

Итак, есть ли небольшая программа, которая запускает команду, обертывая ее вывод указанной строкой состояния?

спасибо заранее

7 60

7 ответов:

tmux поддерживает заголовки на панели, но не предоставляет расположение на панели для отображения этих заголовков.

вы можете установить заголовок панели с помощью escape-последовательности ESC ]2; ... ESC \ (см. раздел имена и названия на tmux manpage). Вы могли бы сделать это из оболочки следующим образом:

printf '3]2;%s3\' 'title goes here'

название каждой панели по умолчанию соответствует имени хоста системы. По умолчанию заголовок активной панели отображается в правой части tmux строка состояния (глобальное значение по умолчанию переменной Session status-right и "#22T" %H:%M %d-%b-%y, который показывает 22 символа заголовка панели, время и дату).

таким образом, пока вы удовлетворены тем, что можете видеть заголовок активной панели (т. е. готовы переключать панели, чтобы увидеть заголовок неактивной панели), вы можете использовать функциональность по умолчанию. Просто отправьте соответствующую escape-последовательность настройки заголовка раньше запуск основной команды для каждой панели.


Если вам абсолютно нужна выделенная строка для отображения некоторой информации на панели, то вложенные tmux сеансы могут быть не так много (ненужных)" перебор", как вы могли бы сначала подумать.

в общем случае, чтобы обеспечить неприкосновенную строку состояния на некотором данном терминале, вам понадобится полный эмулятор терминала (re), который находится между исходным терминалом и новым терминалом (один с одним меньшим количеством строк). Такие (re)эмуляция необходима для перевода управляющих последовательностей, отправленных на внутренний терминал, и перевода их на исходный терминал. Например, чтобы сохранить строку состояния в нижней части внешнего терминала, команда

перейти к последней строке.

отправленный на внутренний терминал должен стать

перейти к предпоследней строке.

при переводе и отправке на внешний терминал. Аналогично, LF, отправленный на внутренний терминал, должен стать

если курсор находится на предпоследней строке, прокрутите эту строку и все строки над ней вверх на одну строку, чтобы обеспечить четкую предпоследнюю строку (защищая строку состояния на последней строке). В противном случае, отправьте LF.

во внешнем терминале.

программы, как tmux и как раз такие терминальные ре-эмуляторы. Конечно, есть много других функциональность обернута вокруг эмулятора терминала, но вам понадобится большой кусок кода эмуляции терминала, чтобы обеспечить надежный строка состояния.


существует, однако, легкое решение до тех пор, как

  1. ваши программы (узел.js экземпляры) имеют ограниченные взаимодействия терминала с областями, в которых они работают (т. е. без позиционирования курсора) и
  2. вы не изменяете размер панелей во время ваши программы работают.

как и многие эмуляторы терминалов, tmux поддерживает команду управления терминала "set scrolling region" в своих панелях. Вы можете использовать эту команду, чтобы ограничить область прокрутки до верхней (или нижней) N-1 строк терминала и записать какой-то текст, идентифицирующий экземпляр, в строку без прокрутки.

ограничения (команды перемещения курсора не разрешены, без изменения размера) необходимы, потому что программа, которая генерации выходных данных (например,узел.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=
    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 терминальный рассекатель, который поддерживает отображение заголовка для каждой панели через недавно добавленный .