Screen: как включить альтернативный экран?

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

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

Как я могу достичь такого поведения?

Я использовал:

  • terminal.app и iterm2.app
  • попробовал переключение xterm на xterm-256color (в iterm2.app)
  • проверка и снятие отметки "Сохранить строки для прокрутки при наличии строки состояния приложения" и "Сохранить строки для прокрутки в режиме альтернативного экрана" (в iterm2)
  • добавление termcapinfo xterm ti @: te @to.screenrc(хотя это должно быть решение противоположной проблемы, но почему бы не попробовать)
  • sshing для Linux-машин и пытается использовать gnu-screen там

До сих пор я не получил желаемого поведения.

P.S.

Я немного погуглил и увидел комментарии людей, которые пытаются решить противоположную проблему:

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

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

изгнать злой альтернативный экран

Ответы

Ответ 1

ОБНОВЛЕНИЕ: Я забыл о функции screen, которая по умолчанию отключает поддержку альтернативного экрана.

Добавьте altscreen on в свой $HOME/.screenrc, чтобы включить его. Это, вероятно, все, что вам нужно сделать; все беспорядки с $TERM, $TERMCAP и $TERMINFO, вероятно, не нужны. В любом случае я оставлю остальную часть этого ответа.

У меня было это в моем собственном .screenrc, так что это проскользнуло мне.

Чтобы включить эту функцию для текущего сеанса, введите ваш screen escape-символ (Cntrl-A по умолчанию), а затем :altscreen on Enter.

Без этого screen не будет реагировать на escape-последовательности, даже если они определены в terminfo или termcap.


vimless, и большинство других программ на основе полного проклятия) используют строки smcup и rmcup, определенные в записи terminfo для вашего терминала. (Они называются ti и te, соответственно, в старой системе termcap). smcup переключается на альтернативный экран, а rmcup переключается на основной экран.

Если ваша запись terminfo не имеет этих строк, программы не смогут этого сделать.

Команда экрана по умолчанию устанавливает $TERM в "screen". По-видимому, запись "term" terminfo не имеет smcup и rmcup.

Если вам нравится взломать записи terminfo, вы можете изменить существующую информацию для "экрана", чтобы добавить smcup и rmcup. Вам понадобится команда infocmp, чтобы преобразовать вашу terminfo в текст и tic, чтобы преобразовать ее обратно в двоичную форму, используемую terminfo.

Более простым решением является установка вашей переменной среды $TERM в значение, которое было до того, как вы вызывали команду screen. В настоящее время почти все терминальные эмуляторы основаны на старой DEC VT100, поэтому они должны быть достаточно совместимы.

В моей системе, например, когда я вхожу в систему, у меня есть TERM=xterm; вероятно, что-то еще на MacOS. В рамках сеанса screen по умолчанию у меня будет:

 $ echo $TERM
 screen

Я мог бы изменить его на xterm следующим образом:

$ export TERM=xterm

(Снова замените "xterm" любым $TERM на вашей системе.)

Вы также можете добавить

term xterm

на ваш $HOME/.screenrc. Фактически screen имеет несколько вариантов настройки ваших настроек termcap/terminfo; man screen и найдите "terminfo" для деталей gory.