¿Qué es la API gráfica del terminal?


8

¿Cómo pueden ciertos programas establecer colores de fondo y fuente, escribir caracteres en la misma ubicación en la pantalla (por ejemplo, en la tercera fila, quinta columna) más de una vez?

Algunos ejemplos son la barra de progreso que se muestra curl google.com > a, algunas pantallas de instalación y casi cualquier editor de texto.

Respuestas:


5

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, ^Ho ^?sería un retroceso, ^Mes un retorno de carro (mueve el cursor al comienzo de la línea) y ^Jes 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, \nrespectivamente.

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.



1

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,

  • mover el cursor a la columna anterior en la misma fila
  • mover el cursor a la primera columna en la misma fila
  • mueve el cursor a la siguiente pestaña en la misma fila
  • mueva el cursor a la siguiente fila (y desplace la pantalla si ya está en la última fila)

La barra de progreso para curlse 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,

  • mueve el cursor a cualquier fila / columna en la pantalla
  • mover el cursor a cualquier fila en la misma columna en la pantalla
  • mueva el cursor a cualquier columna en la misma fila en la pantalla
  • establecer tabulaciones en cualquier columna de la pantalla
  • mover el cursor a la línea anterior
  • hacer que la pantalla se desplace hacia arriba o hacia abajo sin mover el cursor

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:

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.