Терминалы OS X не переходят в прокрутку

12

У меня есть проблема, которая возникает при использовании терминала Mac OS X (TERM = xterm): иногда он попадает в состояние, когда строки, которые прокручиваются сверху, не добавляются в буфер обратной прокрутки. Я не использую screenили подобное; это простая оболочка bash внутри вкладки Terminal.

Это не происходит сразу после открытия новой вкладки. Я считаю, что это побочный эффект того, что я запустил на вкладке проблемы. Я предполагаю, что это как-то связано с эмуляцией xterm, возможно, областью прокрутки.

Что не сработало:

  • Мягкий и жесткий сброс через меню Shell
  • Запуск resetво вкладке

Есть ли надежный способ сброса терминала и / или состояния xterm?

Может ли кто-нибудь объяснить, что происходит, даже если единственное исправление - закрыть вкладку и открыть новую?

Стив Мэдсен
источник
Какую версию Mac OS X вы используете? Есть ли у вас буфер для чего-то меньшего, чем «безлимитный», а пропущенные строки - просто самые старые строки, выпавшие из задней части буфера?
Spiff
Mac OS X 10.6.2, и буфер составляет 10 000 строк, однако потерянные строки - это те, которые прокручиваются прямо за пределами экрана. Если я открою страницу на одном экране, этих строк не будет, и на самом деле, когда строки прокручиваются сверху, самая последняя страница прокрутки никогда не изменится.
Стив Мэдсен

Ответы:

19

Это означает, что терминал использует альтернативный экранный буфер. Существует главный экран, который прокручивается в журнал прокрутки, и альтернативный экран, который не делает. «Полноэкранные» или «ориентированные на экран» программы, такие как top, less, emacs, vim и screen переключают терминал на альтернативный экран по умолчанию.

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

Начиная с Mac OS X Lion 10.7, в Terminal есть пункт меню, который вы можете использовать для ручного переключения экранов:

Вид> Показать / Скрыть альтернативный экран

Это предусмотрено в первую очередь для того, чтобы вы могли просматривать или копировать текст с альтернативного экрана после выхода из полноэкранного режима. Xterm имеет аналогичную команду.

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

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

Некоторые записи Terminfo специально разработаны для подавления с помощью альтернативного экрана, например, xterm1. TERM=xterm1 emacsзапустит Emacs на главном экране. Я не рекомендую использовать xterm1постоянно, потому что это отключает ряд других полезных функций по сравнению с настройками xterm-256colorпо умолчанию на Lion.

Вы также можете переключать экраны, используя tputкоманду для запуска escape-последовательностей внутри оболочки или скрипта. tput smcupпереключается на альтернативный экран и tput rmcupобратно на главный экран.

Чтобы узнать, какая программа запущена в данный момент, посмотрите имя программы, отображаемое в окне «Терминал» или заголовке вкладки, или посмотрите окно «Инспектор» (« Оболочка»> «Показать Инспектор» ). Последний процесс в списке в Инспекторе (обычно) - текущая программа, использующая экран. Это то, что вам нужно настроить, чтобы вместо этого использовать главный экран.

Крис Пейдж
источник
1
Это звучит как очень многообещающий ответ. Является ли разумным объяснение того, что программа может выйти из строя ненормально, оставив альтернативный экран активным?
Стив Мэдсен
Если вы вернулись в оболочку после запуска «полноэкранной» программы, то да, это возможно, хотя большинство популярных программ, таких как те, что я перечислил, надежны в отношении очистки после себя. В случае сбоя «полноэкранной» программы она может покинуть терминал на альтернативном экране. Тем не менее, вы сказали, что пробовали Shell> Send Hard Reset , что включает в себя возврат на главный экран. Если это произойдет снова, вы можете попробовать использовать эту команду, чтобы переключиться обратно:tput rmcup
Крис Страница
Другая возможность состоит в том, что программа покинула терминал с «областью прокрутки». Существуют коды, позволяющие терминалу прокручивать только поддиапазон линий при прокрутке. Программы используют это для отображения строк состояния, например, которые не прокручиваются за пределы экрана. Если область прокрутки не включает верхнюю строку, текст не будет прокручиваться в журнал прокрутки. Опять же, однако, вы сказали, что вы пробовали Hard Reset, который тоже должен это очистить.
Крис Пейдж
2
В моем случае, похоже, произошло то, что мой sshсеанс на удаленной машине не удался (истекло время ожидания?), Пока я был внутри vi, по-видимому, оставив терминал на альтернативном экране (потому что мне viникогда не давали возможность очистить). После этого любой новый sshсеанс в том же терминале будет показывать проблему, описанную OP, пока я не решу проблему, выбрав пункт меню View> Hide Alternate Screen .
Гефест
Спасибо, View> Show / Hide Alternate Screen помогло. У него есть комбинация клавиш, которую я, должно быть, неосознанно
нажал