Вам нужно две последовательности команд для очистки беспорядка:
Сначала запустите это в искаженном окне (это работает, даже когда вы находитесь 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где всегда работает escape-последовательность.
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: Спасибо всем, кто помог собрать это решение.