Comment configurer la restauration d'écran dans un terminal?

10

Selon le terminal / l'environnement, la séquence suivante a différents effets:

$ ls
1
2
$ man ls
enter q

Soit je vois le dernier écran de page de manuel affiché au-dessus de l'invite actuelle, soit la sortie ls et la sortie shell précédente sont restaurées. Le même effet est observé par exemple lors de son utilisation vimpuis de sa suspension pour faire quelque chose sur le shell.

Sur Fedora 19 - l'écran par défaut semble être sans restauration, un gnome-terminal / xterm utilise la restauration par défaut.

Sous Solaris, cela dépend du db terminal / terminfo utilisé.

Je souhaite configurer le comportement de restauration de manière cohérente entre différents systèmes / terminaux.

maxschlepzig
la source
Si vous exécutez toujours l'écran GNU, vous obtiendrez un comportement cohérent.
jordanm

Réponses:

16

La fonctionnalité semble être appelée «écran alternatif» ou basculer entre l'écran normal et l'écran alternatif.

Vous pouvez l'explorer à l'aide d'un xterm. Par exemple, tapez man manan xtermet exit man. Vous pouvez maintenant passer à l'écran alternatif via Ctrl+ Souris2 (clic du milieu) -> 'Afficher l'écran alternatif'. Vous pouvez également saisir directement les séquences de contrôle xterm , par exemple:

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

Les deux dernières commandes fonctionnent également dans gnome-terminal (probablement dans d'autres aussi).

Ce qui se passe au démarrage de man/ vi/ lessetc., c'est qu'ils envoient une commande abstraite en clair. À la sortie (ou à la suspension), ils envoient une commande abstraite de restauration d'écran. La façon dont la commande se traduit en séquences de contrôle de terminal concrètes est définie dans la base de données terminfo .

Désactiver la commutation d'écran alternative

Ce qui devrait fonctionner pour tous les terminaux est d'ajuster les entrées terminfo locales, c'est-à-dire de supprimer le mappage des commandes d'écran d'effacement / de restauration abstraites.

Vous pouvez le faire comme ceci - pour l' $TERMentrée actuelle (pour gnome-terminal sur Fedora 19 par exemple):

$ 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

Vous pouvez maintenant le tester via:

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

Vous pouvez répéter les étapes ci-dessus pour d'autres terminaux si vous en utilisez plusieurs. Si tout fonctionne comme prévu, vous pouvez le régler TERMvia votre fichier shell rc.

Vous pouvez également spécifier directement le nom du terminal en tant que paramètre infocmp, par exemple:

$ infocmp -1 screen > screen

Activer la commutation d'écran alternative

Certains terminaux prennent en charge la fonction de commutation d'écran alternative (par exemple, l' écran ), mais la désactivent par défaut .

Car screenvous pouvez l'activer via votre ~/.screenrc:

$ cat ~/.screenrc
altscreen

Si vous vous connectez à distance via ssh pour - disons - un système Solaris, la base de données terminfo à l'échelle du système configurée à distance est en quelque sorte historique, cassée ou inclut des valeurs par défaut inhabituelles / spécifiques à Solaris qui ne correspondent pas aux terminaux `` de pointe ''. vous exécutez ssh.

Ainsi, c'est une option pour simplement copier la base de données terminfo locale de / usr / share / info (sur le client) vers host:~/.terminfo(sur le serveur).

Si le format terminfo compilé n'est pas compatible, vous pouvez également exporter / importer les entrées comme dans le paragraphe précédent.

J'ai essayé avec un terminfo-db d'une installation Cygwin et le copier directement sur un système Solaris 10 a fonctionné.

Dans le cas où vous souhaitez partager une autre terminfo db entre utilisateurs, vous spécifiez son chemin via la TERMINFOvariable d'environnement.

Ignorer la séquence de contrôle

Certains terminaux prennent en charge la désactivation de la séquence de contrôle pour une commutation d'écran alternative. Par exemple, xterm a une option, pas gnome-terminal.

Pour xterm, c'est la ressource X , par exemple

XTerm*titeInhibit: true

Configurations spécifiques au programme

Certains programmes ont des fichiers de configuration pour configurer les commandes de séquence de contrôle / terminfo qu'ils envoient. Par exemple

$ LESS=X less foo

configure lesspour ne pas effacer / restaurer l'écran.

Car vimvous pouvez inclure quelque chose comme

set t_ti= t_te=

en toi ~/.vimrc.

Je n'ai pas trouvé d'option comment configurer ce comportement pour le haut - par défaut, il n'envoie pas d'écran de restauration.

maxschlepzig
la source
La cmd sed supprime en fait toute la ligne contenant smcupou rmcup. Dans mon cas, il y a d'autres trucs qui viennent sur la même ligne avec eux. Ces autres éléments ont également été supprimés. Alors peut-être que quelque chose comme s/[sr]mcup=[^,]*,//'c'est mieux.
Mingliang