66 votes

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

Lorsque vous utilisez Terminal.app, vous pouvez effacer l'écran à l'aide de la fonction intégrée du shell clear ou en appuyant sur ^ + L (Control-L).

Cependant, cela ne fait que repousser le contenu actuel de l'écran d'une hauteur d'écran et réinitialiser le curseur/la saisie à la première ligne. Vous pouvez donc toujours faire défiler l'écran et le voir.

Ce que vous pouvez également faire, c'est réinitialiser l'ensemble de votre scrollback en appuyant sur + K (Command-K).

Une fois que vous avez fait cela, vous ne pouvez plus revenir en arrière.

Dans certaines situations (notamment, avant d'exécuter screen o vim ), j'aimerais réinitialiser le défilement avant que la commande ne soit exécutée.

Existe-t-il une commande (comme clear ) qui est mis en œuvre dans OS X et qui me permet de faire cela ? Étant donné l'existence de pbcopy y pbpaste Je pense que quelque chose de similaire pourrait exister et me permettre de le faire.

90voto

Chris Page Points 7394

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

ESC \[ Ps J

Parameter   Parameter Meaning

0           Erase from the active position to the end of the screen
1           Erase from start of the screen to the active position
2           Erase all of the display

Terminal ( et xterm ) ajoute :

3           Erase the scroll-back (aka “Saved Lines”)

Notez que cette opération n'efface que le scroll-back, 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 scroll-back avec la commande shell suivante : clear && printf '\e[3J'

(Le clear recherche la séquence appropriée pour effacer l'écran du terminal actuel, mais la séquence d'échappement "effacer scroll-back" est personnalisée et doit être codée en dur. Si vous mettez cette commande dans un shell script dont vous n'êtes pas certain qu'il ne sera jamais exécuté qu'avec Terminal, vous devez vérifier que $TERM_PROGRAM es Apple_Terminal avant de l'envoyer).

34voto

MattiSG Points 2034

K, raccourci vers "View > Clear scrollback".

UPDATE : Cette opération peut être automatisée 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 à ce que vous voulez, ou le stocker dans une fonction dans votre ~/.profile login script :)

Par sécurité, pour pouvoir l'utiliser même en arrière-plan sans risquer d'envoyer une touche à une mauvaise application frontale, je conseille de l'entourer du test suivant :

if application "Terminal" is frontmost

ce 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, s'est correctement échappé et alias ed, se termine en :

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

Et voici votre nouvelle clear !  :)

31voto

Mike Points 1018

Voici un code qui fonctionne à la fois pour le terminal de MacOS et pour iTerm2. Il n'est pas nécessaire que la fenêtre soit au premier plan (contrairement à certaines solutions AppleScript).

printf '\e[2J\e[3J\e[H'

Comment cela fonctionne

Cela utilise une série de Séquences d'échappement ANSI . Chaque séquence d'échappement ANSI commence par le caractère "ESC" (escape), un caractère ASCII non imprimable (ce qui signifie qu'il n'a pas de représentation glyphique visuelle comme 1 o a ). printf peut imprimer un tel caractère en utilisant \e (ou par sa valeur octale \033 ou sa valeur hexadécimale \x1B ).

Un type de séquence d'échappement ANSI sont les Commandes "Introducteur de séquence de contrôle". . Ils commencent tous par la forme ESC CSIESC est le caractère d'échappement que nous venons de mentionner, et CSI est la valeur [ (ou 0x5B en hexagone)

J'utilise le \e[ parce qu'elle est plus courte que \x1B\x5B et plus facile à lire.

Comme nous pouvons le voir, il y a deux séquences d'échappement ANSII ici, chacune d'entre elles étant la forme "introducteur de séquence de contrôle", appelée avec des arguments différents. Sachant cela, nous pouvons diviser la chaîne de caractères en ses 3 parties :

  1. \e[2J

    • Le début d'une séquence d'échappement ( \e ), contenant une séquence de contrôle ( [ ) avec l'argument 2J
    • Il s'agit d'une instance de la commande "ED - Erase in Display", qui a la forme suivante CSI n J
    • El n La valeur est fixée à 3 dans ce cas, qui invoque la deuxième variante :

    Si n es 2 , efface tout l'écran (et déplace le curseur en haut à gauche sur DOS ANSI.SYS).

  2. \e[3J

    • Le début d'une séquence d'échappement ( \e ), contenant une séquence de contrôle ( [ ) avec l'argument 3J

    • Il s'agit d'une instance de la commande "ED - Erase in Display", qui a la forme suivante CSI n J

    • El n La valeur est fixée à 3 dans ce cas, qui invoque la troisième variante :

      Si n es 3 , efface tout l'écran et supprime toutes les lignes enregistrées dans le tampon de défilement (cette fonction a été ajoutée pour xterm et est prise en charge par d'autres applications de terminal)."

    • Malgré la description de Wikipedia, il semble que cela n'efface pas réellement l'écran dans iTerm et le terminal par défaut, seul le tampon de retour de défilement est effacé. D'où la nécessité de l'option \e[2J ci-dessus.

  3. \e[H :

    • Le début d'une séquence d'échappement ( \e ), contenant une séquence de contrôle ( [ ) avec l'argument H .

    • Il s'agit d'une instance de la commande "CUP - Cursor Position", qui a pour forme CSI n ; m H ,

      Déplace le curseur à la ligne n , colonne m . Les valeurs sont basées sur 1, et ont pour valeur par défaut 1 (coin supérieur gauche) si elle est omise. Une séquence telle que CSI ;5H est un synonyme de CSI 1;5H ainsi que CSI 17;H est la même chose que CSI 17H y CSI 17;1H

    • Cela aurait pu être écrit plus explicitement comme \e[1;1H

Fait amusant

Ces séquences de contrôle sont en fait la façon dont le système intégré clear ( /usr/bin/clear ) fonctionne. Tout ce qu'elle semble faire est de produire une sortie, que nous pouvons inspecter avec xxd :

$ clear | xxd
00000000: 1b5b 481b 5b32 4a                        .[H.[2J

Nous pouvons recréer la même sortie avec printf '\e[H \e2J' :

$ printf '\e[H \e2J' | xxd
00000000: 1b5b 4820 1b32 4a                        .[H .2J

Remarquez qu'ils n'utilisent pas \e3J d'où la raison pour laquelle clear efface seulement l'écran, mais pas le scrollback.

-1voto

MemCtrl Points 9

Je ne suis pas sûr que cela fonctionne sous OS X mais pour Linux la meilleure option semble être tput reset .

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X