Видеотерминалы и терминальные эмуляторы поддерживают довольно богатые функции работы с текстом. Одной из главных функций является изменение положения курсора — точки, в которой будет выводиться текст на экран. Перемещая курсор, пользовательская программа может рисовать на экране почти всё, что можно изобразить при помощи символов ASCII: экранные формы, выпадающие меню, диалоговые окна, даже изображения (так называемый ASCII art). Кроме того, многие терминалы поддерживают расширенные символы, например, так называемую «псевдографику». Эти символы позволяю рисовать на экране прямоугольные рамки и таблицы. Многие видеотерминалы и практически все терминальные эмуляторы также поддерживают управление цветом символов и фона.
Доступ ко всем этим функциям осуществляется при помощи кодов расширения (escape sequences) — многобайтовых последовательностей, начинающихся с символа ASCII ESC. Разные модели терминалов поддерживают разные наборы кодов расширения. Существует несколько де-юре и де-факто стандартов этих кодов. Основной стандарт де-юре — это ECMA-48, известный также как ANSI X3.64 и ISO/IEC 6429, соответствующий набор кодов расширения также называется ANSI escape sequences. Наиболее известные стандарты де-факто — это управляющие коды терминалов DEC VT-50, DEC VT-100 и xterm. Набор кодов расширения VT-100 сильно перекрывается со стандартом ANSI и считается одним из первых аппаратных терминалов, реализовавших этот стандарт. Набор кодов xterm эмулирует как VT-100, так и ANSI, а также добавляет ряд функций, характерных для терминального эмулятора — так, код расширения ESC]2;stringBEL (гдe ESC — это ASCII ESC, а BEL — ASCII BEL) заменяет название окна xterm на string. В системном руководстве bash(1) содержится информация о том, как настроить строку приглашения bash, чтобы она содержала эту последовательность и формировала string так, чтобы эта строка, в свою очередь, содержала интересную для пользователя информацию, например, текущий каталог данной терминальной сессии, имя сетевого узла и т. д.
Так или иначе, многие терминалы, реализующие стандартные наборы команд, поддерживают их не полностью или добавляют какие-то свои расширения. Ядро Unix не предоставляет сервисов для работы с кодами расширения терминалов и передает эти коды терминалу «как есть». Для работы с кодами расширения необходимо использовать библиотеки, например, libcurses(3LIB), которая входит в поставку Solaris.
Библиотека libcurses обеспечивает формирование кодов расширения для выполнения заданных функций, например, для перемещения курсора в заданную точку экрана, а также интерпретацию кодов расширения, посылаемых терминалом, и их перевод в независимые от терминала псевдосимволы. Библиотека определяет тип терминала на основе переменной среды TERM, и использует базу данных, хранящуюся в каталоге /usr/share/lib/terminfo/. В этой базе для каждого известного типа терминала хранится таблица, описывающая поддерживаемые им типы команд и код расширения, соответствующий каждой команда. Libcurses обеспечивает некоторую оптимизацию: так, если требуется переместить курсор в заданную точку и терминал поддерживает команды для установки позиции курсора, библиотека сгенерирует соответствующую команду. Если же терминал такой команды не поддерживает, библиотека сгенерирует последовательность перемещений курсора на одну позицию вверх, вниз или вбок (такая функция есть почти у всех видеотерминалов).
Почти все «полноэкранные» программы, такие, как текстовые редакторы, веб-браузеры или файловые менеджеры, используют libcurses или какой-то из ее аналогов, чаще всего ncurses. Однако в нашем курсе мы изучать эту библиотеку не будем.