Takie zachowanie wynika z funkcji „alternatywnego ekranu” zawartej w niektórych terminalach (sprzętowych) i większości emulatorów terminali (programowych). To, co się dzieje, polega na tym, że niektóre programy obsługujące terminale przełączają się na alternatywny „ekran”, aby wykonać swoją pracę, i wracają do normalnego „ekranu”, gdy zostaną zwolnione (zakończone, zawieszone itp.). To skutecznie usuwa końcowe wyniki takich programów.
Wyszukiwarka internetowa dla „terminfo zapobiegać altscreen” dostarczyła stronę omawiającą „problem” alternatywnego ekranu i kilka rozwiązań .
Jak opisano na tej połączonej stronie, niektóre programy można skonfigurować, aby uniknąć korzystania z alternatywnego ekranu. -X
Opcja dla mniej jest pośrednim sposobem osiągnięcia tego celu. Vim może być skonfigurowany podobnie poprzez rozbrojenie zmiennych t_ti
i t_te
.
Rozwiązaniem o szerszym zakresie jest edycja wpisu terminfo dla terminala, aby nie zawierał on alternatywnych sekwencji sterowania ekranem. Wpisy terminfo tworzą bazę danych, która informuje programy, które sekwencje kontrolne mają wysłać do terminala w celu uzyskania określonych efektów (przesunięcie kursora, wyczyszczenie ekranu, usunięcie części bieżącej linii itp.). Poprzez edycję wpisu terminfo używanego przez twój terminal możesz ustawić „zaniedbanie informowania” wszystkich programów korzystających z terminfo, że istnieją sekwencje kontrolne „alternatywnego ekranu”.
Z listy sekwencji kontrolnych dla xterm możemy zobaczyć, że interesujące sekwencje kontrolne (dla emulatorów terminalnych podobnych do xterm ) są
- włączyć alternatywny ekran:
ESC [ ? 47 h
(podobnie dla 1047 i 1049), i
- przywróć normalny ekran:
ESC [ ? 47 l
(podobnie dla 1047 i 1049).
Te kody są najprawdopodobniej obecne w zmiennych terminfo smcup
i rmcup
. Szybki i brudny sposób na wycięcie tych zmiennych dla bieżącego TERM może wyglądać następująco:
infocmp | sed -e 's/[sr]mcup=[^,]*,//' > /tmp/noaltscreen-terminfo
tic -o ~/.terminfo/ /tmp/noaltscreen-terminfo
Ta metoda jest dość prymitywna i na pewno nie zadziała dla wszystkich terminali, ale prawdopodobnie zadziała dla większości emulatorów terminali podobnych do xterm . Idealnie powinieneś zbadać wartości we wpisach terminfo smcup
i rmcup
zmiennych terminala i konserwatywnie je edytować, aby zapobiec niepożądanemu zachowaniu. Powyższa strona dyskusji / rozwiązania ma „wstępnie przygotowany” plik terminfo, którego możesz użyć zamiast włamać się do własnego (ale co w tym jest fajnego?).