Это происходит от функции «альтернативного экрана», включенной в некоторые (аппаратные) терминалы и большинство (программных) эмуляторов терминалов. Что происходит, так это то, что некоторые программы, поддерживающие терминалы, переключаются на альтернативный «экран», чтобы выполнить свою работу, и переключаются обратно на обычный «экран», когда их закрывают (выход, приостановка и т. Д.). Это эффективно очищает конечный результат таких программ.
Поиск в сети по запросу «terminfo предотвращает altscreen» предоставил страницу, на которой обсуждается альтернативный экран «проблема» и несколько решений .
Как описано на этой связанной странице, некоторые программы можно настроить, чтобы избежать использования альтернативного экрана. -X
Вариант для менее является косвенным способом сделать это. Вим может быть сконфигурирован подобным образом путем снятия с охраны t_ti
и t_te
переменные.
Решение с более широкой областью применения - отредактировать запись terminfo для вашего терминала, чтобы она не включала альтернативные последовательности управления экраном. Записи terminfo формируют базу данных, которая сообщает программам, какие управляющие последовательности отправлять терминалу для создания определенных эффектов (перемещение курсора, очистка экрана, удаление части текущей строки и т. Д.). Отредактировав запись terminfo, которую использует ваш терминал, вы можете организовать «игнорирование» для всех программ, использующих terminfo, о том, что последовательности управления «альтернативным экраном» вообще существуют.
Из списка контрольных последовательностей для xterm видно, что интересующие контрольные последовательности (для xterm- подобных терминальных эмуляторов)
- включить альтернативный экран:
ESC [ ? 47 h
(аналогично для 1047 и 1049) и
- восстановить нормальный экран:
ESC [ ? 47 l
(аналогично для 1047 и 1049).
Эти коды, скорее всего, присутствуют в переменных terminfo smcup
и rmcup
. Быстрый и грязный способ вырезать эти переменные для текущего TERM может выглядеть следующим образом:
infocmp | sed -e 's/[sr]mcup=[^,]*,//' > /tmp/noaltscreen-terminfo
tic -o ~/.terminfo/ /tmp/noaltscreen-terminfo
Этот метод довольно грубый и, конечно, не будет работать для всех терминалов, но, вероятно, он будет работать для большинства xterm- подобных эмуляторов терминалов. В идеале вы должны исследовать значения в smcup
и rmcup
переменные записи terminfo для вашего терминала и консервативно редактировать их, чтобы предотвратить нежелательное поведение. На приведенной выше странице обсуждения / решения есть «предварительно приготовленный» файл terminfo, который вы можете использовать вместо того, чтобы взламывать свой собственный (но что в этом хорошего?).