То, о чем вы спрашиваете, на самом деле не графический API, это просто управляющие символы терминала.
За этим стоит большая история, но в прошлом терминалы были машинами Teletype . В основном пишущая машинка с трековой бумагой, подключенная к компьютеру через последовательное соединение. Ввод символа будет отправлять это двоичное значение на компьютер (а также вводить его на странице). Компьютер будет печатать символы обратно как вывод того, что вы запросили.
Специальные символы использовались для управления терминалом (откуда берется управляющий ключ, для создания этих символов). Например, ^H
или ^?
будет ^M
возвращением каретки, это возврат каретки (перемещает курсор в начало строки) и ^J
перевод строки (переместить страницу вверх на одну строку). Некоторые управляющие коды имеют escape-последовательность в C (которая используется почти всеми языками программирования) для генерации управляющих символов. Элементы управления , перечисленные выше , были бы \b
, \r
, \n
соответственно.
Эмулятор терминала используется сегодня только то , что это звучит как, это программное обеспечение, которое притворяется старый телетайп машин. В некотором смысле, похоже, что Unix все еще думает, что вы используете пишущую машинку для связи с ним.
В случае curl
, он записывает всю строку, а затем отправляет \r
(возврат каретки), переводя курсор в начало строки, а затем записывает другую строку. Поскольку перевод строки не отправляется, он продолжает писать на одной и той же строке на экране.
Вот что вы можете попробовать продемонстрировать это:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
Вы увидите напечатанное слово «First» (но новая строка не отправляется). Через 5 секунд он будет заменен словом «Second» и будет отправлена новая строка. Вы можете повторять этот шаблон до бесконечности. Попробуйте добавить «Третий» самостоятельно, вы увидите то, чего вы, вероятно, не ожидали ;-)
Для получения дополнительной информации об этих и других управляющих символах см. ascii(7)
Руководство.
ncurses
.Этот вопрос на самом деле состоит из нескольких вопросов, и «управляющие символы» затрагивают лишь небольшую его часть, например, индикатор выполнения для
curl
. В более общем смысле это общие характеристики терминалов (и эмуляторов терминалов).Большинство из этих общих функций стандартизированы в ECMA-48: Функции управления для наборов кодированных символов . Однако других функций нет . Они определяются реализацией.
ECMA-48 относится к функциям управления . Это включает управляющие символы и управляющие последовательности (часто называемые escape-последовательностями, последовательностями ANSI и т. Д.).
Некоторые управляющие символы используются для простых операций, например,
Индикатор выполнения для
curl
построен с использованием этих простых операций. Но управляющие персонажи могут делать только так много, не больше. Контрольные последовательности делают больше, например,Вот вам и параллели между простым и сложным. Последовательности управления также используются для изменения цвета текста и фона, удаления текста с экрана, отображения текста в обратном видео (или жирным шрифтом, подчеркиванием, миганием).
Программы, которые рисуют прогресс-бар (или цветной), используют последовательности управления .
Хотя управляющие последовательности могут делать больше, они могут делать только определенные вещи. Объединение их для создания текстовых редакторов, установочных экранов (и программ, которые рисуют цветные прогресс-бары) усложняется. Некоторые из них упрощаются с помощью библиотек, которые знают об этих вещах. Изначально у нас был termcap (и база данных нескольких сотен типов терминалов), расширенная до terminfo (и база данных около тысячи типов терминалов).
Даже со стандартизацией есть десятки описаний терминалов, которые вы можете использовать . Поэтому мы продолжаем использовать библиотеки для всех приложений, кроме самых простых. Один - это ncurses («новые проклятия»), другой - сленг (технически «S-Lang»).
Дальнейшее чтение:
источник