Jak zresetować przewijanie w terminalu za pomocą polecenia powłoki?

41

Korzystając z Terminal.app, możesz wyczyścić ekran, używając wbudowanej powłoki clearlub naciskając ^+ L(Control-L).

Wszystko to jednak powoduje przesunięcie bieżącej zawartości ekranu o jedną wysokość do tyłu i zresetowanie kursora / wejścia w pierwszym wierszu. Oznacza to, że nadal możesz przewinąć do tyłu i go zobaczyć.

Możesz także zresetować całe przewijanie do tyłu, naciskając + K(Command-K).

Po wykonaniu tej czynności nie można w ogóle przewinąć do tyłu.

W niektórych sytuacjach (zwłaszcza przed uruchomieniem screenlub vim) chciałbym zresetować przewijanie do tyłu przed wykonaniem polecenia.

Czy clearw systemie OS X istnieje polecenie (takie jak ), które pozwala mi to zrobić? Biorąc pod uwagę istnienie pbcopyi pbpaste, myślę, że może istnieć coś podobnego, co pozwoli mi to zrobić.

Jason Salaz
źródło
Jak mówi Chris Pages w poleceniu Użyj terminala: clear && printf '\e[3J' (Wybrałeś złą odpowiedź jako poprawną!)
Cyborg

Odpowiedzi:

57

Terminal obsługuje rozszerzenie sekwencji ucieczki ED (Erase in Display), aby usunąć przewijanie do tyłu. Obsługiwany jest również przez xterm. Polecenie ED, opisane w instrukcji VT100 , przyjmuje następujące wartości parametru Ps:

ESC [Ps J

Parametr Parametr Znaczenie

0 Usuń z aktywnej pozycji do końca ekranu
1 Usuń od początku ekranu do aktywnej pozycji
2 Usuń cały wyświetlacz

Terminal ( i xterm ) dodaje:

3 Usuń przewijanie (aka „Saved Lines”)

Pamiętaj, że powoduje to jedynie przewinięcie do tyłu, a nie ekran. Umożliwia to usunięcie jednego lub drugiego lub obu poprzez wysłanie dwóch sekwencji ucieczki.

Na przykład możesz wyczyścić ekran i przewinąć do tyłu za pomocą następującego polecenia powłoki: clear && printf '\e[3J'

( clearPolecenie wyszukuje odpowiednią sekwencję do wyczyszczenia ekranu dla bieżącego terminala, ale sekwencja ucieczki „kasowanie przewijania wstecz” jest niestandardowa i musi być zakodowana na stałe. Jeśli umieścisz ją w skrypcie powłoki, którego nie znasz na pewno będzie zawsze tylko uruchomić z terminalu, należy sprawdzić, czy $TERM_PROGRAMjest Apple_Terminalprzed wysłaniem go.)

Chris Page
źródło
4
To jest o wiele szybsze niż osascript!
Siergiej
3
To jest znacznie lepsza odpowiedź. Tak więc, aby to było trwałe, dodaj do swojego ~ / .bash_profile: alias clear="clear && printf '\e[3J'"
Tom
1
Umieszczam ten skrypt w ŚCIEŻCE:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV
2
@WalkerHaleIV Dlaczego tworzysz plik wykonywalny zamiast drukować sekwencję ucieczki na standardowe wyjście?
Chris Page
1
$ TERM_APPLICATION powinno być $ TERM_PROGRAM
pbatey
30

⌘K, skrót do „View> Clear scrollback”.

AKTUALIZACJA : Można to zautomatyzować za pomocą AppleScript, wykonując następujące polecenie:

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

… Które możesz oczywiście aliaszrobić w dowolnym miejscu lub zapisać w funkcji w ~/.profileskrypcie logowania :)

Jednak ze względów bezpieczeństwa, aby móc używać tego nawet w tle, nie ryzykując naciśnięcia klawisza niewłaściwej aplikacji frontowej, radzę otoczyć go następującym testem:

if application "Terminal" is frontmost

… Co daje nam następujący kod:

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

… Który z kolei, odpowiednio uciekł i aliaswydał, kończy się na:

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

A oto twój nowy clear! :)

MattiSG
źródło
Chodzi o to, że chciałbym skonfigurować coś w środowisku mojej powłoki, aby po uruchomieniu polecenia (powiedzmy vim) powłoka wykonała „resetowanie przewijania” przed uruchomieniem vima. Programowy, nie interaktywny.
Jason Salaz
1
@JasonSalaz Ok, nie rozumiem, przepraszam. Dodano do tego kod.
MattiSG,
1
@JasonSalaz, jeśli ta odpowiedź rozwiązała problem, pamiętaj o jej zweryfikowaniu. Jeśli tak się nie stanie, wróć do nas w komentarzach :) Pamiętaj, że użytkownicy z przyszłości będą Ci wdzięczni;)
MattiSG,
Ten komiks dotyczy mnie. Programuję w Denver, Kolorado. (Nie, naprawdę nie byłoby szalone, gdyby tak było).
Jason Salaz,
To mi nie działa. O ile wiem, jest to odpowiednik pisania clear; to znaczy, czyści ekran, ale wciąż mogę przewijać do tyłu. Uderzenie Command Kdziała normalnie.
Zev Eisenberg,
7

Oto kod, który działa zarówno dla terminala macOS, jak i iTerm2. Okno nie musi również znajdować się na pierwszym planie.

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

Jak to działa

Jest to kompozycja 3 sekwencji ucieczkowych ANSI , szczególnie poleceń „Control Sequence Introducer” .

\033jest sekwencją specjalną, która koduje punkt kodowy znaku, który reprezentuje. Na początku 0wskazuje, że reszta sekwencji koduje wartość ósemkową, w tym przypadku 33ósemkową. Wartość dziesiętna to 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). W ASCII punktem kodowym 27jest znak „ESC” (escape).

CSIpolecenia zaczynają się od ESC [, aka \033[. Wiedząc o tym, możemy podzielić sznurek na 3 części.

  1. CSI 2 J
    • Jest to przykład komendy „ED - Erase in Display”, która ma postać CSI n J
    • W tym przypadku nustawiana jest wartość 2, która wywołuje drugi wariant: „Jeśli n wynosi 2, wyczyść cały ekran (i przesuń kursor do lewego górnego rogu na DOS ANSI.SYS)”.
  2. CSI 3 J:
    • Jest to przykład komendy „ED - Erase in Display”, która ma postać CSI n J
    • W tym przypadku nustawiana jest wartość 3, która wywołuje trzeci wariant: „Jeśli n wynosi 3, wyczyść cały ekran i usuń wszystkie wiersze zapisane w buforze przewijania (ta funkcja została dodana dla xterm i jest obsługiwana przez inne aplikacje terminalowe)”.
  3. CSI 1 ; 1 H:
    • Jest to przykład komendy „ED - Erase in Display”, która ma postać CSI n ; m H

      Przesuwa kursor do wiersza n, kolumny m. Wartości są oparte na 1 i domyślnie wynoszą 1 (lewy górny róg), jeśli zostaną pominięte. Sekwencja taka jak CSI ;5Hjest zarówno synonimem, CSI 1;5Hjak i CSI 17;Hjest taka sama jak CSI 17H iCSI 17;1H

    • Wartości ni msą ustawione na 1, co oznacza, że ​​to polecenie przesuwa kursor do lewego górnego rogu.
Alexander - Przywróć Monikę
źródło
Czy mogę zapytać, skąd go masz? +1 ode mnie - i tak działa
rbrtl
1
Nie pamiętam, ale jest to ich skład: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Przywróć Monikę
1
Wygląda na to, że to „ CSI n J” (gdzie n = 2) + ” CSI n J„ (gdzie n = 3) + ” CSI n ; m H” (gdzie n, m = 1, 1), co przekłada się na: „ED - Usuń z wyświetlacza” (wariant 2), „ED - Erase in Display” (wariant 3), „CUP - Cursor Position” (przejście do 1, 1)
Alexander - Przywróć Monikę