Título del panel en Tmux

88

En mi máquina local tengo 3 instancias de node.js ejecutándose simultáneamente. Cada uno tiene su propio panel en una ventana tmux llamada "servidores". El problema es que no es tan fácil averiguar qué nodo se está ejecutando en qué panel, porque sus registros son similares.

Lo que necesito es un título para cada panel. Como obtuve, tmux en sí no tiene la función: solo tiene títulos para ventanas y no para paneles. Lanzar una sesión tmux separada dentro de cada panel para cada instancia de node.js parece una exageración.

Entonces, ¿hay algún programa pequeño que inicie un comando, envolviendo su salida con una barra de estado específica?

Gracias por adelantado

Andrey Lushnikov
fuente
1
tmux a partir de la versión 2.3 admite títulos de panel, consulte stackoverflow.com/a/37602055/266453
Dennis G

Respuestas:

80

tmux admite títulos por panel, pero no proporciona una ubicación por panel para mostrar estos títulos.

Puede establecer el título de un panel con la secuencia de escape ESC ]2;… ESC \(por ejemplo, consulte la sección denominada Nombres y títulos en la página de manual de tmux ). Podrías hacer esto desde el shell de esta manera:

printf '\033]2;%s\033\\' 'title goes here'

El título de cada panel tiene como valor predeterminado el nombre de host del sistema. De forma predeterminada, el título del panel activo se muestra en el lado derecho de la línea de estado de tmux (el valor global predeterminado de la variable de sesión status-rightes "#22T" %H:%M %d-%b-%y, que muestra 22 caracteres del título del panel, la hora y la fecha).

Por lo tanto, siempre que esté satisfecho con poder ver el título del panel activo (es decir, si desea cambiar de panel para ver el título de un panel inactivo), puede arreglárselas con la funcionalidad predeterminada. Simplemente envíe la secuencia de escape de configuración de título apropiada antes de iniciar el comando principal para cada panel.


Si necesita absolutamente una línea dedicada para mostrar información por panel, las sesiones de tmux anidadas pueden no ser tan (innecesarias) "excesivas" como podría pensar en un principio.

En el caso general, para proporcionar una línea de estado inviolable en algún terminal dado, necesitará un (re) emulador de terminal completo que se encuentre entre el terminal original y un terminal nuevo (uno con una línea menos). Esta (re) emulación es necesaria para traducir las secuencias de control enviadas al terminal interno y traducirlas al terminal original. Por ejemplo, para mantener una línea de estado en la parte inferior de la terminal exterior, el comando

Pasar a la última línea.

enviado a la terminal interna debe convertirse

Pasar a la penúltima línea.

cuando se traduce y se envía a la terminal exterior. Del mismo modo, un LF enviado al terminal interno debe convertirse

Si el cursor está en la penúltima línea, desplácese hacia arriba una línea por esta línea y todas las líneas arriba, para proporcionar una línea clara penúltima (protegiendo la línea de estado en la última línea). De lo contrario, envíe un LF.

en la terminal exterior.

Programas como tmux y screen son simplemente re-emuladores de terminal. Claro, hay muchas otras funcionalidades envueltas alrededor del emulador de terminal, pero necesitaría una gran parte del código de emulación de terminal solo para proporcionar una línea de estado confiable .


Sin embargo, existe una solución ligera siempre que

  1. sus programas ( instancias de Node.js ) tienen interacciones de terminal limitadas con los paneles en los que se ejecutan (es decir, sin posicionamiento del cursor), y
  2. no cambia el tamaño de los paneles mientras se ejecutan los programas.

Como muchos emuladores de terminal, tmux soporta un comando de control de terminal "set scrolling region" en sus paneles. Puede usar este comando para limitar la región de desplazamiento a las líneas N-1 superiores (o inferiores) de la terminal y escribir algún tipo de texto que identifique la instancia en la línea sin desplazamiento.

Las restricciones (no se permiten comandos de movimiento del cursor, no se permite cambiar el tamaño) son necesarias porque el programa que genera la salida (por ejemplo, una instancia de Node.js ) no tiene idea de que el desplazamiento se ha limitado a una región en particular. Si el programa de generación de resultados movió el cursor fuera de la región de desplazamiento, entonces el resultado podría resultar confuso. Del mismo modo, el emulador de terminal probablemente restablece automáticamente la región de desplazamiento cuando se cambia el tamaño del terminal (por lo que la “línea sin desplazamiento” probablemente terminará desplazándose).

Escribí un script que utiliza tputpara generar las secuencias de control apropiadas, escribir en la línea sin desplazamiento y ejecutar un programa después de mover el cursor a la región de desplazamiento:

#!/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"

Puede usarlo así:

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'

El script también debería funcionar fuera de tmux siempre que el terminal admita y publique sus capacidades csry cupterminfo.

Chris Johnsen
fuente
su guión funciona exactamente como esperaba; la única pregunta: ¿qué debería buscar en Google para personalizar el color de "non_scroll_line"?
Andrey Lushnikov
1
Tal vez "color de fondo de primer plano de la capacidad de terminfo" (es decir, lea sobre el color en la página de manual de terminfo). Puede utilizar tputpara incluir las secuencias de control adecuadas en el argumento "contenido de línea". Con la mayoría de terminales, puede hacer que la línea sea "cian (6) y verde (3) en magenta (5)" con no_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js. setafestablece el primer plano, setabestablece el fondo, oprestablece los colores predeterminados del terminal. Las capacidades de color toman un número del 0 al 7, del 0 al 15, del 0 al 87 o del 0 al 255, según la emulación de su terminal.
Chris Johnsen
Ahora lanzamos pymux. Esto muestra las barras de título del panel: github.com/jonathanslenders/pymux
Jonathan Slenders
Parece que el comportamiento es que el título del panel se establece en el comando que se ejecuta en el shell. Por lo tanto, no se "pegará" a menos que estemos ejecutando un proceso de larga duración (que también sepa cómo generar la secuencia de escape de configuración de título) adentro.
Steven Lu
4
Eche un vistazo a la respuesta más abajo: stackoverflow.com/a/37602055/266453 tmux a partir de la versión 2.3 admite títulos en los bordes del panel.
Dennis G
78

Esta funcionalidad se ha agregado a tmux en esta confirmación . No está en la versión 2.2, pero parece que estará en la 2.3.

Para habilitarlo:

tmux set -g pane-border-status top

o si lo prefieres:

tmux set -g pane-border-status bottom

Para establecer un texto personalizado como la línea de estado del borde del panel, puede utilizar pane-border-format, por ejemplo, así:

tmux set -g pane-border-format "#{pane_index} #{pane_current_command}"
kevmitch
fuente
1
Esto muestra el número del panel y un título predeterminado. ¿Cómo lo cambias de pensamiento?
adn
No estoy seguro de los números del panel, pero responde como un título de ventana xterm para escapar de las secuencias. Por ejemplo, con bash, configuré PS1 = '[\ e] 0; \ u @ \ h: \ w \ a] $' para obtener "user @ host: working dir /"
kevmitch
Por lo que tengo entendido, estableciste esa secuencia de antemano. Pero no hay ningún atajo o combinación de teclas que los cambie. Entonces, tmuxnecesitas algún comando externo tmuxpara cambiarlo. ¿Derecho? ¿O hay alguna secuencia dentro que pueda actualizarlo?
adn
Sí, simplemente configura la variable en el shell en ejecución y se actualiza cuando se dibuja el siguiente indicador. Para mí, parece que tmux es un poco incompleto y solo lo actualiza cuando cambia a otro panel.
kevmitch
De hecho, puede usar pane-border-formatpara establecer una cadena de formato personalizado para que se muestre el panel (el #{...}formato habitual ). He editado tu respuesta para incluir esto.
Dennis G
33

Como tmux 2.6puedes hacer:

$ 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

Puede ver el título por panel en una barra de estado con:

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

Desactive la barra de estado con:

$ tmux set pane-border-status off       # For current window
$ tmux set -g pane-border-status off    # For all windows
Eyal Levin
fuente
¿Sabes si hay alguna forma de evitar que tmux cambie el título debajo de ti? Por ejemplo, si establezco el título de un panel y luego hago algo en ese panel, como cd $HOME, el título cambia al valor de $HOME. (Estoy viendo esto en tmux 2.8.)
pdoherty926
1
@ pdoherty926 Tal vez ya tengas la respuesta, pero mira set-window-option automatic-rename off.
noname
Lo tengo set-option -g allow-rename offen mi .tmux.confarchivo.
Eyal Levin
1
Gracias por las sugerencias. Terminé usando pane-border-formatuna variable proporcionada por el usuario (no estoy seguro de si hay un nombre oficial para esta función) para controlar lo que se muestra. He aquí un ejemplo.
pdoherty926
14

Estoy trabajando en la barra de estado del panel para tmux - ticket. Mi rama de desarrollo se puede encontrar aquí en github: https://github.com/jonathanslenders/tmux

En este momento, esto ya agrega un comando de "título" para cambiar el nombre del panel . Todavía hay algunos errores y la API mejorará. La idea es crear una barra de estado por panel, que puede tener algún formato, como la barra de estado de la sesión. Como el resto de tmux, todo debería ser programable y personalizable. Cuando esté terminado y estable, probablemente se incluirá en el tmux oficial.

Jonathan Slenders
fuente
Mientras está allí, ¿puede hacer que el título del panel se convierta en el título de la ventana predeterminado durante un panel de interrupción?
djsadinoff
Esta rama nunca se fusionó en tmux. Pero creé pymux en su lugar, que tiene barras de título de panel: github.com/jonathanslenders/pymux
Jonathan Slenders
Este comando tampoco funciona en la última compilación (confirme a24260).
adn
14

Estoy usando tmux versión 2.3, creo que el estilo de borde no es compatible con versiones anteriores. esto es lo que funcionó para mí:

Para cada panel, establezca el título:

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

Entonces:

tmux set -g pane-border-format "#{pane_index} #T"
OriG
fuente
9
Al menos tan reciente como tmux 2.6, puede cambiar el título del panel dentro de tmux: select-pane -T "my title"hace esto. Incluso puede configurar un enlace de teclas, por lo que solo necesita proporcionar el título:bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
lucasem
3
@lucasem tal vez no he seguido este hilo, pero esta parece ser la respuesta.
icicleking
@lucasem No estoy 100% seguro, pero creo que su método (que en mi opinión es el mejor y más simple en todo este hilo, para versiones recientes de tmux) solo funciona si la pane-border-statusopción está configurada en algo ( topo bottom).
cjauvin
11

Un gif vale más que mil palabras. ( fuente )

tmux-xpanes es un divisor de terminal basado en tmux, que permite mostrar el título de cada panel a través de la -topción recién agregada .

navigaid
fuente
1
Un gif vale más que mil palabras, pero si alguna vez se pudre el enlace, no vale nada.
Financia la demanda de Monica el
7

Es cierto que hay un comando como: tmux. Dé un nombre a su sesión y se mostrará en una barra de estado interna:

TMUX=0 tmux new-session -s my-new-session
event_jr
fuente
2
¡Sí, gracias por tu respuesta! Pero, por lo tanto, tendré que lanzar una nueva sesión de tmux en cada panel solo para un título en la parte inferior, algo exagerado, ¿no?
Andrey Lushnikov
No lo sé. ¿Lo es? ¿Lo has probado? ¿Cuánta memoria extra está usando la sesión extra?
event_jr
sí, he estado usando sesiones tmux anidadas hasta hoy. No estoy seguro sobre el consumo de memoria y cosas como esta, simplemente no me gusta el concepto en sí porque no es puro.
Andrey Lushnikov
0

TL; DR

Agregue las siguientes configuraciones a su archivo de configuración tmux (en mi caso es ~/.tmux.conf.local)

# dispaly pane_current_path as the pane title
set -g pane-border-status top
set -g pane-border-format "#{pane_index} #{pane_current_path}"

entonces corre:

tmux source-file ~/.tmux.con

disfrútala

Gracias a https://stackoverflow.com/a/37602055/5121972

estructura
fuente