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
command-line
title
tmux
pane
Andrey Lushnikov
fuente
fuente
Respuestas:
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: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
enviado a la terminal interna debe convertirse
cuando se traduce y se envía a la terminal exterior. Del mismo modo, un LF enviado al terminal interno debe convertirse
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
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:Puede usarlo así:
El script también debería funcionar fuera de tmux siempre que el terminal admita y publique sus capacidades
csr
ycup
terminfo.fuente
tput
para 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)" conno_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js
.setaf
establece el primer plano,setab
establece el fondo,op
restablece 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.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:
o si lo prefieres:
Para establecer un texto personalizado como la línea de estado del borde del panel, puede utilizar
pane-border-format
, por ejemplo, así:fuente
tmux
necesitas algún comando externotmux
para cambiarlo. ¿Derecho? ¿O hay alguna secuencia dentro que pueda actualizarlo?pane-border-format
para establecer una cadena de formato personalizado para que se muestre el panel (el#{...}
formato habitual ). He editado tu respuesta para incluir esto.Como
tmux 2.6
puedes hacer:Puede ver el título por panel en una barra de estado con:
Desactive la barra de estado con:
fuente
cd $HOME
, el título cambia al valor de$HOME
. (Estoy viendo esto en tmux 2.8.)set-window-option automatic-rename off
.set-option -g allow-rename off
en mi.tmux.conf
archivo.pane-border-format
una 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.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.
fuente
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:
Entonces:
fuente
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 "%%"'
pane-border-status
opción está configurada en algo (top
obottom
).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
-t
opción recién agregada .fuente
Es cierto que hay un comando como:
tmux
. Dé un nombre a su sesión y se mostrará en una barra de estado interna:fuente
Esto no es útil a corto plazo, pero hay una solicitud de función para títulos por panel en tmux: http://sourceforge.net/tracker/?func=detail&aid=3495916&group_id=200378&atid=973265#
Mientras tanto, como han mencionado otros, la anidación de tmux funciona correctamente.
fuente
TL; DR
Agregue las siguientes configuraciones a su archivo de configuración tmux (en mi caso es
~/.tmux.conf.local
)entonces corre:
disfrútala
Gracias a https://stackoverflow.com/a/37602055/5121972
fuente