Wie setze ich den Scrollback im Terminal über einen Shell-Befehl zurück?

41

Wenn Sie Terminal.app verwenden, können Sie den Bildschirm mithilfe der integrierten Shell clearoder durch Drücken von ^+ L( Strg -L) löschen .

Dies reicht jedoch aus, um den aktuellen Bildschirminhalt um eine Bildschirmhöhe nach hinten zu schieben und den Cursor / die Eingabe in der ersten Zeile zurückzusetzen. Das heißt, Sie können immer noch zurückblättern und es sehen.

Sie können auch den gesamten Bildlauf zurücksetzen, indem Sie + K(Befehlstaste-K) drücken .

Danach können Sie überhaupt nicht mehr zurückblättern.

In bestimmten Situationen (insbesondere vor dem Ausführen von screenoder vim) möchte ich den Bildlauf zurücksetzen, bevor der Befehl tatsächlich ausgeführt wird.

Gibt es einen Befehl (wie clear), der in OS X implementiert ist und der es mir ermöglicht, dies zu tun? Angesichts der Existenz von pbcopyund pbpastedenke ich, dass etwas Ähnliches existieren könnte, das es mir ermöglicht, dies zu tun.

Jason Salaz
quelle
Wie Chris Pages Antwort im Terminal Befehl sagt: clear && printf '\e[3J' (Sie haben die falsche Antwort als richtige Antwort ausgewählt!)
Cyborg

Antworten:

57

Das Terminal unterstützt eine Erweiterung der Escape-Sequenz ED (Erase in Display), um das Zurückblättern zu löschen. Es wird auch von xterm unterstützt. Der im VT100-Handbuch beschriebene ED-Befehl akzeptiert die folgenden Werte für den Ps-Parameter:

ESC [Ps J

Parameter Parameter Bedeutung

0 Löschen von der aktiven Position bis zum Ende des Bildschirms
1 Löschen Sie vom Start des Bildschirms zur aktiven Position
2 Löschen Sie die gesamte Anzeige

Terminal ( und xterm ) fügt hinzu:

3 Löschen Sie den Bildlauf zurück (auch als "Gespeicherte Zeilen" bezeichnet)

Beachten Sie, dass dadurch nur das Zurückblättern und nicht der Bildschirm gelöscht wird. Auf diese Weise können Sie den einen oder den anderen oder beide löschen, indem Sie zwei Escape-Sequenzen senden.

Beispielsweise können Sie den Bildschirm und den Bildlauf zurück mit dem folgenden Shell-Befehl löschen: clear && printf '\e[3J'

(Mit dem clearBefehl wird die entsprechende Sequenz zum Löschen des Bildschirms für das aktuelle Terminal gesucht. Die Escape-Sequenz zum Löschen des Bildlaufs ist jedoch benutzerdefiniert und muss fest codiert werden. Wenn Sie dies in ein Shell-Skript einfügen, das Sie nicht kennen für bestimmte wird mit Terminal immer nur ausgeführt werden, sollten Sie überprüfen , dass $TERM_PROGRAMist Apple_Terminalvor dem Senden.)

Chris Page
quelle
4
Das ist so viel schneller als Javascript!
Sergei
3
Das ist eine viel bessere Antwort. Um dies dauerhaft zu machen, fügen Sie Folgendes zu Ihrem ~ / .bash_profil hinzu: alias clear="clear && printf '\e[3J'"
Tom
1
Ich habe dieses Skript in meinen PATH geschrieben:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV
2
@WalkerHaleIV Warum erstellen Sie eine ausführbare Datei, anstatt nur die Escape-Sequenz in stdout zu drucken?
Chris Seite
1
$ TERM_APPLICATION sollte $ TERM_PROGRAM sein
pbatey
30

⌘K, Verknüpfung zu „Ansicht> Bildlauf zurücksetzen“.

UPDATE : Dies kann mit AppleScript durch den folgenden Befehl automatisiert werden:

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

... die du natürlich aliasnach Belieben hinzufügen oder in einer Funktion in deinem ~/.profileLogin-Skript speichern kannst :)

Um dies aus Sicherheitsgründen auch im Hintergrund nutzen zu können, ohne einen Tastendruck auf eine falsche Front-App zu riskieren, würde ich Folgendes empfehlen:

if application "Terminal" is frontmost

… Was uns folgenden Code gibt:

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

… Was wiederum, richtig geflüchtet und aliasbearbeitet, endet in:

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

Und hier ist dein neues clear! :)

MattiSG
quelle
Der Punkt hier ist, dass ich etwas in der Umgebung meiner Shell einrichten möchte, so dass, wenn ich einen Befehl (sagen wir vim) ausführe, die Shell den "Scrollback-Reset" ausführt, bevor vim ausgeführt wird. Programmatisch, nicht interaktiv.
Jason Salaz
1
@JasonSalaz Ok, habe das nicht verstanden, sorry. Code dafür hinzugefügt.
MattiSG
1
@JasonSalaz Wenn diese Antwort Ihr Problem gelöst hat, denken Sie bitte daran, sie zu validieren. Wenn nicht,
melden
In diesem Comic geht es um mich. Ich programmiere in Denver, CO. (Nein, nicht wirklich, es wäre aber verrückt, wenn es so wäre.)
Jason Salaz
Das funktioniert bei mir nicht. Soweit ich das beurteilen kann, entspricht es dem Tippen clear. Das heißt, der Bildschirm wird gelöscht, aber ich kann immer noch zurückblättern. Schlagen Command Kfunktioniert normal.
Zev Eisenberg
7

Hier ist der Code, der sowohl für macOS 'Terminal als auch für iTerm2 funktioniert. Das Fenster muss auch nicht im Vordergrund stehen.

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

Wie es funktioniert

Dies ist eine Zusammenstellung von 3 ANSI-Escape-Sequenzen , insbesondere "Control Sequence Introducer" -Befehlen .

\033ist eine Escape-Sequenz, die den Codepunkt für das von ihr dargestellte Zeichen fest codiert. Das Anführen 0zeigt an, dass der Rest der Sequenz einen Oktalwert codiert, in diesem Fall 33in Oktal. Der Dezimalwert davon ist 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). In ASCII ist der Codepunkt 27das "ESC" -Zeichen (Escape-Zeichen).

CSIBefehle beginnen mit ESC [, aka \033[. Wenn wir das wissen, können wir die Saite in drei Teile aufteilen.

  1. CSI 2 J
    • Dies ist eine Instanz des Befehls "ED - Erase in Display", der die Form hat CSI n J
    • Der nWert wird 2in diesem Fall auf gesetzt, wodurch die zweite Variante aufgerufen wird: "Wenn n 2 ist, wird der gesamte Bildschirm gelöscht (und der Cursor in DOS ANSI.SYS nach links oben bewegt)."
  2. CSI 3 J:
    • Dies ist eine Instanz des Befehls "ED - Erase in Display", der die Form hat CSI n J
    • Der nWert wird 3in diesem Fall auf gesetzt, wodurch die dritte Variante aufgerufen wird: "Wenn n 3 ist, wird der gesamte Bildschirm gelöscht und alle im Bildlaufpuffer gespeicherten Zeilen werden gelöscht (diese Funktion wurde für xterm hinzugefügt und wird von anderen Terminalanwendungen unterstützt)."
  3. CSI 1 ; 1 H:
    • Dies ist eine Instanz des Befehls "ED - Erase in Display", der die Form hat CSI n ; m H

      Bewegt den Cursor zur Zeile noder Spalte m. Die Werte sind 1-basiert und standardmäßig 1 (linke obere Ecke), wenn sie nicht angegeben werden. Eine Sequenz wie CSI ;5Hist ein Synonym für CSI 1;5Hund CSI 17;Hist dasselbe wie CSI 17H undCSI 17;1H

    • Die Werte nund msind beide auf gesetzt 1, was bedeutet, dass dieser Befehl den Cursor in die linke obere Ecke bewegt.
Alexander - Setzen Sie Monica wieder ein
quelle
Kann ich Sie fragen, woher Sie es haben? +1 von mir - es funktioniert trotzdem
rbrtl
1
Ich erinnere mich nicht, aber es ist eine Komposition von diesen: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Reinstate Monica
1
Sieht so aus, als wäre es " CSI n J" (wo n = 2) + " CSI n J" (wo n = 3) + " CSI n ; m H" (wo n, m = 1, 1), was übersetzt bedeutet: "ED - Erase in Display" (Variante 2), "ED - Erase in Display" (Variante 3), "CUP - Cursor Position" (Verschieben auf 1, 1)
Alexander - Reinstate Monica