Строка состояния tmux повреждена после загрузки двоичного файла, как выполнить сброс?


93

Я случайно испортил свой терминал tmux после того, как catзаполнил бинарный файл. Теперь мой tmuxиспорчен. Отсоединение и повторное присоединение не помогают, равно как и перерисовка (Cb r). Запуск resetтолько перерисовывает активную панель, а не остальные. Бег ssty saneвнутри или снаружи tmuxтоже не помогает.

Tmux испортил

В каждой панели у меня есть нормальная обратная связь с тем, что я печатаю (первоначальный вызов resetсразу после того, как терминал был испорчен, решил это), но я не могу исправить строку состояния.

В gnome-terminalкаждое обновление статус-бара приводит к статус-бара расти (см скриншот выше). Например, это происходит, когда я запускаю новое приложение, когда я переключаю панели или когда я изменяю размер панели. Принудительное перерисовывание ( C-b rпутем запуска resetили через меню терминала gnome) сокращает строку состояния до одной строки, но она остается поврежденной.

В xterm, строка состояния остается в пределах одной строки, но она остается поврежденной, как показано на рисунке.

Я использую tmux 1.5.

  • Как мне исправить мой tmux-терминал?

В этом отчете об ошибке за 2008 год описана та же проблема, но она была помечена как исправленная. Я не знаю, в какой версии это было исправлено, но в tmux 1.5 должно быть исправление 2008 года.


Просто возникла эта проблема, и «очистить» у меня сработало.
user149818

1
В случае, если кто-то сталкивается с той же проблемой, после выполнения всего вышеперечисленного моя строка состояния tmux все еще не работает. Установив в окне опцию status-right, починил его.

2
Вышеуказанное предложение исправило это и для меня. Команда для этого была: Control+ b+, :а затем set -g status-right "#H"установить статус-право на имя хоста.
Mayank

Ответы:


84

Попробуйте переименовать окно 4

  • Переключиться в окно 4: Control+b 4
  • Переименовать окно: Control+ b , Control+ umyNewname

(Это запятая в середине)

Или: Control+b :rename-window myNewname


1
Переименование окна работает как шарм
exhuma

4
Вам нужно очистить имя, прежде чем вводить новое. Самый простой способ с ctrl+u, так что полная последовательностьctrl+b , ctrl+u newname
z0r

1
Сладкий - это работает byobuтакже ( f8, <newname>)
ali_m

Зачем это Control-uнужно? Control-,уже переименование верно? Хотя я могу подтвердить, что это было необходимо в моем случае, это какой-то символ сброса?
hbogert

1
Control-U очищает линию. если вы каждый раз вводите свой пароль в терминал и знаете его, вы можете очистить запись, используя control-u, вместо того, чтобы
нажимать клавишу Backspace

55

Вам нужно две последовательности команд для очистки беспорядка:

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


2
Пожалуйста, обратите внимание на uname -nвместо hostname -s. hostnameопасен в rootконтексте, так как вы можете в конечном итоге переименовать свой хост в -sстаршей Linux / Unix, где hostnameне используются опции.
Tino

Не сбрасывая заголовок панели, мне тоже грустно; вот почему я даже здесь, в первую очередь. Спасибо за то, что вы единственный на этой странице, кто хотя бы признает этот недостаток!
EvanED

2
Рассмотрим также «tmux setw automatic-rename» после исправления заголовка окна
EB.

stty saneЧасть помогла мне , когда мой терминал облажался и ничего не показывает. Спасибо!
Джонни

Если вам нужен «отсутствующий бит», т.е. текущая команда, отображаемая в левой области состояния, вы можете использовать команду tmux set-window-option automatic-rename.
Дэвид Фёрстер

26

Конкретная проблема, которую вы видите, связана с именем / заголовком окна 4. Сочетание слишком длинных (очевидно) и содержащих странные символы, которые заставляют tmux измерить его как более короткий (поэтому он не может правильно ограничить строку состояния). на ширину экрана) Я не уверен, как сбросить его (на моем он отслеживает название процесса переднего плана), возможно, вам придется закрыть окно.


4
по умолчанию переименование окна^b - ,
Роб

8
Если комбинация клавиш в комментарии @ Роба вас смущает, тогда Ctrl- bтогда ,.
Даг Пол

Обратите внимание, что когда вы переименовываете окно, поле предварительно заполняется текущим именем окна (и ваш курсор находится в конце этого имени). Поскольку мое имя окна было длинной последовательностью мусора, мне пришлось удерживать Backspaceминуту, чтобы очистить текущее имя. Для меня визуальная обратная связь со временем прояснила, что все старое имя было стерто.
Даг Пол

Вы также можете использовать Ctrl-b :переименованное окно <имя идет сюда>; здесь используется система команд tmux вместо сочетания клавиш для этой команды.
Аббафей


5
tmux set-option -g status off && tmux set-option -g status on 

исправил это для меня, когда что-то кроме имени окна было повреждено, и я не мог понять, что это было.


2

tmuxможет составлять только часть проблемы. Возможно, вам придется вызывать stty saneиз командной строки. Это сбрасывает драйверы TTY в ядре на некоторый набор значений по умолчанию, которые обычно позволяют вам продолжить. Если драйверы TTY испорчены достаточно, возможно, вам придется набирать stty sane«вслепую», то есть без обратной связи на экране.


stty saneтоже не решает проблему. У меня есть обратная связь на экране, в каждой из tmuxпанелей я могу печатать и получать обратную связь как обычно, но как только tmux нужно что-то нарисовать (например, запустить новое приложение, переключить или изменить размеры панелей), строка состояния переместится в панели. ...
Gerrit

2

Попробуйте перезагрузить ваш конфигурационный файл?

Ctrlb, тогда: :source-file ~/.tmux.conf


лучшее решение на данный момент.
Дэйв

-3

чтобы решить проблему для меня:

Я просто убил проблемную панель и окно и создал новое окно и панель.

В панели вопроса CTRL+ AXи CTRL+ AC.


этот путь для меня снова. никакие другие способы не могут помочь
итешь
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.