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-right
es "#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
- 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
- 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 tput
para 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 csr
y cup
terminfo.