tmux unterstützt Titel pro Bereich, bietet jedoch keinen Speicherort pro Bereich für die Anzeige dieser Titel.
Sie können den Titel eines Fensters mit der Escape-Sequenz ESC ]2;
… ESC festlegen\
(siehe z. B. den Abschnitt Namen und Titel in der tmux- Manpage). Sie können dies von der Shell aus wie folgt tun:
printf '\033]2;%s\033\\' 'title goes here'
Der Titel jedes Fensters ist standardmäßig der Hostname des Systems. Standardmäßig wird der Titel des aktiven Fensters auf der rechten Seite der tmux- Statuszeile angezeigt (der globale Standardwert der Sitzungsvariablen status-right
lautet "#22T" %H:%M %d-%b-%y
22 Zeichen des Titels des Fensters , der Uhrzeit und des Datums).
Solange Sie damit zufrieden sind, den Titel des aktiven Fensters sehen zu können (dh bereit zu sein, die Fenster zu wechseln, um den Titel eines inaktiven Fensters anzuzeigen), können Sie mit der Standardfunktionalität auskommen. Senden Sie einfach die entsprechende Escape-Sequenz für die Titeleinstellung, bevor Sie den Hauptbefehl für jedes Fenster starten.
Wenn Sie unbedingt eine Standleitung benötigen, um Informationen pro Bereich anzuzeigen, sind verschachtelte tmux- Sitzungen möglicherweise nicht so viel (unnötiger) „Overkill“, wie Sie vielleicht zuerst denken.
Im allgemeinen Fall benötigen Sie einen vollständigen Terminal- (Re-) Emulator, der sich zwischen dem ursprünglichen Terminal und einem neuen Terminal befindet (eines mit einer Zeile weniger), um eine unverletzte Statuszeile auf einem bestimmten Terminal bereitzustellen. Eine solche (Re-) Emulation ist erforderlich, um an das innere Terminal gesendete Steuersequenzen zu übersetzen und für das ursprüngliche Terminal zu übersetzen. Um beispielsweise eine Statuszeile am unteren Rand des äußeren Terminals beizubehalten, geben Sie den Befehl ein
Gehen Sie zur letzten Zeile.
an das innere Terminal gesendet werden muss
Gehen Sie zur vorletzten Zeile.
wenn für übersetzt und an das äußere Terminal gesendet. Ebenso muss ein an das innere Terminal gesendeter LF werden
Befindet sich der Cursor in der vorletzten Zeile, scrollen Sie diese Zeile und alle darüber liegenden Zeilen um eine Zeile nach oben, um eine klare vorletzte Zeile zu erhalten (Schutz der Statuszeile in der letzten Zeile). Andernfalls senden Sie einen LF.
im äußeren Terminal.
Programme wie tmux und screen sind solche Terminal- Reemulatoren . Sicher, es gibt viele andere Funktionen, die um den Terminalemulator gewickelt sind, aber Sie würden einen großen Teil des Terminalemulationscodes benötigen, um eine zuverlässige Statuszeile bereitzustellen .
Es gibt jedoch eine leichte Lösung, solange
- Ihre Programme ( Node.js- Instanzen) haben begrenzte Terminalinteraktionen mit den Fenstern, in denen sie ausgeführt werden (dh keine Cursorpositionierung)
- Sie ändern die Größe der Fenster nicht, während Ihre Programme ausgeführt werden.
Wie viele Terminalemulatoren unterstützt tmux in seinen Fenstern einen Terminalsteuerungsbefehl zum Festlegen des Bildlaufbereichs. Mit diesem Befehl können Sie den Bildlaufbereich auf die oberen (oder unteren) N-1-Zeilen des Terminals beschränken und eine Art instanzidentifizierenden Text in die nicht scrollende Zeile schreiben.
Die Einschränkungen (keine Cursorbewegungsbefehle zulässig, keine Größenänderung) sind erforderlich, da das Programm, das die Ausgabe generiert (z. B. eine Node.js- Instanz), keine Ahnung hat, dass das Scrollen auf einen bestimmten Bereich beschränkt ist. Wenn das Ausgabeerzeugungsprogramm den Cursor außerhalb des Bildlaufbereichs bewegt, kann die Ausgabe verstümmelt werden. Ebenso setzt der Terminalemulator den Bildlaufbereich wahrscheinlich automatisch zurück, wenn die Größe des Terminals geändert wird (sodass die „nicht scrollende Zeile“ wahrscheinlich weggescrollt wird).
Ich habe ein Skript geschrieben, mit tput
dem die entsprechenden Steuersequenzen generiert, in die nicht scrollende Zeile geschrieben und ein Programm ausgeführt werden, nachdem der Cursor in den Bildlaufbereich bewegt wurde:
#!/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"
Sie könnten es so verwenden:
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'
Das Skript sollte auch außerhalb von tmux funktionieren , solange das Terminal seine csr
und cup
terminfo-Funktionen unterstützt und veröffentlicht .