Ce que vous demandez n'est pas vraiment une API graphique, c'est juste des caractères de contrôle de terminal.
Il y a beaucoup d'histoire derrière cela, mais les terminaux à l'époque étaient des machines de télétype . Fondamentalement, une machine à écrire avec du papier alimenté par des pistes connecté à l'ordinateur avec une connexion série. Taper un caractère enverrait cette valeur binaire à l'ordinateur (ainsi que la taper sur la page). L'ordinateur réimprime les caractères en sortie de tout ce que vous avez demandé.
Des caractères spéciaux ont été utilisés pour contrôler le terminal (d'où vient la clé de contrôle, c'était pour produire ces caractères). Par exemple, ^H
ou ^?
serait un retour arrière, ^M
est un retour chariot (déplace le curseur au début de la ligne) et ^J
est un saut de ligne (déplace la page d'une ligne vers le haut). Certains codes de contrôle ont une séquence d'échappement en C (qui est partagée par presque tous les langages de programmation) pour générer les caractères de contrôle. Les contrôles seraient énumérés précédemment être \b
, \r
, \n
respectivement.
L' émulateur de terminal que vous utilisez aujourd'hui est exactement ce que cela ressemble, c'est un logiciel qui prétend être une vieille machine de télétype. D'une certaine manière, c'est presque comme si Unix pensait toujours que vous utilisez une machine à écrire pour communiquer avec elle.
Dans le cas de curl
, il écrit une ligne entière puis envoie \r
(retour chariot) en amenant le curseur au début de la ligne puis écrit une autre ligne. Comme un saut de ligne n'est pas envoyé, il continue d'écrire sur la même ligne à l'écran.
Voici quelque chose que vous pouvez essayer de démontrer:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
Vous verrez le mot "First" imprimé (mais aucune nouvelle ligne n'est envoyée). 5 secondes plus tard, il sera remplacé par le mot "Second" et une nouvelle ligne sera envoyée. Vous pouvez répéter ce modèle indéfiniment. Essayez d'ajouter "Troisième" vous-même, vous verrez quelque chose auquel vous ne vous attendiez probablement pas ;-)
Pour plus d'informations sur ces caractères de contrôle et sur d'autres, consultez le ascii(7)
manuel.
ncurses
.Cette question est en fait plusieurs questions, et les "caractères de contrôle" n'en abordent qu'une petite partie, par exemple la barre de progression de
curl
. Plus généralement, ce sont des caractéristiques communes aux terminaux (et aux émulateurs de terminaux).La plupart de ces caractéristiques communes sont normalisées dans ECMA-48: Fonctions de contrôle pour les jeux de caractères codés . Cependant, d'autres fonctionnalités ne le sont pas . Ils sont définis par l'implémentation.
ECMA-48 fait référence aux fonctions de contrôle . Cela inclut les caractères de contrôle et les séquences de contrôle (souvent appelés séquences d'échappement, séquences ANSI, etc.).
Certains caractères de contrôle sont utilisés pour des opérations simples , par exemple,
La barre de progression de
curl
est construite à l'aide de ces opérations simples. Mais les personnages de contrôle ne peuvent pas faire grand chose, pas plus. Les séquences de contrôle font plus, par exemple,Voilà pour les parallèles entre simple / complexe. Les séquences de contrôle sont également utilisées pour changer la couleur du texte et de l'arrière-plan, effacer le texte de l'écran, afficher le texte en vidéo inverse (ou en gras, souligner, clignoter).
Les programmes qui dessinent une barre de progression vidéo inverse (ou colorée) utilisent des séquences de contrôle .
Bien que les séquences de contrôle puissent faire plus, elles ne peuvent faire que des choses spécifiques. Les assembler pour créer des éditeurs de texte, des écrans d'installation (et des programmes qui dessinent des barres de progression colorées) se compliquent. Une partie de cela est rendue plus simple en utilisant des bibliothèques qui connaissent ces choses. Initialement, nous avions termcap (et une base de données de quelques centaines de types de terminaux), étendu à terminfo (et une base de données d'environ mille types de terminaux).
Même avec la normalisation, il existe des dizaines de descriptions de terminaux que vous pouvez utiliser . Nous continuons donc à utiliser des bibliothèques pour toutes les applications, sauf les plus triviales. L'un est ncurses ("new-curses"), un autre est l'argot (techniquement "S-Lang").
Lectures complémentaires:
la source