¿Cómo restablezco el scrollback en la terminal mediante un comando de shell?

41

Al usar Terminal.app, puede borrar la pantalla usando el shell incorporado clearo presionando ^+ L(Control-L).

Sin embargo, todo esto hace que el contenido actual de la pantalla retroceda una altura de pantalla y restablezca el cursor / entrada en la primera línea. Lo que significa que aún puede desplazarse hacia atrás y verlo.

Lo que también puede hacer es restablecer todo el desplazamiento hacia atrás presionando + K(Comando-K).

Después de haber hecho esto, no puede desplazarse hacia atrás en absoluto.

En ciertas situaciones (en particular, antes de ejecutar screeno vim), me gustaría restablecer el desplazamiento hacia atrás antes de que el comando realmente se ejecute.

¿Hay un comando (como clear) que se implementa en OS X que me permite hacer esto? Dada la existencia de pbcopyy pbpaste, estoy pensando que podría existir algo similar que me permita hacer esto.

Jason Salaz
fuente
Como dice Chris Pages answer en Terminal use command: clear && printf '\e[3J' (¡Ha seleccionado la respuesta incorrecta como respuesta correcta!)
Cyborg

Respuestas:

57

El terminal admite una extensión de la secuencia de escape ED (Borrar en pantalla) para borrar el desplazamiento hacia atrás. También es compatible con xterm. El comando ED, descrito en el manual VT100 , acepta estos valores para el parámetro Ps:

ESC [Ps J

Parámetro Parámetro Significado

0 Borrar desde la posición activa hasta el final de la pantalla
1 Borrar desde el inicio de la pantalla a la posición activa
2 Borrar toda la pantalla

Terminal ( y xterm ) agrega:

3 Borrar el desplazamiento hacia atrás (también conocido como "Líneas guardadas")

Tenga en cuenta que esto solo borra el desplazamiento hacia atrás, no la pantalla. Esto le permite borrar uno u otro, o ambos enviando dos secuencias de escape.

Por ejemplo, puede borrar la pantalla y el desplazamiento hacia atrás con el siguiente comando de shell: clear && printf '\e[3J'

(El clearcomando busca la secuencia apropiada para borrar la pantalla del terminal actual, pero la secuencia de escape "borrar desplazamiento hacia atrás" es personalizada y debe estar codificada. Si coloca esto en un script de shell que no conoce con certeza solamente nunca se ejecutará con la terminal, debe comprobar que $TERM_PROGRAMes Apple_Terminalantes de enviarlo.)

Chris Page
fuente
44
¡Esto es mucho más rápido que el osascript!
Sergei
3
Esta es una respuesta mucho mejor. Entonces, para hacer esto permanente, agregue a su ~ / .bash_profile: alias clear="clear && printf '\e[3J'"
Tom
1
Puse este script en mi RUTA:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV
2
@WalkerHaleIV ¿Por qué está creando un ejecutable en lugar de simplemente imprimir la secuencia de escape en stdout?
Chris Page
1
$ TERM_APPLICATION debería ser $ TERM_PROGRAM
pbatey
30

⌘K, acceso directo a "Ver> Borrar desplazamiento hacia atrás".

ACTUALIZACIÓN : Esto se puede automatizar con AppleScript mediante el siguiente comando:

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

... que, por supuesto, puede aliashacer lo que quiera, o almacenar en una función en su ~/.profilescript de inicio de sesión :)

Sin embargo, como seguridad, para poder usar esto incluso en segundo plano sin correr el riesgo de emitir una pulsación de tecla en una aplicación frontal incorrecta, aconsejaría que lo rodee con la siguiente prueba:

if application "Terminal" is frontmost

... que nos da el siguiente código:

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

... que a su vez, correctamente escapado y aliased, termina en:

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

¡Y aquí está tu nuevo clear! :)

MattiSG
fuente
El punto aquí es que me gustaría configurar algo en el entorno de mi shell para que cuando ejecute un comando (digamos vim), el shell ejecute el "reinicio de desplazamiento" antes de ejecutar vim. Programático, no interactivo.
Jason Salaz el
1
@JasonSalaz Ok, no entendí eso, lo siento. Código agregado para eso.
MattiSG
1
@JasonSalaz si esta respuesta resolvió su problema, recuerde validarlo. Si no fue así, contáctenos en los comentarios :) Recuerde, los usuarios del futuro se lo agradecerán;)
MattiSG
Ese cómic es sobre mí, ya sabes. Hago un programa en Denver, CO. (No, en realidad no, sería una locura si lo fuera).
Jason Salaz el
Esto no funciona para mi. Por lo que puedo decir, es el equivalente a escribir clear; es decir, borra la pantalla, pero aún puedo desplazarme hacia atrás. Golpear Command Kfunciona normalmente.
Zev Eisenberg
7

Aquí hay un código que funciona tanto para la Terminal de macOS como para iTerm2. Tampoco necesita que la ventana esté en primer plano.

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

Cómo funciona

Esta es una composición de 3 secuencias de escape ANSI , particularmente los comandos "Introductor de secuencia de control" .

\033es una secuencia de escape que codifica el punto de código para el personaje que representa. El inicio 0indica que el resto de la secuencia codifica un valor octal, en este caso, 33en octal. El valor decimal de eso es 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). En ASCII, el punto de código 27es el carácter "ESC" (escape).

CSIlos comandos comienzan con ESC [aka \033[. Sabiendo esto, podemos dividir la cuerda en sus 3 partes.

  1. CSI 2 J
    • Esta es una instancia del comando "ED - Borrar en pantalla", que tiene la forma CSI n J
    • El nvalor se establece 2en este caso, que invoca la segunda variante: "Si n es 2, borra toda la pantalla (y mueve el cursor a la esquina superior izquierda en DOS ANSI.SYS)".
  2. CSI 3 J:
    • Esta es una instancia del comando "ED - Borrar en pantalla", que tiene la forma CSI n J
    • El nvalor se establece 3en este caso, que invoca la tercera variante: "Si n es 3, borre toda la pantalla y elimine todas las líneas guardadas en el búfer de desplazamiento (esta característica se agregó para xterm y es compatible con otras aplicaciones de terminal)".
  3. CSI 1 ; 1 H:
    • Esta es una instancia del comando "ED - Borrar en pantalla", que tiene la forma CSI n ; m H

      Mueve el cursor a fila n, columna m. Los valores se basan en 1 y, por omisión, son 1 (esquina superior izquierda) si se omiten. Una secuencia tal como CSI ;5Hes un sinónimo de CSI 1;5H, así como CSI 17;Hes el mismo que CSI 17H yCSI 17;1H

    • Los valores ny mse establecen en 1, lo que significa que este comando mueve el cursor a la esquina superior izquierda.
Alexander - Restablece a Monica
fuente
¿Puedo preguntarte de dónde lo obtuviste? +1 de mi parte - funciona de todos modos
rbrtl
1
No lo recuerdo, pero es una composición de estos: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Restablece a Monica
1
Parece que es " CSI n J" (donde n = 2) + " CSI n J" (donde n = 3) + " CSI n ; m H" (donde n, m = 1, 1), que se traduce como: "ED - Borrar en pantalla" (variante 2), "ED - Borrar en pantalla" (variante 3), "CUP - Posición del cursor" (moviéndose a 1, 1)
Alexander - Restablecer a Monica