Название панели в Tmux - PullRequest
72 голосов
/ 17 марта 2012

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

Мне нужен заголовок для каждой панели. Как я понял, сам tmux не имеет этой функции: он имеет только заголовки для окон, а не для панелей. Запуск отдельного сеанса tmux внутри каждой панели для каждого экземпляра node.js выглядит излишним.

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

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

Ответы [ 8 ]

74 голосов
/ 18 марта 2012

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


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

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

Как и многие эмуляторы терминала, 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.

57 голосов
/ 03 июня 2016

Эта функциональность была добавлена ​​в tmux git в this commit .Это не в версии 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}"
14 голосов
/ 12 апреля 2013

Я работаю в строке состояния панели для tmux - ticket.Моя ветка разработки может быть найдена здесь на github: https://github.com/jonathanslenders/tmux

Прямо сейчас, это уже добавляет рабочую команду rename-pane "title" .Есть еще некоторые ошибки, и API улучшится.Идея состоит в том, чтобы создать строку состояния для каждой панели, которая может иметь некоторое форматирование, например строку состояния сеанса.Как и остальная часть tmux, все должно стать скриптовым и настраиваемым.Когда он будет готов и стабилен, он, вероятно, будет включен в официальный tmux.

12 голосов
/ 24 января 2017

Я использую tmux версии 2.3, я думаю, что стиль границ не поддерживается в предыдущих версиях.вот что сработало для меня:

Для каждой панели установите заголовок:

printf '\033]2;My Pane Title\033\\'

Тогда:

tmux set -g pane-border-format "#{pane_index} #T"
7 голосов
/ 06 июля 2018

GIF стоит тысячи слов.( source )

tmux-xpanes - это терминальный разделитель на основе tmux, который поддерживает отображение заголовка для каждой панели с помощью недавно добавленной опции -t.

6 голосов
/ 25 апреля 2019

С tmux 2.6 можно сделать:

$ tmux select-pane -t {pane} -T {title}

# Examples:
$ tmux select-pane -T title1          # Change title of current pane
$ tmux select-pane -t 1 -T title2     # Change title of pane 1 in current window
$ tmux select-pane -t 2.1 -T title3   # Change title of pane 1 in window 2

Вы можете увидеть заголовок на панели в строке состояния с:

$ tmux set pane-border-status bottom      # For current window
$ tmux set -g pane-border-status bottom   # For all windows

Отключить строку состояния с помощью:

$ tmux set pane-border-status off       # For current window
$ tmux set -g pane-border-status off    # For all windows
6 голосов
/ 17 марта 2012

Да, есть такая команда: tmux.Дайте вашей сессии имя, и оно будет отображаться во внутренней строке состояния:

TMUX=0 tmux new-session -s my-new-session
4 голосов
/ 20 октября 2012

В краткосрочной перспективе это бесполезно, но в tmux есть запрос на добавление заголовков для каждой панели: http://sourceforge.net/tracker/?func=detail&aid=3495916&group_id=200378&atid=973265#

Между тем, как уже упоминалось, вложение tmux работает прилично.

...