Така поведінка походить від функції «альтернативного екрана», що міститься в деяких (апаратних) терміналах та більшості (програмних) термінальних емуляторів. Що трапляється, це те, що деякі програми, обізнані з терміналами, переходять на альтернативний "екран", щоб виконати свою роботу, і повертаються назад до звичайного "екрану", коли їх звільняють (закривають, призупиняють тощо). Це ефективно очищає кінцевий результат таких програм.
Пошук в Інтернеті за термінами "запобігти altscreen" надав сторінку, на якій обговорюється "проблема" альтернативного екрана та кілька рішень .
Як описано на цій пов'язаній сторінці, деякі програми можна налаштувати так, щоб не використовувати альтернативний екран. -X
Варіант для менш є непрямим способом зробити це. Vim можна налаштувати аналогічно, відміняючи змінні t_ti
та t_te
.
Рішення з ширшою сферою застосування - редагувати запис terminfo для свого терміналу, щоб він не включав альтернативні послідовності керування екраном. Записи terminfo утворюють базу даних, яка повідомляє програмам, які керують послідовністю надсилання до терміналу для створення певних ефектів (переміщення курсору, очищення екрана, видалення частини поточного рядка тощо). Редагуючи запис терміна, який використовує ваш термінал, ви можете домовитись про «знехтування сказати» всім програмам, що використовують терміни, про те, що керуючі послідовності «альтернативного екрана» навіть існують.
Зі списку керуючих послідовностей для xterm , ми можемо бачити, що контрольні послідовності, що цікавлять (для xterm- подібних термінальних емуляторів), є
- включити альтернативний екран:
ESC [ ? 47 h
(аналогічно 1047 та 1049) та
- відновити нормальний екран:
ESC [ ? 47 l
(аналогічно для 1047 та 1049).
Ці коди, швидше за все, присутні у змінних terminfo smcup
та rmcup
. Швидкий і брудний спосіб визначення цих змінних для вашого поточного терміна може виглядати так:
infocmp | sed -e 's/[sr]mcup=[^,]*,//' > /tmp/noaltscreen-terminfo
tic -o ~/.terminfo/ /tmp/noaltscreen-terminfo
Цей метод є досить грубим і, безумовно, не працює для всіх терміналів, але, ймовірно, він буде працювати для більшості xterm- подібних емуляторів терміналів. В ідеалі вам слід дослідити значення в змінних smcup
та rmcup
змінних запису terminfo для вашого терміналу і консервативно відредагувати їх, щоб запобігти небажаній поведінці. На вищезв'язаній сторінці обговорення / рішення є файл «попередньо приготований» файл терміна, який ви можете використовувати замість того, щоб зламати свій власний (але чим у цьому цікаво?).