¿Qué es exactamente el desplazamiento hacia atrás y el búfer de desplazamiento hacia atrás?

23

¿Qué son "scrollback" y "scrollback buffer" en programas como bashy screen, y cómo se relacionan con el tty, los programas que se ejecutan y stdin / stdout / stderr?

Aquí está la única definición de "desplazamiento hacia atrás" que encontré hasta ahora (en la wiki de archlinux ):

Scrollback es una función que se implementa en una consola de texto para permitir que el usuario regrese para ver las líneas de texto que se han desplazado fuera de la pantalla. Esto es posible gracias a un búfer creado solo para este propósito entre el adaptador de video y el dispositivo de visualización; el búfer de desplazamiento hacia atrás.

Pero, esto plantea más preguntas para mí:

  • ¿Significa "función" como en "subrutina" o como "característica"?
  • ¿Existe un estándar o API de Unix para este búfer de desplazamiento?
  • En una "pila" de programas, como vimLanzado en screenLanzado en bashLanzado en sshLanzado en un emulador de terminal, ¿cuáles de estos programas controlan el búfer de desplazamiento hacia atrás?

También utilicé screenpara volcar el desplazamiento hacia atrás en un archivo . Este archivo tenía mucho espacio en blanco en la parte superior, y parece que la "vista" que me muestra mi emulador de terminal es simplemente las pocas líneas inferiores del búfer.

  • ¿Es por esto que un programa como vimpuede "borrar" toda mi ventana de terminal, porque obtiene acceso temporal al búfer de desplazamiento del shell principal?
  • ¿O vimutiliza su propio búfer de retroceso que de alguna manera se superpone sobre el búfer de retroceso principal?
Oleg
fuente

Respuestas:

28

Esta es una pregunta un poco complicada. Intentaré responder a sus preguntas por turno, pero primero una descripción general:

El buffer de scrollback es implementado por su emulador de terminal ( xterm, Konsole, GNOME Terminal). Contiene todo el texto que se ha mostrado en la pantalla, incluida la salida estándar y el error estándar de cada programa que ejecuta en el terminal. Es una funcionalidad completamente terminal que le permite mirar la salida pasada que puede haber pasado por encima de usted o verificar lo que algo dijo antes.

Puede pensar en el búfer de desplazamiento hacia atrás como una página larga de salida registrada y su ventana de terminal como una ventana que mira solo una parte de ella en cualquier momento. Si no se ha desplazado hacia arriba, lo que está viendo es el extremo posterior del búfer. Por lo general, habrá un límite configurado en el terminal de cuántas líneas realiza un seguimiento antes de que comience a olvidar.

Supongamos que el límite es de 1000 líneas. Para las primeras mil líneas de salida en su sesión, simplemente agregue al búfer, y puede desplazarse hacia arriba hasta el inicio de su sesión. Tan pronto como obtenga la línea 1001 de salida, se borrará la primera línea del búfer, y lo más atrás que pueda desplazarse será la segunda línea de su sesión. El búfer siempre contendrá las mil líneas de salida más recientes que se mostraron en su pantalla, y puede desplazarse hacia arriba para ver la salida anterior en cualquier momento.

  • ¿Significa "función" como en "subrutina" o como "característica"?

    Esta es "función" como en "característica". El emulador de terminal tiene una funcionalidad que registra lo que está en la pantalla y le permite desplazarse hacia arriba y hacia abajo. Las consolas en algunos sistemas también admiten retroceso limitado.

    Se vuelve un poco más complicado una vez que screenla agregas. En ese punto, screenestá emulando el búfer de desplazamiento hacia atrás en sí mismo; es por eso que puede copiarlo y pegarlo dentro del programa, en lugar de solo con (digamos) la selección X.

  • ¿Existe un estándar o API de Unix para este búfer de desplazamiento?

    La respuesta corta es no, solo la proporciona su terminal. La respuesta más larga llegaremos al final.

  • En una "pila" de programas, como vim lanzado en la pantalla lanzado en bash lanzado en ssh lanzado en un emulador de terminal, ¿cuáles de estos programas controlan el búfer de desplazamiento hacia atrás?

    En el caso de vimy bash, no lo controlan en absoluto (advertencia, nuevamente, más abajo). Su terminal proporciona el búfer de desplazamiento hacia atrás para todos los programas dentro de él, comenzando desde su shell. screen, como se mencionó anteriormente, simula el desplazamiento hacia atrás.

  • También usé la pantalla para volcar el scrollback a un archivo. Este archivo tenía mucho espacio en blanco en la parte superior, y parece que la "vista" que me muestra mi emulador de terminal es simplemente las pocas líneas inferiores del búfer.

    Este es screenel búfer interno. Lo que está en su pantalla en ese momento generalmente será lo que está en la parte inferior del búfer.

  • ¿Es por eso que un programa como vim puede "borrar" toda mi ventana de terminal, ya que obtiene acceso temporal al búfer de desplazamiento del shell principal?

    Aquí hay una parte de donde se vuelve mucho más complejo. Prácticamente todos los emuladores de terminal basados ​​en X están simulando un VT100, y una cosa que hacen allí es admitir un "Buffer de pantalla alternativa" . A diferencia del búfer ordinario que se usa para la mayoría de las interacciones de terminal con salida secuencial, el búfer de pantalla alternativo tiene el tamaño exacto de su terminal. No hay desplazamiento hacia arriba o hacia abajo porque no es más grande que lo que se muestra.

    La idea es permitir que una aplicación de pantalla completa haga lo que tiene que hacer sin interferir con nada de lo que ya tenía en la pantalla, y luego permitirle volver exactamente a la pantalla que tenía antes. Es por eso que cuando lo ingresa vimllena toda la pantalla, pero cuando lo abandona, la salida del terminal que tenía de antemano, todas sus indicaciones anteriores y la salida del comando, regresa nuevamente. vimcambia al búfer de pantalla alternativa cuando comienza y vuelve al búfer normal cuando sale.

    Este búfer alternativo es una de las advertencias que mencioné anteriormente. A veces, el programa realmente tiene la capacidad de decirle al terminal qué hacer con el búfer.

    screenes otro programa que hace esto, por lo que la funcionalidad de desplazamiento de su terminal generalmente no funciona mientras está en una sesión de pantalla:  screenemula el búfer de desplazamiento en sí mismo, por lo que debe usar su funcionalidad interna para llegar a la salida anterior.

  • ¿O vim utiliza su propio búfer de retroceso que de alguna manera se superpone sobre el búfer de retroceso principal?

    Sobre todo he respondido esto en la pregunta anterior, pero la respuesta corta a esta pregunta en particular es que vimobtiene su propio búfer temporal, sin desplazamiento hacia atrás, desde el terminal, y luego realiza todos sus propios desplazamientos internos de sus documentos.

Todas esas excepciones que mencioné:

Se vuelve un poco más complicado de nuevo. Dije que las aplicaciones no tienen ningún control sobre el desplazamiento hacia atrás y que es proporcionado completamente por el terminal. En algunos casos, con algunos terminales, la interacción es limitada. El programa imprime ciertas secuencias de escape (si alguna vez ha usado la coloración de terminales manualmente en el pasado, verá cómo se ven) y la terminal puede interpretarlas y cambiar su comportamiento, o incluso enviar información al programa. Las secuencias de escape disponibles se describen en la base de datos termcap (capacidad terminal) .

Algunos terminales admiten consultas y manipulación limitadas del búfer de desplazamiento hacia atrás. Muchos xtermderivados tienen secuencias de escape que dirigen al terminal a desplazar su vista. Muchos terminales también admiten la especificación de un área particular de la pantalla para desplazarse, dejando todo el resto intacto. Eso tiende a romper el búfer de desplazamiento hacia atrás.

Casi todos los terminales admiten secuencias para mover el cursor por la pantalla, y así es como la ncursesbiblioteca puede actualizar todas las diferentes partes de la pantalla. Puede ver las secuencias VT100 compatibles conxterm . La forma en que estos interactúan con el búfer de desplazamiento puede ser un poco extraño a veces, particularmente en el caso de algo que implementa su propio comportamiento de desplazamiento, como el lesscomando. Puede terminar con líneas duplicadas o faltantes en su desplazamiento hacia lessatrás porque redibujó el texto en la parte superior de una manera que su terminal no esperaba. Otros programas a veces terminan llenando su búfer con múltiples copias de toda su pantalla.

Michael Homer
fuente
1
Muchas gracias por esta gran respuesta! Es muy completo y fácil de entender a pesar del tema complejo. Los detalles adicionales me dan ganas de aprender más y me muestran dónde buscar.
Oleg
1
Algunos terminales tienen una opción de retroceso ilimitado, esto significa que todo el retroceso es RAM (por lo que en algún momento obtendremos un error de malloc u OOM en el terminal), o intenta escribir en el disco y cargar desde el disco como usted ¿voluta? Algo así como programas de chat.
CMCDragonkai
Las secuencias de escape para las consultas generalmente no están en termcap (tampoco están generalmente en terminfo, lo que sería más completo).
Thomas Dickey el
@CMCDragonkai Konsole mantiene el desplazamiento hacia atrás finito en la memoria, pero coloca el desplazamiento hacia atrás infinito en el disco sin cifrar; Te lo advertimos en su diálogo de configuración. VTE (gnome-terminal y otros) almacena el scrollback (finito o infinito) en disco, comprimido y encriptado. No sé lo que hacen otros emuladores.
egmont