tmux obsługuje tytuły dla okienka, ale nie zapewnia lokalizacji dla okienka do wyświetlania tych tytułów.
Możesz ustawić tytuł panelu za pomocą sekwencji ucieczki ESC ]2;
… ESC \
(np. Zobacz sekcję o nazwie Nazwy i tytuły na stronie podręcznika tmux ). Możesz to zrobić z powłoki w następujący sposób:
printf '\033]2;%s\033\\' 'title goes here'
Tytuł każdego okienka jest domyślnie nazwą hosta systemu. Domyślnie tytuł aktywnego panelu jest wyświetlany po prawej stronie wiersza stanu tmux (domyślna wartość globalna zmiennej sesji status-right
to "#22T" %H:%M %d-%b-%y
, która pokazuje 22 znaki tytułu panelu, czas i datę).
Tak więc, o ile jesteś w stanie zobaczyć tytuł aktywnego panelu (tj. Chcesz przełączyć okienka, aby zobaczyć tytuł nieaktywnego panelu), możesz skorzystać z domyślnej funkcjonalności. Po prostu wyślij odpowiednią sekwencję włączającą ustawienie tytułu przed uruchomieniem głównego polecenia dla każdego okienka.
Jeśli absolutnie potrzebujesz dedykowanej linii do wyświetlania niektórych informacji dla poszczególnych okienek, zagnieżdżone sesje tmux mogą nie być tak dużym (niepotrzebnym) „przesadą”, jak mogłoby się początkowo wydawać.
W ogólnym przypadku, aby zapewnić nienaruszoną linię statusu na jakimś podanym terminalu, będziesz potrzebował pełnego (re) emulatora terminala, który znajduje się pomiędzy oryginalnym terminalem a nowym terminalem (jeden z jedną linią mniej). Taka (re) emulacja jest potrzebna do przetłumaczenia sekwencji sterujących wysyłanych do terminala wewnętrznego i przetłumaczenia ich na oryginalny terminal. Na przykład, aby utrzymać linię stanu na dole zewnętrznego terminala, polecenie
Przejdź do ostatniej linii.
wysłane do terminala wewnętrznego musi zostać
Przejdź do następnego wiersza do ostatniego.
po przetłumaczeniu i wysłaniu do terminala zewnętrznego. Podobnie musi zostać wysłany LF do wewnętrznego terminala
Jeśli kursor znajduje się na przedostatniej linii, przewiń tę linię i wszystkie linie nad nią o jedną linię w górę, aby zapewnić wyraźną linię przedostatnią (chroniąc linię stanu w ostatniej linii). W przeciwnym razie wyślij LF.
w zacisku zewnętrznym.
Programy takie jak tmux i screen są po prostu takimi reemulatorami terminala. Jasne, istnieje wiele innych funkcji owiniętych wokół emulatora terminala, ale potrzebujesz dużego fragmentu kodu emulacji terminala, aby zapewnić niezawodną linię stanu.
Istnieje jednak lekkie rozwiązanie, o ile
- Twoje programy ( instancje Node.js ) mają ograniczone interakcje terminala z panelami, w których są uruchomione (tj. bez pozycjonowania kursora), i
- nie zmieniasz rozmiaru okienek podczas działania programów.
Podobnie jak wiele emulatorów terminali, tmux obsługuje w swoich panelach polecenie sterowania terminalem „ustaw obszar przewijania”. Możesz użyć tego polecenia, aby ograniczyć obszar przewijania do górnych (lub dolnych) N-1 linii terminala i wpisać jakiś rodzaj tekstu identyfikującego instancję w nie przewijanej linii.
Ograniczenia (niedozwolone polecenia ruchu kursora, brak zmiany rozmiaru) są wymagane, ponieważ program generujący dane wyjściowe (np. Instancja Node.js ) nie ma pojęcia, że przewijanie zostało ograniczone do określonego regionu. Jeśli zdarzyło się, że program generujący dane wyjściowe przesunął kursor poza obszar przewijania, dane wyjściowe mogą zostać zniekształcone. Podobnie, emulator terminala prawdopodobnie automatycznie resetuje obszar przewijania, gdy zmieniany jest rozmiar terminala (więc „wiersz bez przewijania” prawdopodobnie skończy się przewijaniem).
Napisałem skrypt, który używa tput
do wygenerowania odpowiednich sekwencji sterujących, wpisania do linii nie przewijającej się i uruchomienia programu po najechaniu kursorem na obszar przewijania:
#!/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"
Możesz go użyć w ten sposób:
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'
Skrypt powinien również działać poza tmux, o ile terminal obsługuje i publikuje swoje możliwości csr
i cup
terminfo.