Comment réinitialiser le scrollback dans le terminal via une commande shell?

41

Lorsque vous utilisez Terminal.app, vous pouvez effacer l'écran en utilisant le shell intégré clearou en appuyant sur ^+ L(Control-L).

Cependant, tout cela ne fait que repousser le contenu de l'écran actuel d'une hauteur d'écran et réinitialiser le curseur / l'entrée à la première ligne. Cela signifie que vous pouvez toujours revenir en arrière et le voir.

Ce que vous pouvez également faire, c'est réinitialiser l'intégralité de votre défilement en appuyant sur + K(Commande-K).

Une fois que vous avez fait cela, vous ne pouvez plus faire défiler.

Dans certaines situations (notamment avant d'exécuter screenou vim), j'aimerais réinitialiser le défilement avant que la commande ne s'exécute réellement.

Existe-t-il une commande (comme clear) implémentée dans OS X qui me permet de le faire? Étant donné l'existence de pbcopyet pbpaste, je pense qu'il pourrait exister quelque chose de similaire qui me permettrait de le faire.

Jason Salaz
la source
Comme le dit la réponse de Chris Pages dans la commande d'utilisation du terminal: clear && printf '\e[3J' (Vous avez sélectionné la mauvaise réponse comme bonne réponse!)
Cyborg

Réponses:

57

Le terminal prend en charge une extension de la séquence d'échappement ED (Erase in Display) pour effacer le défilement arrière. Il est également pris en charge par xterm. La commande ED, décrite dans le manuel du VT100 , accepte ces valeurs pour le paramètre Ps:

ESC [Ps J

Paramètre Paramètre Signification

0 Effacer de la position active à la fin de l'écran
1 Effacer du début de l'écran à la position active
2 Effacez tout l'affichage

Terminal ( et xterm ) ajoute:

3 Effacez le défilement (alias «Lignes enregistrées»)

Notez que cela efface uniquement le défilement arrière, pas l'écran. Cela vous permet d'effacer l'un ou l'autre, ou les deux, en envoyant deux séquences d'échappement.

Par exemple, vous pouvez effacer l'écran et le défilement arrière avec la commande shell suivante: clear && printf '\e[3J'

(La clearcommande recherche la séquence appropriée pour effacer l'écran du terminal actuel, mais la séquence d'échappement «effacer le retour en arrière» est personnalisée et doit être codée en dur. Si vous mettez cela dans un script shell que vous ne connaissez pas pour certains ne sera jamais exécuté avec Terminal, vous devez vérifier que $TERM_PROGRAMc'est Apple_Terminalavant de l'envoyer.)

Chris Page
la source
4
C'est tellement plus rapide qu'osascript!
Sergei
3
C'est une bien meilleure réponse. Donc, pour rendre cela permanent, ajoutez à votre ~ / .bash_profile: alias clear="clear && printf '\e[3J'"
Tom
1
J'ai mis ce script dans mon CHEMIN:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV
2
@WalkerHaleIV Pourquoi créez-vous un exécutable au lieu d'imprimer simplement la séquence d'échappement sur stdout?
Chris Page
1
$ TERM_APPLICATION devrait être $ TERM_PROGRAM
pbatey
30

⌘K, raccourci vers «Affichage> Effacer le défilement».

MISE À JOUR : Cela peut être automatisé avec AppleScript par la commande suivante:

osascript -e 'tell application "System Events" to keystroke "k" using command down'

… Que vous pouvez bien sûr aliasà tout ce que vous voulez, ou stocker dans une fonction de votre ~/.profilescript de connexion :)

Par sécurité cependant, pour pouvoir l'utiliser même en arrière-plan sans risquer d'émettre une frappe sur une mauvaise application frontale, je vous conseille de l'entourer avec le test suivant:

if application "Terminal" is frontmost

… Qui nous donne le code suivant:

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

… Qui à son tour, correctement échappé et aliasédité, se termine par:

alias clear="osascript -e 'if application \"Terminal\" is frontmost then tell application \"System Events\" to keystroke \"k\" using command down'"

Et voici votre nouveau clear! :)

MattiSG
la source
Le point ici est que je voudrais configurer quelque chose dans l'environnement de mon shell afin que lorsque j'exécute une commande (disons vim), le shell exécute la "réinitialisation du défilement" avant d'exécuter vim. Programmatique, pas interactif.
Jason Salaz
1
@JasonSalaz Ok, je n'ai pas compris, désolé. Ajout de code pour cela.
MattiSG
1
@JasonSalaz si cette réponse a résolu votre problème, n'oubliez pas de la valider. Si ce n'est pas le cas, veuillez nous revenir dans les commentaires :) N'oubliez pas que les utilisateurs du futur vous remercieront;)
MattiSG
Cette bande dessinée parle de moi, tu sais. Je fais du programme à Denver, CO. (Non, pas vraiment, ce serait fou si c'était le cas, cependant.)
Jason Salaz
Cela ne fonctionne pas pour moi. Pour autant que je sache, c'est l'équivalent de la frappe clear; c'est-à-dire qu'il efface l'écran, mais je peux toujours revenir en arrière. Frapper Command Kfonctionne normalement.
Zev Eisenberg
7

Voici le code qui fonctionne à la fois pour le terminal macOS et iTerm2. Il n'a pas non plus besoin que la fenêtre soit au premier plan.

printf '\033[2J\033[3J\033[1;1H'

Comment ça marche

Il s'agit d'une composition de 3 séquences d'échappement ANSI , en particulier des commandes "Control Sequence Introducer" .

\033est une séquence d'échappement qui code en dur le point de code du caractère qu'il représente. Le début 0indique que le reste de la séquence code une valeur octale, dans ce cas, 33en octal. La valeur décimale est 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). En ASCII, le point de code 27est le caractère "ESC" (d'échappement).

CSIles commandes commencent par ESC [, aka \033[. Sachant cela, nous pouvons diviser la chaîne en ses 3 parties.

  1. CSI 2 J
    • Ceci est une instance de la commande "ED - Effacer dans l'affichage", qui a la forme CSI n J
    • La nvaleur est définie 2dans ce cas, ce qui appelle la deuxième variante: "Si n est 2, effacez tout l'écran (et déplace le curseur en haut à gauche sur DOS ANSI.SYS)."
  2. CSI 3 J:
    • Ceci est une instance de la commande "ED - Effacer dans l'affichage", qui a la forme CSI n J
    • La nvaleur est définie 3dans ce cas, qui invoque la troisième variante: "Si n est 3, effacez tout l'écran et supprimez toutes les lignes enregistrées dans le tampon de défilement (cette fonctionnalité a été ajoutée pour xterm et est prise en charge par d'autres applications de terminal)."
  3. CSI 1 ; 1 H:
    • Ceci est une instance de la commande "ED - Effacer dans l'affichage", qui a la forme CSI n ; m H

      Déplace le curseur sur la ligne n, la colonne m. Les valeurs sont basées sur 1 et par défaut à 1 (coin supérieur gauche) si omises. Une séquence telle que CSI ;5Hsynonyme de CSI 1;5Het CSI 17;Hidentique à CSI 17H etCSI 17;1H

    • Les valeurs net msont toutes deux définies sur 1, ce qui signifie que cette commande déplace le curseur dans le coin supérieur gauche.
Alexander - Rétablir Monica
la source
Puis-je vous demander d'où vous l'avez obtenu? +1 de moi - ça fonctionne quand même
rbrtl
1
Je ne me souviens pas, mais c'est une composition de ceux-ci: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Reinstate Monica
1
On dirait que c'est " CSI n J" (où n = 2) + " CSI n J" (où n = 3) + " CSI n ; m H" (où n, m = 1, 1), ce qui se traduit par: "ED - Erase in Display" (variante 2), "ED - Erase in Display" (variante 3), "CUP - Cursor Position" (passage à 1, 1)
Alexander - Reinstate Monica