Jak skonfigurować przywracanie ekranu w terminalu?

10

W zależności od terminala / środowiska następująca sekwencja ma różne skutki:

$ ls
1
2
$ man ls
enter q

Albo widzę ostatnio wyświetlany ekran strony podręcznika powyżej bieżącego monitu lub przywracane jest wyjście ls i poprzednie wyjście powłoki. Ten sam efekt obserwuje się np. Podczas używania, vima następnie zawieszania go w celu zrobienia czegoś na powłoce.

W Fedorze 19 - domyślnym ustawieniem ekranu jest brak przywracania, terminal gnome / xterm domyślnie używa przywracania do.

Na Solarisie zależy to od użytego terminalu / terminfo db.

Chcę skonfigurować zachowanie przywracania spójnie między różnymi systemami / terminalami.

maxschlepzig
źródło
Jeśli zawsze uruchamiasz ekran GNU, uzyskasz spójne zachowanie.
jordanm

Odpowiedzi:

16

Wygląda na to, że funkcja nazywa się „ekranem alternatywnym” lub przełączaniem między ekranem normalnym a alternatywnym.

Możesz to zbadać za pomocą Xtermu. Na przykład typu man manw xtermoraz zamknąć człowieka. Teraz możesz przejść do alternatywnego ekranu za pomocą Ctrlmyszy + Mouse2 (środkowe kliknięcie) -> „Pokaż alternatywny ekran”. Alternatywnie możesz bezpośrednio wprowadzić sekwencje kontrolne xterm , np .:

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

Ostatnie dwa polecenia działają również w gnome-terminal (prawdopodobnie także w innych).

To, co dzieje się, gdy uruchamianie man/ vi/ lessitp. Polega na tym, że wysyłają abstrakcyjne polecenie czyszczenia ekranu. Przy wyjściu (lub zawieszeniu) wysyłają abstrakcyjne polecenie przywracania ekranu. Sposób, w jaki polecenie tłumaczy się na konkretne sekwencje sterowania terminalem, zdefiniowano w bazie danych terminfo .

Wyłącz alternatywne przełączanie ekranu

To, co powinno działać dla wszystkich terminali, to dostosowywanie lokalnych wpisów terminfo, tj. Usuwanie mapowania abstrakcyjnych komend ekranu wyczyść / przywróć.

Możesz to zrobić w ten sposób - dla bieżącego $TERMwpisu (na przykład gnome-terminal na Fedorze 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

Teraz możesz to przetestować za pomocą:

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

Możesz powtórzyć powyższe kroki dla innych terminali, jeśli używasz wielu. Jeśli wszystko działa zgodnie z oczekiwaniami, możesz ustawić TERMza pomocą pliku rc powłoki.

Możesz także bezpośrednio określić nazwę terminala jako parametr infocmp, np .:

$ infocmp -1 screen > screen

Włącz alternatywne przełączanie ekranu

Niektóre terminale obsługują funkcję alternatywnego przełączania ekranu (np. Ekran ), ale domyślnie ją wyłączają .

Dla screenmożesz go włączyć za pośrednictwem ~/.screenrc:

$ cat ~/.screenrc
altscreen

Jeśli zdalnie logujesz się przez ssh do - powiedzmy - systemu Solaris, być może zdalnie skonfigurowana ogólnosystemowa baza danych terminfo jest w pewnym sensie historyczna, zepsuta lub zawiera pewne nietypowe / specyficzne dla Solaris wartości domyślne, które nie pasują do terminali „najnowocześniejszych” uruchamiasz ssh.

Dlatego istnieje możliwość skopiowania lokalnej bazy danych terminfo z katalogu / usr / share / info (na kliencie) do host:~/.terminfo(na serwerze).

W przypadku, gdy skompilowany format terminfo nie jest kompatybilny, możesz również eksportować / importować wpisy, jak w poprzednim akapicie.

Próbowałem z terminfo-db z instalacji Cygwin i kopiowanie go bezpośrednio do systemu Solaris 10 działało.

Jeśli chcesz udostępnić alternatywną bazę danych terminfo między użytkownikami, podaj jej ścieżkę za pomocą TERMINFOzmiennej środowiskowej.

Zignoruj ​​sekwencję kontrolną

Niektóre terminale obsługują wyłączenie sekwencji sterowania dla alternatywnego przełączania ekranu. Na przykład xterm ma opcję, gnome-terminal nie.

W przypadku Xterm jest to X-ressource , np

XTerm*titeInhibit: true

Konfiguracje specyficzne dla programu

Niektóre programy mają pliki konfiguracyjne do konfiguracji wysyłanych poleceń sekwencji sterującej / terminfo. Na przykład

$ LESS=X less foo

konfiguruje, lessaby nie wyczyścić / przywrócić ekranu.

Bo vimmożesz dołączyć coś takiego

set t_ti= t_te=

w tobie ~/.vimrc.

Nie znalazłem opcji, jak skonfigurować to zachowanie dla góry - domyślnie nie wysyła ekranu przywracania.

maxschlepzig
źródło
Sed cmd faktycznie usuwa całą linię zawierającą smcuplub rmcup. W moim przypadku na tej samej linii pojawiają się inne rzeczy. Te inne rzeczy również zostały usunięte. Więc może coś takiego s/[sr]mcup=[^,]*,//'jest lepsze.
Mingliang