web-dev-qa-db-fra.com

Comment empêcher `clear` d'effacer le tampon de défilement

Au début, je pensais que le défilement illimité ne fonctionnait pas avec l'application Terminal le 16.04. J'ai l'option "limiter le défilement à" décochée. Parfois, il défile parfois, mais pas toujours. Puis j'ai réalisé qu'il ne revenait pas en arrière chaque fois que j'utilisais la commande clear. Il ne fait défiler qu'un seul éboulis.

J'utilise beaucoup clair (presque une fois toutes les 3 commandes).

La page de manuel relative aux points clairs sur terminfo. Il y a quelques options sur terminfo mais je ne trouve pas de fichier de configuration dans lequel je peux définir les options. Tous les fichiers sous/lib/terminfo/à partir desquels clear semble lire sa configuration sont au format compilé et je ne les comprends pas.

Je n'ai pas vu ce problème avec plus tôt à 14.04 (deviner).

Toute aide est grandement appréciée.

Merci.

4
stingray

Ce que vous voulez, c'est taper CTRL+L au lieu de clear.

Cela enverra un "Form Feed" au terminal. Fondamentalement, tout sera déplacé jusqu’à la hauteur de la fenêtre du terminal, ce qui effacera l’écran sans affecter votre défilement.

8
bashBedlam

Cela m'a pris un certain temps pour comprendre, alors je suppose que je devrais partager comment j'ai réussi à faire fonctionner cela.

Si vous tapez "man clear", vous verrez que le manuel dit:

clear efface votre écran si cela est possible, y compris son tampon de défilement (si la fonctionnalité étendue "E3" est définie).

Nous allons supprimer cette fonctionnalité E3:

Commencez par connaître le type de votre terminal:

echo $TERM

Pour moi, cela a abouti à "xterm-256color". Quoi qu'il en soit, souvenez-vous en.

Maintenant, entrez la commande:

infocmp -x xterm-256color > tempfile

Où vous remplacez évidemment xterm-256color par le résultat de la première commande. Cela générera les capacités étendues pour ce type de terminal sur 'fichier_temp'.

Maintenant, éditez ce fichier nouvellement créé. Tu recherches:

E3=\E[3J,

Trouvez ceci et supprimez-le simplement. Le tout, donc si ça ressemblait à:

    ...
    Cs=\E]12;%p1%s\007, E3=\E[3J,
    Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
    ...

Il devrait maintenant ressembler à:

    ...
    Cs=\E]12;%p1%s\007,
    Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
    ...

Enregistrez le fichier. Et à partir de votre terminal, exécutez:

Sudo tic -x tempfile

Ceci chargera votre terminfo modifié et le stockera. redémarrez votre terminal et effacez devrait maintenant ne plus supprimer le scrollbuffer

5
polle

Cette réponse est basée sur la réponse de Stingray (sur laquelle il a fait du très bon travail) et vise à la compléter.

1 - Pour effacer sans perdre le défilement, entrez la commande suivante dans la console (nul besoin de python comme suggéré dans la réponse de stringray):

printf '\33[H\33[2J'

2 - Pour éviter de devoir mémoriser cela, vous pouvez éditer votre fichier .bashrc pour en faire un alias. J'appellerais l'alias clair. En bash, entrez:

nano ~/.bashrc

Et ajoutez cette ligne à la fin:

alias clean="printf '\33[H\33[2J'"

J'aime aussi ajouter div (pour divider):

alias div='echo;echo "------------------------------------------------------------------------------";echo;echo;echo;echo;echo;echo;echo;echo;echo;echo;echo;echo "------------------------------------------------------------------------------";clean'

Ainsi, lorsque vous exécutez la commande div, elle entre deux séparateurs séparés par 10 nouvelles lignes, suivis d'une commande en mode minimal. Cela fera en sorte que lorsque vous faites défiler en arrière, vous saurez exactement où vous avez utilisé div.

Vous pouvez changer le comportement de Sudo bash en faisant Sudo su avant la procédure que j'ai énumérée.

Je recommanderais ceci à la réponse de bashBedlam consistant à utiliser tic, en modifiant .bashrc:

1) il n’exige pas de privilèges Sudo et peut être facilement emporté.

2) affecte uniquement votre utilisateur (tous les utilisateurs ne voudront pas la fonction clear modifiée)

3) survivra aux mises à jour qui ne touchent généralement pas bashrc

2
thebunnyrules

@ heemayl et @bashbedlam Merci.

CTRL + L fait ce que je veux. Mais je suis habitué à taper clair tout le temps. J'ai donc en quelque sorte contourné ce problème en copiant/lib/xterm/x/{xterm, xterm-256color} à partir d'ubuntu 12.04. Il existe une variable d'environnement nommée $ TERM qui stocke ce fichier. Ensuite, j'ai lu votre réponse et essayé CTRL + L et cela a fonctionné. Je suis devenu curieux et j'essayais de voir si je pouvais mettre CTRL + L dans un script sans me retrouver. Ensuite, je me suis souvenu que strace pouvait me donner ce que je voulais. J'ai donc lancé strace clear et constaté qu'il écrivait "\ 33 [H\33 [2J" pour effacer l'écran. Alors j’écris un python _ oneliner print ("\ 33 [H\33 [2J")), le place dans un fichier et ajoute un lien nommé clear pour le désigner. Vous avez 2 solutions de contournement maintenant. Je suis toujours curieux de savoir comment les fichiers terminfo peuvent être lus et modifiés.

Merci encore.

1
stingray