tmux supporta i titoli per riquadro, ma non fornisce una posizione per riquadro per visualizzare questi titoli.
È possibile impostare il titolo di un riquadro con la sequenza di escape ESC ]2;
… ESC \
(ad esempio, vedere la sezione chiamata Nomi e titoli nella manpage di tmux ). Puoi farlo dalla shell in questo modo:
printf '\033]2;%s\033\\' 'title goes here'
Il titolo di ogni riquadro è predefinito sul nome host del sistema. Per impostazione predefinita, il titolo del riquadro attivo viene visualizzato sul lato destro della riga di stato di tmux (il valore globale predefinito della variabile di sessione status-right
è "#22T" %H:%M %d-%b-%y
, che mostra 22 caratteri del titolo del riquadro, l'ora e la data).
Quindi, fintanto che sei soddisfatto di essere in grado di vedere il titolo del riquadro attivo (cioè disposto a cambiare riquadro per vedere il titolo di un riquadro inattivo), puoi cavartela con la funzionalità predefinita. È sufficiente inviare la sequenza di escape dell'impostazione del titolo appropriata prima di avviare il comando principale per ogni riquadro.
Se hai assolutamente bisogno di una riga dedicata per visualizzare alcune informazioni per riquadro, le sessioni tmux annidate potrebbero non essere così (non necessarie) "eccessive" come potresti pensare.
Nel caso generale, per fornire una linea di stato inviolata su un determinato terminale, avrai bisogno di un (ri) emulatore di terminale completo che si trovi tra il terminale originale e un nuovo terminale (uno con una riga in meno). Tale (ri) emulazione è necessaria per tradurre le sequenze di controllo inviate al terminale interno e tradurle per il terminale originale. Ad esempio, per mantenere una riga di stato nella parte inferiore del terminale esterno, il comando
Passa all'ultima riga.
inviato al terminale interno deve essere diventato
Passa alla penultima riga.
quando tradotto e inviato al terminale esterno. Allo stesso modo, un LF inviato al terminale interno deve diventare
Se il cursore si trova sulla penultima riga, scorrere questa riga e tutte le righe sopra di essa di una riga, per fornire una riga chiara dal penultimo (proteggendo la riga di stato sull'ultima riga). Altrimenti, invia un LF.
nel terminale esterno.
Programmi come tmux e screen sono proprio questi re-emulatori di terminale. Certo, ci sono molte altre funzionalità avvolte attorno all'emulatore di terminale, ma avresti bisogno di una grande porzione di codice di emulazione di terminale solo per fornire una riga di stato affidabile .
Esiste, tuttavia, una soluzione leggera finché
- i tuoi programmi ( istanze Node.js ) hanno interazioni terminali limitate con i riquadri in cui sono in esecuzione (cioè nessun posizionamento del cursore), e
- non ridimensionare i riquadri mentre i programmi sono in esecuzione.
Come molti emulatori di terminale, tmux supporta un comando di controllo del terminale "set scrolling region" nei suoi riquadri. È possibile utilizzare questo comando per limitare l'area di scorrimento alle righe N-1 superiori (o inferiori) del terminale e scrivere una sorta di testo identificativo dell'istanza nella riga non scorrevole.
Le restrizioni (nessun comando di spostamento del cursore consentito, nessun ridimensionamento) sono richieste perché il programma che genera l'output (ad esempio un'istanza di Node.js ) non ha idea che lo scorrimento sia stato limitato a una particolare regione. Se il programma di generazione dell'output ha spostato il cursore al di fuori dell'area di scorrimento, l'output potrebbe diventare confuso. Allo stesso modo, l'emulatore di terminale probabilmente ripristina automaticamente la regione di scorrimento quando il terminale viene ridimensionato (quindi la "linea non scorrevole" finirà probabilmente per scorrere via).
Ho scritto uno script che utilizza tput
per generare le sequenze di controllo appropriate, scrivere nella riga non a scorrimento ed eseguire un programma dopo aver spostato il cursore nella regione di scorrimento:
#!/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"
Potresti usarlo in questo modo:
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'
Lo script dovrebbe funzionare anche al di fuori di tmux fintanto che il terminale supporta e pubblica le sue capacità csr
e cup
terminfo.