Для очищення безладу потрібно дві послідовності команд:
По-перше, запустіть це у скріпленому вікні (це працює навіть у вас 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 -echo
IMHO, але інтерактивні команди, як 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: Дякую всім, хто допоміг зібрати це рішення.