El comportamiento extraño del comando Bash clear elimina el búfer de desplazamiento hacia atrás.

El comportamiento extraño del comando Bash clear elimina el búfer de desplazamiento hacia atrás.

Cada vez que ejecuto clear en mi terminal, elimina el búfer de desplazamiento hacia atrás desde la parte superior de la pantalla hasta la línea actual. Lo probé en xterm, st y urxvt y el problema persiste. ¿Hay alguna manera de cambiar el comportamiento de borrar para que no toque el búfer de retroceso?

Respuesta1

El comentario "desde la parte superior de la pantalla hasta la línea actual" es ambiguo. Si te referías desde la parte superior de laparte visiblede la pantalla, ese no es eldesplazarse hacia atrás. El retroceso de una terminal es la parte que puede ver solo usando la barra de desplazamiento (o teclas adecuadas como Mayús hacia arriba).

Secuencias de control XTermdocumenta la secuencia de escape relevante:

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).

La capacidad de descripción del terminal clearutiliza el penúltimo, por ejemplo,

clear=\E[H\E[2J

para colocar el cursor en la parte superior izquierda y luego borrar toda la pantalla (visible). Túpodríautilizar elBorrar debajo, pero eso no se utiliza en la descripción del terminal.

Refiriéndose a la limpieza deldesplazarse hacia atrás: Esa es una característica específica del terminal, originalmente una secuencia de escape en xterm (1999, documentado enctlseqs.mspero no mencionado en los cambios) y posterior (2011) implementado como una extensión para la consola Linux y la descripción del terminal correspondiente. La base de datos del terminal lo enumera como un"extensiones varias".

Actualmente, estas descripciones de terminales tienen la característica:

  • linux3.0(el valor predeterminado actual para "linux")
  • masilla
  • xterm+básico(un componente básico utilizado en la mayoría de las variantes de "xterm")

Si es compatible con similares a xterm como VTE, se tendría que responder mediante pruebas (no hay documentación útil para VTE o Konsole).

Si prefiere no utilizar la extensión, puede eliminar laE3capacidad de la descripción del terminal que utiliza, por ejemplo,

infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo

Sugerí usar las opciones.-1y-xpara simplificar el formato y mostrar la característica a cambiar. El ejemplo dado enhttps://ghostbin.com/paste/kfsbjes consistente con ese consejo:

  • el nombre de la ruta /home/flowerpick/.terminfo/x/xtermsería utilizado por ncurses
  • las capacidades AXy XTson capacidades extendidas (como E3), que se muestran con la -xopción.

Si está utilizando más de un tipo de terminal, deberá hacer esto para cada uno (valor de $TERM), y el cambio solo se aplica a la máquina donde ejecuta clear. Las primeras líneas del infocmpresultado muestran en cuál está trabajando:

#   Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),

Por ejemplo, uxrvtestablece $TERMalgo como rxvt-unicode, produciendo líneas como esta en infocmp:

#       Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode       
rxvt-unicode|rxvt-unicode terminal (X Window System),

El stprograma usa xterm(o posiblemente xterm-256color), aunque ha pasado un tiempo desde que vi una copia deesoque funcionó lo suficientemente bien como para comentar.

Por cierto, tupodríaTengo un alias para clearel cual se envía la secuencia de escape dada (ignorando la descripción del terminal), pero nadie ha informado de esto.

Si desea "borrar arriba", no es tan sencillo como escribir "borrar". El escape \033[1Jse borra desde la esquina superior izquierda hasta la posición actual del cursor. Podrías crear un script que haga esto, para borrar solo ellíneasencima de su cursor actual:

  • utilizar el informe de posición del cursor para encontrar la fila/columna en la que se encuentra actualmente el cursor, y
  • si el cursor no está en la primera línea (guardando esa posición), mueva el cursor hacia arriba una línea y luego (con la hpasecuencia) muevabienun número grande,
  • emitir el "claro arriba", y
  • volver a la posición original usando cup(direccionamiento del cursor).

Esa parte con el informe de posición del cursor no parece funcionar en (por ejemplo) un enlace de línea de lectura, así que sugerí un script. Podría crear un enlace que utilizara las capacidades del cursor para guardar/restaurar si no existiera el problema de estar en la primera línea.

Respuesta2

Tuve el mismo problema y agregar un alias me .bashrcayudó:

alias clear='printf "\E[H\E[2J"'

Recordatorio: ¡Los cambios .bashrcentran en vigor después de abrir una nueva terminal!

Respuesta3

Rutinariamente uso clearpara que mi símbolo del sistema se mueva a la parte superior de la pantalla y, sin darme cuenta, borro el búfer de desplazamiento hacia atrás, a menudo con contenido importante, como mensajes de error útiles de operaciones anteriores.

Al revisar la página de manual, dice claramente:

clear borra la pantalla si esto es posible, incluido su búfer de desplazamiento hacia atrás (si se define la capacidad extendida "E3").

También hay una opción allí:

-x no intenta borrar el buffer de desplazamiento hacia atrás del terminal usando la capacidad extendida “E3”.

Desde entonces, agregué esto a mi lista de alias en ~/.bashrc:

alias clear='clear -x'

Todavía recibo el mensaje para moverme a la parte superior cuando ejecuto clear, pero ahora puedo desplazarme hacia atrás si quiero.

Respuesta4

Mi solución para esto es agregar el siguiente alias a mi.bashrc

alias clear='tput reset'

En caso de que uno desee utilizar el comportamiento original, por ejemplo, para borrar información confidencial del búfer de desplazamiento hacia atrás, la versión sin alias se puede invocar fácilmente anteponiendo una barra invertida \como se explica.aquíoaquí. Eso se vería así

\clear

información relacionada