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 screen
la agregas. En ese punto, screen
está 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 vim
y 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 screen
el 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 vim
llena 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. vim
cambia 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.
screen
es 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: screen
emula 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 vim
obtiene 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 xterm
derivados 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 ncurses
biblioteca 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 less
comando. Puede terminar con líneas duplicadas o faltantes en su desplazamiento hacia less
atrá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.