Lo que estás preguntando no es realmente una API de gráficos, son solo caracteres de control de terminal.
Hay mucha historia detrás, pero las terminales de la época eran máquinas de teletipo . Básicamente, una máquina de escribir con papel alimentado por pistas conectado a la computadora con una conexión en serie. Escribir un carácter enviaría ese valor binario a la computadora (así como escribirlo en la página). La computadora volvería a imprimir los caracteres como la salida de lo que haya solicitado.
Se usaron caracteres especiales para controlar el terminal (que es de donde proviene la tecla de control, era para producir esos caracteres). Por ejemplo, ^H
o ^?
sería un retroceso, ^M
es un retorno de carro (mueve el cursor al comienzo de la línea) y ^J
es un avance de línea (mueve la página una línea hacia arriba). Algunos códigos de control tienen una secuencia de escape en C (que es compartida por casi todos los lenguajes de programación) para generar los caracteres de control. Los controles mencionados anteriormente serían \b
, \r
, \n
respectivamente.
El emulador de terminal que usa hoy es exactamente lo que suena, es un software que pretende ser una vieja máquina de teletipo. En cierto modo, es casi como si Unix todavía cree que está utilizando una máquina de escribir para comunicarse con ella.
En el caso de curl
, escribe una línea completa y luego envía \r
(retorno de carro) llevando el cursor al comienzo de la línea y luego escribe otra línea. Como no se envía un avance de línea, sigue escribiendo sobre la misma línea en la pantalla.
Aquí hay algo que puedes probar para demostrar esto:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
Verá la palabra "Primero" impresa (pero no se envía una nueva línea). 5 segundos después se reemplazará con la palabra "Segundo" y se enviará una nueva línea. Puede repetir este patrón indefinidamente. Intente agregar "Tercero" usted mismo, verá algo que probablemente no esperaba ;-)
Para obtener más información sobre estos y otros caracteres de control, consulte el ascii(7)
manual.
ncurses
.Esa pregunta es en realidad varias preguntas, y los "caracteres de control" abordan solo una pequeña parte de ella, por ejemplo, la barra de progreso para
curl
. En términos más generales, estas son características comunes de los terminales (y emuladores de terminal).La mayoría de estas características comunes están estandarizadas en ECMA-48: Funciones de control para juegos de caracteres codificados . Sin embargo, otras características no lo son . Están definidos por la implementación.
ECMA-48 se refiere a funciones de control . Eso incluye caracteres de control y secuencias de control (a menudo denominadas secuencias de escape, secuencias ANSI, etc.).
Algunos caracteres de control se utilizan para operaciones simples , por ejemplo,
La barra de progreso para
curl
se construye utilizando estas operaciones simples. Pero los personajes de control solo pueden hacer mucho, no más. Las secuencias de control hacen más, por ejemplo,Esto en cuanto a paralelos entre simple / complejo. Las secuencias de control también se usan para cambiar el color del texto y el fondo, borrar texto de la pantalla, mostrar texto en video inverso (o negrita, subrayado, parpadeo).
Los programas que dibujan una barra de progreso de video inverso (o de color) usan secuencias de control .
Aunque las secuencias de control pueden hacer más, solo pueden hacer cosas específicas. Ponerlos juntos para hacer editores de texto, pantallas de instalación (y programas que dibujan barras de progreso de colores) se complica. Algo de eso se simplifica mediante el uso de bibliotecas que conocen estas cosas. Inicialmente, teníamos un termcap (y una base de datos de unos cientos de tipos de terminales), extendido a terminfo (y una base de datos de alrededor de mil tipos de terminales).
Incluso con la estandarización, hay docenas de descripciones de terminales que puede usar . Por lo tanto, seguimos utilizando bibliotecas para todas las aplicaciones menos las más triviales. Uno es ncurses ("nuevas maldiciones"), otro es argot (técnicamente "S-Lang").
Otras lecturas:
fuente