Для очищення безладу потрібно дві послідовності команд:
По-перше, запустіть це у скріпленому вікні (це працює навіть у вас ssh):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
Потім запустіть це на комп'ютері, який працює tmux(він працює всередині та зовні tmux):
Наступна команда впливає на всі tmuxекземпляри, які можуть змінити статус лівого на більше, ніж у поточному вікні. Якщо ця функція вам не потрібна, залиште її подалі.
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
Детально пояснили
Це було зібрано для вирішення всіх бітів, знайдених в інших відповідях та коментарях. На даний момент, здається, залишився лише другорядний шматочок із другою командою. (Дивіться в "відсутній біт" нижче).
Щоб зрозуміти, як це працює, давайте спочатку знищимо рядок статусу tmuxта tty. Після цього ми виправляємо його знову, використовуючи метод, який повинен бути завжди доступним (на відміну від команди reset).
Як зробити tmuxтермінал (передбачається UTF-8) непридатним
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Попередження: Після запуску над командою оболонка виглядає сліпою і глухою і, здається, лише розмовляє фігнями на якійсь невідомій чужій мові. Дивіться нижче про те, як це виправити.
Пояснили:
stty -echo вбиває відповідь типу терміналу
printf '\016'робить а SO, значить, ви знаходитесь на альтернативному наборі символів
printf '\033]2;%s\007' 'right status text'встановлює правильний статус у цьому випадку $'\355', який розкриває помилку презентації
printf '\033k%2000s\033\\' $'\302\217' встановлює назву вікна
Це може бути комбінація, яку ви можете побачити на терміналі після того, як інтерактивна команда розбилася і опустилася назад в оболонку. (Якщо /bin/catви не можете спровокувати stty -echoIMHO, але інтерактивні команди, як vimправило, встановлюють це.)
Тепер почистіть цей безлад
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
Примітка. Якщо ви використовуєте копію та вставлення (вам, ймовірно, потрібно притримуватись під Shiftчас вставки), ви, ймовірно, не зможете побачити свою пасту, якщо ви використали вищевказану команду, щоб зіпсувати свою tty. Отже, просто сліпо натисніть клавішу Enter після вставки.
Пояснили:
stty sane встановлює "здорові" термінальні параметри, тому ви отримуєте відлуння під час набору тексту
printf '\033k%s\033\\' "$(basename "$SHELL")"повертає назву вікна до норми Ви можете використовувати tmux rename-window "$(basename "$SHELL")"альтернативно, однак tmux rename-windowобмежується тим, tmuxде завжди працює послідовність евакуації.
printf '\033]2;%s\007' "$(uname -n)"скидає статус-право, яке відображатиметься за замовчуванням. (Зверніть увагу, що ви не повинні використовувати tmux set status-right "something", оскільки він просто виводить pane titleпошкоджений файл, тому status-rightпросто викриває помилку презентації. Також зауважте, що я не знайшов tmuxкоманду для встановлення заголовка панелі безпосередньо.)
tput reset скидає термінал, на всякий випадок, якщо це було зіпсовано
tmux refresh оновлює екран, щоб позбутися від інших уламків, які, можливо, з'явилися
Відсутній шматочок
printf '\033k%s\033\\' "$(basename "$SHELL")"Втрачає стандартну здатність tmuxуявити поточну команду в області лівого статусу. Після того, як printf '\033k%s\033\\' "something"була виконана ця здатність втрачається, і я не знайшов хорошого способу повернути її, як це було раніше.
Але, як зазначено в коментарях нижче, ви можете активувати аналогічну функцію tmuxяк заміну з наступними tmuxналаштуваннями:
set-window-option automatic-rename on
Або зробіть це в tmuxкомандному рядку, до якого можна дістатись у поточному вікні за допомогою "Escape" :(де "Escape" - ваш tmuxкомандний ключ), а потім введіть команду.
Або виправдатися tmux set-window-option automatic-rename onу вашому поточному терміналі, але це не вдасться, якщо ви не знаходитесь безпосередньо на правій оболонці, наприклад, це не працює в межах sudoабо ssh.
Або відкрийте інше вікно в поточному tmuxсеансі та виконайте таку команду:
for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
Або відкрийте іншу оболонку на комп'ютері, який працює tmuxі виконайте наступну команду (це поза 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: Дякую всім, хто допоміг зібрати це рішення.