¿Cómo configurar la restauración de pantalla en un terminal?

10

Dependiendo del terminal / entorno, la siguiente secuencia tiene diferentes efectos:

$ ls
1
2
$ man ls
enter q

O veo la última pantalla de página de manual que se muestra sobre el indicador actual o la salida ls y la salida de shell anterior se restaura. Se observa el mismo efecto, por ejemplo, cuando se usa vimy luego se suspende para hacer algo en el shell.

En Fedora 19: el valor predeterminado de la pantalla parece no ser restaurar, un gnome-terminal / xterm usa do-restore por defecto.

En Solaris, depende de la terminal / terminfo db utilizada que parece.

Quiero configurar el comportamiento de restauración de manera consistente entre diferentes sistemas / terminales.

maxschlepzig
fuente
Si siempre ejecuta la pantalla GNU, obtendrá un comportamiento consistente.
jordanm

Respuestas:

16

La característica parece llamarse 'pantalla alternativa' o cambiar entre pantalla normal y alternativa.

Puedes explorarlo usando un xterm. Por ejemplo, escriba man manan xtermy salga de man. Ahora puede cambiar a la pantalla alternativa mediante Ctrl+ Mouse2 (clic central) -> 'Mostrar pantalla alternativa'. Alternativamente, puede ingresar directamente las secuencias de control de xterm , por ejemplo:

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

Los dos últimos comandos también funcionan en gnome-terminal (probablemente también en otros).

Lo que sucede cuando man/ vi/ lessetc. inicio es básicamente que envían un comando abstracto de pantalla clara. Al salir (o suspender) envían un comando abstracto de restauración de pantalla. La forma en que el comando se traduce en secuencias de control de terminal concretas se define en la base de datos terminfo .

Deshabilitar cambio de pantalla alternativo

Lo que debería funcionar para todos los terminales es ajustar las entradas locales de terminal, es decir, eliminar la asignación de comandos abstractos de borrar / restaurar pantalla.

Puede hacerlo así: para la $TERMentrada actual (para gnome-terminal en Fedora 19, por ejemplo):

$ 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

Ahora puedes probarlo a través de:

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

Puede repetir los pasos anteriores para otros terminales si usa varios. Si todo funciona como se espera, puede configurarlo a TERMtravés de su shell rc-file.

También puede especificar directamente el nombre del terminal como parámetro para infocmp, por ejemplo:

$ infocmp -1 screen > screen

Habilitar cambio de pantalla alternativo

Algunos terminales admiten la función alternativa de cambio de pantalla (p . Ej., Pantalla ), pero la desactivan por defecto .

Para screenque pueda habilitarlo a través de su ~/.screenrc:

$ cat ~/.screenrc
altscreen

Si inicia sesión de forma remota a través de ssh para, por ejemplo, un sistema Solaris, tal vez la base de datos terminfo configurada de forma remota en todo el sistema sea histórica, esté dañada o incluya algunos valores predeterminados inusuales / específicos de Solaris que no coinciden con los terminales 'de última generación' corres ssh adentro.

Por lo tanto, es una opción copiar la base de datos local de terminfo desde / usr / share / info (en el cliente) a host:~/.terminfo(en el servidor).

En caso de que el formato terminfo compilado no sea compatible, también puede exportar / importar las entradas como en el párrafo anterior.

He intentado con un terminfo-db de una instalación de Cygwin y funcionó copiarlo directamente a un sistema Solaris 10.

En caso de que desee compartir una terminfo db alternativa entre usuarios, especifique su ruta a través de la TERMINFOvariable de entorno.

Ignorar la secuencia de control

Algunos terminales admiten la desactivación de la secuencia de control para el cambio de pantalla alternativo. Por ejemplo, xterm tiene una opción, gnome-terminal no.

Para xterm es la fuente X , p. Ej.

XTerm*titeInhibit: true

Configuraciones específicas del programa

Algunos programas tienen archivos de configuración para configurar qué secuencia de control / comandos terminfo envían. Por ejemplo

$ LESS=X less foo

configura lesspara no borrar / restaurar la pantalla.

Para vimque pueda incluir algo como

set t_ti= t_te=

en ti ~/.vimrc.

No he encontrado la opción de cómo configurar ese comportamiento para la parte superior; de forma predeterminada, no envía la pantalla de restauración.

maxschlepzig
fuente
El cmd sed realmente borra toda la línea que contiene smcupo rmcup. En mi caso, hay otras cosas que vienen en la misma línea con ellos. Esas otras cosas también se eliminaron. Entonces tal vez algo así s/[sr]mcup=[^,]*,//'es mejor.
Mingliang