Na moim komputerze lokalnym mam jednocześnie uruchomione 3 instancje node.js. Każdy ma swój własny panel w oknie tmux o nazwie „serwery”. Problem polega na tym, że nie jest łatwo dowiedzieć się, który węzeł działa w którym okienku, ponieważ ich dzienniki są podobne.
Potrzebuję tytułu każdego okienka. Jak dostałem, sam tmux nie ma tej funkcji: ma tylko tytuły dla okien, a nie dla okienek. Uruchomienie oddzielnej sesji tmux w każdym okienku dla każdej instancji node.js wygląda na przesadę.
Czy jest więc jakiś mały program, który uruchamia polecenie, zawijając swoje dane wyjściowe określonym paskiem stanu?
Z góry dziękuję
command-line
title
tmux
pane
Andrey Lushnikov
źródło
źródło
Odpowiedzi:
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: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
wysłane do terminala wewnętrznego musi zostać
po przetłumaczeniu i wysłaniu do terminala zewnętrznego. Podobnie musi zostać wysłany LF do wewnętrznego terminala
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
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:Możesz go użyć w ten sposób:
Skrypt powinien również działać poza tmux, o ile terminal obsługuje i publikuje swoje możliwości
csr
icup
terminfo.źródło
tput
aby dołączyć odpowiednie sekwencje sterujące do argumentu „zawartość wiersza”. W przypadku większości terminali można ustawić wiersz „cyjan (6) i zielony (3) na magenta (5)” za pomocąno_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js
.setaf
ustawia pierwszy plan,setab
ustawia tło,op
resetuje do domyślnych kolorów terminala. Możliwości koloru przyjmują liczbę z zakresu 0–7, 0–15, 0–87 lub 0–255, w zależności od emulacji terminala.Ta funkcja została dodana do tmux w tym zatwierdzeniu . Nie ma go w wersji 2.2, ale wygląda na to, że będzie w wersji 2.3.
Aby to włączyć:
lub jeśli wolisz:
Aby ustawić niestandardowy tekst jako linię stanu obramowania okienka, możesz użyć na
pane-border-format
przykład:źródło
tmux
potrzebujesz jakiegoś polecenia z zewnątrz,tmux
aby to zmienić. Dobrze? Czy jest w środku jakaś sekwencja, która może ją zaktualizować?pane-border-format
aby ustawić niestandardowy ciąg formatu dla panelu do wyświetlenia (zwykły#{...}
format). Zredagowałem Twoją odpowiedź, aby to uwzględnić.Ponieważ
tmux 2.6
możesz:Możesz zobaczyć tytuł w okienku na pasku stanu z:
Wyłącz pasek stanu za pomocą:
źródło
cd $HOME
tytuł zostanie zmieniony na wartość$HOME
. (Widzę to na tmux 2.8.)set-window-option automatic-rename off
.set-option -g allow-rename off
w swoich.tmux.conf
aktach.pane-border-format
Skończyło się na użyciu zmiennej dostarczonej przez użytkownika (nie jestem pewien, czy istnieje oficjalna nazwa tej funkcji), aby kontrolować, co jest wyświetlane. Oto przykład.Pracuję nad paskiem stanu panelu dla tmux - bilet. Moją gałąź rozwoju można znaleźć tutaj na github: https://github.com/jonathanslenders/tmux
W tej chwili to już dodaje działające polecenie „tytuł” panelu zmiany nazwy . Wciąż jest kilka błędów, a API zostanie ulepszone. Pomysł polega na utworzeniu paska stanu dla każdego panelu, który może mieć pewne formatowanie, takie jak pasek stanu sesji. Podobnie jak reszta tmux, wszystko powinno stać się skryptowalne i konfigurowalne. Ukończony i stabilny prawdopodobnie zostanie uwzględniony w oficjalnym tmuxie.
źródło
Używam tmux w wersji 2.3, myślę, że styl obramowania nie jest obsługiwany w poprzednich wersjach. to działa dla mnie:
Dla każdego panelu ustaw tytuł:
Następnie:
źródło
select-pane -T "my title"
robi to. Możesz nawet ustawić przypisanie klawisza, więc wystarczy podać tytuł:bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
pane-border-status
opcja jest ustawiona na coś (top
lubbottom
).GIF jest wart tysiąca słów. ( źródło )
tmux-xpanes to dzielnik terminala oparty na tmux, który obsługuje wyświetlanie tytułu dla każdego okienka za pomocą nowo dodanej
-t
opcji.źródło
Tak istnieje taka komenda a:
tmux
. Nadaj swojej sesji nazwę, a zostanie ona wyświetlona na wewnętrznym pasku stanu:źródło
Nie jest to pomocne na krótką metę, ale istnieje żądanie funkcji dla tytułów dla poszczególnych okien w tmux: http://sourceforge.net/tracker/?func=detail&aid=3495916&group_id=200378&atid=973265#
W międzyczasie, jak wspominali inni, zagnieżdżanie tmux działa przyzwoicie.
źródło
TL; DR
Dołącz następujące konfiguracje do pliku konfiguracyjnego tmux (w moim przypadku jest
~/.tmux.conf.local
)następnie uruchomić:
ciesz się tym
Dzięki https://stackoverflow.com/a/37602055/5121972
źródło