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 tmux
instancje, 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 tmux
i 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 tmux
terminal (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/cat
możesz prowokować stty -echo
IMHO, ale takie polecenia jak vim
zwykle 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 Shift
podczas 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-window
jest ograniczony do tego, tmux
gdzie 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 title
co uległo uszkodzeniu, więc status-right
po prostu ujawnia jakiś błąd prezentacji. Pamiętaj również, że nie znalazłem tmux
polecenia, 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ść tmux
do 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ę tmux
jako zamiennik z następującym tmux
ustawieniem:
set-window-option automatic-rename on
Zrób to w tmux
wierszu poleceń, do którego można dotrzeć w bieżącym oknie za pomocą „Escape” :
(gdzie „Escape” jest tmux
klawiszem polecenia), a następnie wprowadź polecenie.
Lub wycinaj tmux set-window-option automatic-rename on
w 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 sudo
lub ssh
.
Lub otwórz inne okno w bieżącej tmux
sesji 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 tmux
i 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.