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