Potrzebujesz dwóch sekwencji poleceń, aby uporządkować bałagan:
Najpierw uruchom to w zniekształconym oknie (działa nawet, gdy jesteś w ssh):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
Następnie uruchom to na komputerze, który działa tmux(działa wewnątrz i na zewnątrz tmux):
Następujące polecenie wpływa na wszystkie tmuxinstancje, które mogą zmienić lewy status bardziej niż bieżące okno. Jeśli nie potrzebujesz tej funkcji, zostaw ją.
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
Wyjaśnione szczegółowo
Zostało to zebrane, aby rozwiązać wszystkie bity znalezione w innych odpowiedziach i komentarzach. Wydaje się, że przy drugim poleceniu pozostało już niewiele. (Zobacz w „brakującym bicie” poniżej).
Aby zrozumieć, jak to działa, najpierw zabijmy linię statusu tmuxi tty. Następnie poprawiamy go ponownie, używając metody, która powinna być zawsze dostępna (w przeciwieństwie do komendy reset).
Jak sprawić, by tmuxterminal (zakładał się UTF-8) bezużyteczny
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Ostrzeżenie: po uruchomieniu powyżej polecenia powłoka wygląda na ślepą i głuchą i wydaje się mówić tylko bzdury w nieznanym obcym języku. Zobacz poniżej, jak to naprawić.
Wyjaśniono:
stty -echo zabija odpowiedź typu terminala
printf '\016'robi a SO, więc jesteś w alternatywnym zestawie znaków
printf '\033]2;%s\007' 'right status text'ustawia odpowiedni status, w tym przypadku $'\355”, co odsłania błąd prezentacji
printf '\033k%2000s\033\\' $'\302\217' ustawia nazwę tytułu okna
Może to być kombinacja widoczna na terminalu po awarii jakiegoś interaktywnego polecenia i wrzuceniu go z powrotem do powłoki. (Nie /bin/catmożesz prowokować stty -echoIMHO, ale takie polecenia jak vimzwykle to ustawiają).
Teraz posprzątaj ten bałagan
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
Uwaga: Jeśli korzystasz z funkcji kopiuj i wklej (prawdopodobnie musisz przytrzymać wciśnięty Shiftpodczas wklejania), prawdopodobnie nie zobaczysz wklejania, jeśli użyłeś powyższego polecenia do zepsucia tty. Dlatego po prostu wklej na ślepo klawisz Enter po wklejeniu tego.
Wyjaśniono:
stty sane ustawia „rozsądne” parametry terminala, dzięki czemu odzyskujesz echo podczas pisania
printf '\033k%s\033\\' "$(basename "$SHELL")"przywraca normalny tytuł okna. Możesz użyć tmux rename-window "$(basename "$SHELL")"alternatywnie, jednak tmux rename-windowjest ograniczony do tego, tmuxgdzie zawsze działa sekwencja ucieczki.
printf '\033]2;%s\007' "$(uname -n)"resetuje prawo do statusu, aby było wyświetlane jako domyślne. (Pamiętaj, że nie powinieneś używać tmux set status-right "something", ponieważ po prostu wyświetla to, pane titleco uległo uszkodzeniu, więc status-rightpo prostu ujawnia jakiś błąd prezentacji. Pamiętaj również, że nie znalazłem tmuxpolecenia, aby bezpośrednio ustawić tytuł panelu).
tput reset resetuje terminal, na wypadek gdyby zostało to pomieszane
tmux refresh odświeża ekran, aby pozbyć się innych zanieczyszczeń, które mogły się pojawić
Brakujący kawałek
printf '\033k%s\033\\' "$(basename "$SHELL")"Traci standardową zdolność tmuxdo zaprezentowania aktualnego polecenia w lewym obszarze stanu. Po printf '\033k%s\033\\' "something"egzekucji umiejętność ta została utracona, a ja nie znalazłem jeszcze dobrego sposobu, aby ją przywrócić, tak jak wcześniej.
Ale, jak zauważono w komentarzach poniżej, możesz aktywować podobną funkcję tmuxjako zamiennik z następującym tmuxustawieniem:
set-window-option automatic-rename on
Zrób to w tmuxwierszu poleceń, do którego można dotrzeć w bieżącym oknie za pomocą „Escape” :(gdzie „Escape” jest tmuxklawiszem polecenia), a następnie wprowadź polecenie.
Lub wycinaj tmux set-window-option automatic-rename onw swoim obecnym terminalu, ale to się nie udaje, jeśli nie jesteś bezpośrednio na odpowiednim poziomie powłoki, na przykład, nie działa on w sudolub ssh.
Lub otwórz inne okno w bieżącej tmuxsesji i wykonaj następujące polecenie:
for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
Lub otwórz kolejną powłokę na uruchomionym komputerze tmuxi wykonaj następujące polecenie (to jest poza tmux):
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
PS: Dziękujemy wszystkim, którzy pomogli w złożeniu tego rozwiązania.