Wie konfiguriere ich die Bildschirmwiederherstellung in einem Terminal?

10

Je nach Terminal / Umgebung hat die folgende Reihenfolge unterschiedliche Auswirkungen:

$ ls
1
2
$ man ls
enter q

Entweder wird der zuletzt angezeigte Manpage-Bildschirm über der aktuellen Eingabeaufforderung angezeigt, oder die ls-Ausgabe und die vorherige Shell-Ausgabe werden wiederhergestellt. Der gleiche Effekt wird z. B. beim Verwenden vimund anschließenden Anhalten beobachtet , um etwas an der Schale zu tun.

Unter Fedora 19 scheint die Standardeinstellung für den Bildschirm "Keine Wiederherstellung" zu sein. Ein Gnome-Terminal / xterm verwendet standardmäßig "Do-Restore".

Unter Solaris hängt es anscheinend vom verwendeten Terminal / Terminfo-Datenbank ab.

Ich möchte das Wiederherstellungsverhalten zwischen verschiedenen Systemen / Terminals konsistent konfigurieren.

maxschlepzig
quelle
Wenn Sie immer den GNU-Bildschirm ausführen, erhalten Sie ein konsistentes Verhalten.
Jordan

Antworten:

16

Die Funktion scheint als "alternativer Bildschirm" oder Umschalten zwischen normalem und alternativem Bildschirm bezeichnet zu werden.

Sie können es mit einem xterm erkunden. Geben Sie zum Beispiel man maneinen xtermund einen Exit-Mann ein. Jetzt können Sie über Ctrl+ Maus2 (mittlerer Klick) -> 'Alternativbildschirm anzeigen' zum alternativen Bildschirm wechseln. Alternativ können Sie die xterm-Steuersequenzen direkt eingeben , z.

$ echo -e '\033[?47h' # alternate screen
$ echo -e '\033[?47l' # normal screen

Die letzten beiden Befehle funktionieren auch im Gnome-Terminal (wahrscheinlich auch in anderen).

Was passiert, wenn man/ vi/ lessetc. gestartet wird, ist im Grunde, dass sie einen abstrakten Klarbildbefehl senden. Beim Beenden (oder Anhalten) senden sie einen abstrakten Befehl zum Wiederherstellen des Bildschirms. Wie der Befehl in konkrete Terminalsteuerungssequenzen übersetzt wird, ist in der terminfo- Datenbank definiert.

Deaktivieren Sie die alternative Bildschirmumschaltung

Was für alle Terminals funktionieren sollte, ist das Anpassen lokaler Terminfo-Einträge, dh das Entfernen der Zuordnung von abstrakten Lösch- / Wiederherstellungsbildschirmbefehlen.

Sie können dies folgendermaßen tun - für den aktuellen $TERMEintrag (zum Beispiel für das Gnome-Terminal unter Fedora 19):

$ echo $TERM
xterm-256color
$ infocmp -1 > xterm-256color
$ sed 's/^\(xterm-256color\)|/\1-na|/ ; /smcup\|rmcup/d ' \
    xterm-256color > xterm-256color-na
$ diff -u xterm-256color* 
--- xterm-256color  2013-08-04 16:33:52.041393461 +0200
+++ xterm-256color-na   2013-08-04 16:36:56.829930520 +0200
@@ -1,5 +1,5 @@
 #  Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm-256color
-xterm-256color|xterm with 256 colors,
+xterm-256color-na|xterm with 256 colors,
    am,
    bce,
    ccc,
@@ -155,7 +155,6 @@
    rin=\E[%p1%dT,
    rmacs=\E(B,
    rmam=\E[?7l,
-   rmcup=\E[?1049l,
    rmir=\E[4l,
    rmkx=\E[?1l\E>,
    rmm=\E[?1034l,
@@ -170,7 +169,6 @@
    sgr0=\E(B\E[m,
    smacs=\E(0,
    smam=\E[?7h,
-   smcup=\E[?1049h,
    smir=\E[4h,
    smkx=\E[?1h\E=,
    smm=\E[?1034h,
$ tic xterm-256color-na # loads the file to $HOME/.terminfo
$ find ~/.terminfo -type f
$ HOME/.terminfo/x/xterm-256color-na

Jetzt können Sie es testen über:

$ TERM=xterm-256color-na man man # and then hit q

Sie können die obigen Schritte für andere Terminals wiederholen, wenn Sie mehrere verwenden. Wenn alles wie erwartet funktioniert, können Sie TERMüber Ihre Shell RC-Datei einstellen .

Sie können den Terminalnamen auch direkt als Parameter angeben infocmp, z.

$ infocmp -1 screen > screen

Aktivieren Sie die alternative Bildschirmumschaltung

Einige Terminals unterstützen die alternative Bildschirmumschaltfunktion (z. B. Bildschirm ), deaktivieren sie jedoch standardmäßig .

Denn screenSie können es aktivieren über ~/.screenrc:

$ cat ~/.screenrc
altscreen

Wenn Sie sich über ssh per Fernzugriff auf ein Solaris-System anmelden, ist die remote konfigurierte systemweite Terminfo-Datenbank möglicherweise historisch, fehlerhaft oder enthält einige ungewöhnliche / Solaris-spezifische Standardeinstellungen, die nicht mit den Terminals übereinstimmen du rennst ssh rein.

Daher ist es eine Option, die lokale Terminfo-Datenbank einfach von / usr / share / info (auf dem Client) nach host:~/.terminfo(auf dem Server) zu kopieren .

Falls das kompilierte Terminfo-Format nicht kompatibel ist, können Sie die Einträge auch wie im vorherigen Absatz exportieren / importieren.

Ich habe versucht, mit einer terminfo-db aus einer Cygwin- Installation zu arbeiten und sie direkt auf ein Solaris 10-System zu kopieren.

Wenn Sie eine alternative terminfo-Datenbank für Benutzer freigeben möchten, geben Sie deren Pfad über die TERMINFOUmgebungsvariable an.

Ignorieren Sie die Kontrollsequenz

Einige Terminals unterstützen das Deaktivieren der Steuersequenz für die alternative Bildschirmumschaltung. Zum Beispiel hat xterm eine Option, gnome-terminal nicht.

Für xterm ist es die X-Ressource , z

XTerm*titeInhibit: true

Programmspezifische Konfigurationen

Einige Programme verfügen über Konfigurationsdateien, um zu konfigurieren, welche Steuersequenz- / Terminfo-Befehle sie senden. Zum Beispiel

$ LESS=X less foo

Konfiguriert less, dass der Bildschirm nicht gelöscht / wiederhergestellt wird.

Denn vimdu kannst so etwas einschließen

set t_ti= t_te=

in dir ~/.vimrc.

Ich habe keine Option gefunden, wie dieses Verhalten für top konfiguriert werden kann - standardmäßig wird kein Wiederherstellungsbildschirm gesendet.

maxschlepzig
quelle
Das sed cmd löscht tatsächlich die gesamte Zeile mit smcupoder rmcup. In meinem Fall kommen andere Dinge mit ihnen auf die gleiche Linie. Diese anderen Sachen wurden ebenfalls gelöscht. Vielleicht ist so etwas s/[sr]mcup=[^,]*,//'besser.
Mingliang