Come configurare il ripristino dello schermo in un terminale?


10

A seconda del terminale / ambiente la sequenza seguente ha effetti diversi:

$ ls
1
2
$ man ls
enter q

O vedo l'ultima schermata della pagina man visualizzata sopra il prompt corrente o l'output ls e l'output della shell precedente viene ripristinato. Lo stesso effetto si osserva, ad esempio, quando si utilizza vime quindi si sospende per fare qualcosa sulla shell.

Su Fedora 19 - il default dello schermo sembra essere no-restore, uno gnome-terminal / xterm usa do-restore di default.

Sembra che su Solaris dipenda dal terminale / terminale usato.

Voglio configurare il comportamento di ripristino in modo coerente tra diversi sistemi / terminali.


Se esegui sempre la schermata GNU, otterrai un comportamento coerente.
Giordania,

Risposte:


16

La funzione sembra essere chiamata "schermata alternativa" o passare dalla schermata normale a quella alternativa.

Puoi esplorarlo usando un xterm. Ad esempio, digitare man manan xterme uscire da man. Ora puoi passare alla schermata alternativa tramite Ctrl+ Mouse2 (clic centrale) -> 'Mostra schermata alternativa'. In alternativa è possibile inserire direttamente le sequenze di controllo xterm , ad esempio:

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

Gli ultimi due comandi funzionano anche in gnome-terminal (probabilmente anche in altri).

Quello che succede all'avvio di man/ vi/ lessetc. è fondamentalmente che inviano un comando astratto a schermo chiaro. All'uscita (o sospensione) inviano un comando di schermata di ripristino astratto. Il modo in cui il comando si traduce in sequenze concrete di controllo dei terminali è definito nel database terminfo .

Disabilita il cambio schermo alternativo

Ciò che dovrebbe funzionare per tutti i terminali è regolare le voci locali del terminfo, cioè rimuovere la mappatura dei comandi astratti di schermata di cancellazione / ripristino.

Puoi farlo in questo modo - per la $TERMvoce corrente (per esempio per gnome-terminal su 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

Ora puoi provarlo tramite:

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

È possibile ripetere i passaggi precedenti per altri terminali se si utilizzano più terminali. Se tutto funziona come previsto, puoi impostare TERMil file rc della shell.

È inoltre possibile specificare direttamente il nome del terminale come parametro per infocmp, ad esempio:

$ infocmp -1 screen > screen

Abilita cambio schermo alternativo

Alcuni terminali supportano la funzione di commutazione dello schermo alternativa (ad es. Schermo ), ma la disabilitano di default .

Perché screenpuoi abilitarlo tramite il tuo ~/.screenrc:

$ cat ~/.screenrc
altscreen

Se si effettua il login remoto tramite ssh per - diciamo - un sistema Solaris, forse il database terminfo a livello di sistema configurato in remoto è un po 'storico, rotto o include alcuni valori insoliti / specifici di Solaris che non corrispondono ai terminali' bleeding edge ' corri ssh.

Pertanto, è un'opzione per copiare il database terminfo locale da / usr / share / info (sul client) a host:~/.terminfo(sul server).

Nel caso in cui il formato terminfo compilato non sia compatibile, è anche possibile esportare / importare le voci come nel paragrafo precedente.

Ho provato con un terminfo-db da un'installazione Cygwin e copiandolo direttamente su un sistema Solaris 10 ha funzionato.

Nel caso in cui si desideri condividere un db terminfo alternativo tra utenti, è necessario specificarne il percorso tramite la TERMINFOvariabile di ambiente.

Ignora la sequenza di controllo

Alcuni terminali supportano la disabilitazione della sequenza di controllo per la commutazione alternativa dello schermo. Ad esempio xterm ha un'opzione, gnome-terminal no.

Per xterm è la X-risorsa , ad es

XTerm*titeInhibit: true

Configurazioni specifiche del programma

Alcuni programmi dispongono di file di configurazione per configurare la sequenza di controllo / i comandi terminfo che inviano. Per esempio

$ LESS=X less foo

configura lessper non cancellare / ripristinare lo schermo.

Perché vimpuoi includere qualcosa del genere

set t_ti= t_te=

in te ~/.vimrc.

Non ho trovato sull'opzione come configurare quel comportamento in alto - per impostazione predefinita non invia la schermata di ripristino.


Sed cmd elimina effettivamente l'intera riga contenente smcupo rmcup. Nel mio caso, ci sono altre cose che arrivano sulla stessa linea con loro. Anche quelle altre cose sono state cancellate. Quindi forse qualcosa di simile s/[sr]mcup=[^,]*,//'è meglio.
Mingliang,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.