Come resettare lo scrollback nel terminale tramite un comando shell?


41

Quando si utilizza Terminal.app, è possibile cancellare lo schermo utilizzando la shell incorporata clearo premendo ^+ L(Control-L).

Tuttavia, tutto ciò che fa è riportare il contenuto dello schermo corrente indietro di un'altezza dello schermo e reimpostare il cursore / input sulla prima riga. Ciò significa che puoi ancora scorrere indietro e vederlo.

Quello che sei anche in grado di fare, è ripristinare l'intero scrollback premendo + K(Command-K).

Dopo aver fatto questo, non è possibile scorrere indietro.

In determinate situazioni (in particolare, prima di eseguire screeno vim), vorrei ripristinare lo scorrimento indietro prima che il comando venga effettivamente eseguito.

Esiste un comando (come clear) implementato in OS X che mi consente di farlo? Data l'esistenza di pbcopye pbpaste, sto pensando che potrebbe esistere qualcosa di simile che mi permetterà di farlo.


Come dice Chris Pages nel Terminale, usa il comando: clear && printf '\e[3J' (Hai selezionato la risposta sbagliata come risposta corretta!)
Cyborg

Risposte:


57

Il terminale supporta un'estensione della sequenza di escape ED (Erase in Display) per cancellare lo scroll-back. È anche supportato da xterm. Il comando ED, descritto nel manuale VT100 , accetta questi valori per il parametro Ps:

ESC [Ps J

Parametro Parametro Significato

0 Cancella dalla posizione attiva alla fine dello schermo
1 Cancella dall'inizio dello schermo alla posizione attiva
2 Cancella tutto il display

Terminal ( e xterm ) aggiunge:

3 Cancella lo scroll-back (aka "Linee salvate")

Nota che questo cancella solo lo scroll-back, non lo schermo. Ciò consente di cancellare l'uno o l'altro o entrambi inviando due sequenze di escape.

Ad esempio, è possibile cancellare lo schermo e lo scorrimento indietro con il seguente comando shell: clear && printf '\e[3J'

(Il clearcomando cerca la sequenza appropriata per cancellare lo schermo per il terminale corrente, ma la sequenza di escape "cancella scroll-back" è personalizzata e deve essere hardcoded. Se lo metti in uno script shell che non conosci per certo verrà eseguito sempre con Terminal, è necessario verificare che $TERM_PROGRAMsia Apple_Terminalprima di inviarlo.)


4
Questo è molto più veloce di osascript!
Sergei,

3
Questa è una risposta molto migliore. Quindi, per renderlo permanente, aggiungi al tuo ~ / .bash_profile: alias clear="clear && printf '\e[3J'"
Tom

1
Ho inserito questa sceneggiatura nel mio PERCORSO:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV

2
@WalkerHaleIV Perché stai creando un eseguibile invece di stampare semplicemente la sequenza di escape su stdout?
Chris Page

1
$ TERM_APPLICATION dovrebbe essere $ TERM_PROGRAM
pbatey il

30

⌘K, scorciatoia per "Visualizza> Cancella scorrimento".

AGGIORNAMENTO : Questo può essere automatizzato con AppleScript con il seguente comando:

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

... che puoi ovviamente aliasper quello che vuoi, o memorizzare in una funzione nel tuo ~/.profilescript di accesso :)

Per sicurezza, tuttavia, per poterlo utilizzare anche in background senza rischiare di rilasciare una sequenza di tasti a un'app frontale errata, consiglierei di circondarla con il seguente test:

if application "Terminal" is frontmost

... che ci dà il seguente codice:

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

... che a sua volta, correttamente fuggito ed aliased, termina in:

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

Ed ecco il tuo nuovo clear! :)


Il punto qui è che vorrei impostare qualcosa nell'ambiente della mia shell in modo che quando eseguo un comando (diciamo vim), la shell esegua il "ripristino dello scrollback" prima di eseguire vim. Programmatico, non interattivo.
Jason Salaz,

1
@JasonSalaz Ok, non l'ho capito, scusa. Codice aggiunto per quello.
MattiSG,

1
@JasonSalaz se questa risposta ha risolto il tuo problema, ricorda di convalidarlo. In caso contrario, torna da noi nei commenti :) Ricorda, gli utenti del futuro ti ringrazieranno;)
MattiSG

Quel fumetto riguarda me, lo sai. Faccio un programma a Denver, CO. (No, non proprio, sarebbe folle se fosse, comunque.)
Jason Salaz

Questo non funziona per me. Per quanto ne so, è l'equivalente della digitazione clear; cioè cancella lo schermo, ma posso ancora scorrere indietro. Colpire Command Kfunziona normalmente.
Zev Eisenberg,

7

Ecco il codice che funziona sia per il terminale macOS 'sia per iTerm2. Non ha nemmeno bisogno che la finestra sia in primo piano.

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

Come funziona

Questa è una composizione di 3 sequenze di escape ANSI , in particolare i comandi "Control Sequence Introducer" .

\033è una sequenza di escape che codifica il punto di codice per il carattere che rappresenta. Il segno iniziale 0indica che il resto della sequenza codifica un valore ottale, in questo caso, 33in ottale. Il valore decimale è 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). In ASCII, il punto di codice 27è il carattere "ESC" (escape).

CSIi comandi iniziano con ESC [, aka \033[. Sapendo questo, possiamo dividere la stringa nelle sue 3 parti.

  1. CSI 2 J
    • Questa è un'istanza del comando "ED - Erase in Display", che ha il modulo CSI n J
    • Il nvalore è impostato su 2in questo caso, che invoca la seconda variante: "Se n è 2, cancella l'intero schermo (e sposta il cursore in alto a sinistra su DOS ANSI.SYS)."
  2. CSI 3 J:
    • Questa è un'istanza del comando "ED - Erase in Display", che ha il modulo CSI n J
    • Il nvalore è impostato su 3in questo caso, che invoca la terza variante: "Se n è 3, cancella l'intero schermo ed elimina tutte le righe salvate nel buffer di scorrimento (questa funzione è stata aggiunta per xterm ed è supportata da altre applicazioni terminali)".
  3. CSI 1 ; 1 H:
    • Questa è un'istanza del comando "ED - Erase in Display", che ha il modulo CSI n ; m H

      Sposta il cursore su riga n, colonna m. I valori sono basati su 1 e il valore predefinito è 1 (angolo in alto a sinistra) se omesso. Una sequenza come CSI ;5Hè sinonimo di CSI 1;5Hnonché CSI 17;Hè la stessa di CSI 17H eCSI 17;1H

    • I valori ne msono entrambi impostati su 1, il che significa che questo comando sposta il cursore nell'angolo in alto a sinistra.

Posso chiederti da dove l'hai preso? +1 da parte mia - funziona comunque
rbrtl

1
Non ricordo, ma è una composizione di questi: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Reinstate Monica

1
Sembra che sia " CSI n J" (dove n = 2) + " CSI n J" (dove n = 3) + " CSI n ; m H" (dove n, m = 1, 1), che si traduce in: "ED - Erase in Display" (variante 2), "ED - Erase in Display" (variante 3), "CUP - Cursor Position" (passaggio a 1, 1)
Alexander - Ripristina Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.