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

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

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

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

Respuesta1

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 los terminales de la época eranTeletipomáquinas. Básicamente una máquina de escribir con papel alimentado por vía conectada a la computadora con una conexión en serie. Escribir un carácter enviaría ese valor binario a la computadora (además de escribirlo en la página). La computadora imprimiría caracteres como resultado de lo que usted solicitara.

Se utilizaban caracteres especiales para controlar el terminal (de donde viene 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 principio 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 comparten casi todos los lenguajes de programación) para generar los caracteres de control. Los controles enumerados anteriormente serían \b, \r, \nrespectivamente.

Elemulador de terminalque usas hoy es exactamente lo que parece: es un software que pretende ser una vieja máquina de teletipo. En cierto modo, es casi como si Unix todavía pensara que estás usando una máquina de escribir para comunicarte con él.

En el caso de curl, escribe una línea completa, luego envía \r(retorno de carro) llevando el cursor al principio de la línea y luego escribe otra línea. Dado que no se envía un avance de línea, sigue escribiendo en la misma línea en la pantalla.

Aquí hay algo que puedes intentar para demostrar esto:

echo -n  "First" ; sleep 5 ; echo -en "\rSecond\n"

Verá impresa la palabra "Primera" (pero no se envía ninguna línea nueva). 5 segundos después será reemplazada por la palabra "Segundo" y se enviará una nueva línea. Puedes 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 personajes de control, consulte el ascii(7)manual.

Respuesta2

¿Estás buscando algo comomaldiciones?

Respuesta3

Esa pregunta son en realidad varias preguntas, y"personajes de control"aborda sólo una pequeña parte, por ejemplo, la barra de progreso de curl. De manera más general, estas son características comunes de los terminales (y emuladores de terminales).

La mayoría de estas características comunes están estandarizadas enECMA-48: Funciones de control para juegos de caracteres codificados. Sin embargo, otras características sonno. Están definidos por la implementación.

ECMA-48 se refiere afunciones de control. Eso incluyepersonajes de controlysecuencias de control(a menudo denominadas secuencias de escape, secuencias ANSI, etc.).

Algunos caracteres de control se utilizan parasimpleoperaciones, por ejemplo,

  • mover el cursor a la columna anterior en la misma fila
  • mover el cursor a la primera columna de la misma fila
  • mover el cursor a la siguiente tabulación en la misma fila
  • mueva el cursor a la siguiente fila (y desplace la pantallasiya en la última fila)

La barra de progreso curlse construye utilizando estas simples operaciones. Pero los personajes de control sólo pueden hacer mucho, nada más. Las secuencias de control hacen más, por ejemplo,

  • mover el cursor a cualquier fila/columna en la pantalla
  • mover el cursor a cualquier fila en la misma columna en la pantalla
  • mover 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

Hasta aquí los paralelismos entre simple y complejo. Las secuencias de control también se utilizan para cambiar el color del texto y el fondo, borrar texto de la pantalla, mostrar texto en vídeo inverso (o negrita, subrayado, parpadeo).

Los programas que dibujan una barra de progreso de vídeo inverso (o coloreada)secuencias de control.

Aunque las secuencias de control pueden hacer más, sólo pueden hacer cosas específicas. Combinarlos para crear editores de texto, pantallas de instalación (y programas que dibujan barras de progreso de colores) se vuelve complicado. Algo de esto se simplifica mediante el uso de bibliotecas que conocen estas cosas. Inicialmente, teníamos termcap (y una base de datos de unos cientos de tipos de terminales), ampliados 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 se puedenusar. Por lo tanto, continuamos usando bibliotecas para todas estas aplicaciones, excepto para las más triviales. Uno es ncurses ("new-curses"), otro es slang (técnicamente "S-Lang").

Otras lecturas:

información relacionada