Главная
Новости
Строительство
Ремонт
Дизайн и интерьер




18.04.2021


18.04.2021


18.04.2021


18.04.2021


18.04.2021





Яндекс.Метрика

Управляющие последовательности ANSI

12.03.2021

Управляющие символы ANSI (англ. ANSI escape code) — символы, встраиваемые в текст, для управления форматом, цветом и другими опциями вывода в текстовом терминале. Почти все эмуляторы терминалов, предназначенные для отображения текстового вывода с удалённого компьютера и (за исключением Microsoft Windows) для отображения текстового вывода локального программного обеспечения, способны интерпретировать по крайней мере некоторые управляющие последовательности ANSI.

История

Почти все разработчики текстовых терминалов создавали свои, несовместимые с другими версиями терминалов, управляющие последовательности, выполняющие какие-либо преобразования над содержимым терминала; например, перемещение курсора на произвольную позицию на экране. Сложные библиотеки, такие как termcap, были созданы для того чтобы в программах можно было использовать единый API, не зависимый от реализации текстового терминала. Кроме того, большинство терминалов требовали отправки чисел (таких как строка и столбец) в виде бинарных значений символов; для некоторых языков программирования и операционных систем, не имеющих внутренней поддержки ASCII, часто было сложно или невозможно поставить в соответствие числу корректный символ.

Первым стандартом управляющих символов ANSI стал ECMA-48, принятый в 1976 году. Это было продолжение серии стандартов кодировок, первым из которых был ECMA-6 1961 года — 7-битный стандарт от которого происходит ASCII. ECMA-48 обновлялся несколько раз, текущая версия — пятая, 1991 года. Он также принят ISO и IEC как стандарт ISO/IEC 6429. Название «Управляющие символы ANSI» (англ. «ANSI escape sequence») появилось в 1981, когда ANSI принял ECMA-48 как стандарт ANSI X3.64 (позднее, в 1997 году, отозван).

Первым популярным терминалом, поддерживающим эти последовательности, стал VT100, представленный в 1978 году. Среди многочисленных «клонов» VT100, самым ранним и наиболее популярным стал наиболее доступный Zenith Z-19, вышедший в 1979 году. Их популярность постепенно приводила к появлению большого количества программного обеспечения (особенно BBS), поддерживающего управляющие последовательности, а это, в свою очередь, привело к тому, что практически все новые терминалы и эмуляторы терминалов поддерживали их.

Поддержка

Большинство эмуляторов терминалов UNIX-подобных операционных систем (таких как xterm или OS X Terminal) интерпретируют управляющие последовательности ANSI. Linux-консоль (видна когда X Window System не запущена) также интерпретирует их. Эмуляторы терминалов Microsoft Windows, предназначенные для текстового вывода из внешних источников (последовательный порт, модем или сокет), также интерпретируют их. Некоторая поддержка для текстового вывода локальных программ в Windows часто осуществляется при помощи альтернативных процессоров команд, например Take Command Console (прежде 4NT) от JP Software, ANSI.COM от Michael J. Mefford, ansicon от Jason Hood.

Многие консольные приложения Unix (например, ls, grep, Vim, Emacs) могут генерировать их. Некоторые утилиты (tput), низкоуровневые (termcap, terminfo) и высокоуровневые (curses) библиотеки, выводят их.

В операционной системе OS/2 от IBM, начиная с версии 3.0 и старше, включая ECs, поддержка ANSI в полноэкранном и оконном режиме консоли включена по умолчанию.

Windows и DOS

MS-DOS 1.0 не поддерживала ни ANSI, ни какие-либо другие управляющие последовательности. Интерпретировались только несколько управляющих символов (CR, LF, BS), что не давало возможности создавать какие-либо полноэкранные приложения. Каких-либо эффектов дисплея можно было достичь только вызовами BIOS (или, гораздо чаще, прямыми манипуляциями над оборудованием IBM PC).

MS-DOS 2.0 предоставляла возможность установки драйвера для поддержки управляющих последовательностей ANSI — де-факто стандартом был ANSI.SYS, но использовались и другие (ANSI.COM, NANSI.SYS). Медлительность и тот факт, что драйвер не был установлен по умолчанию, привели к тому, что они почти не использовалось; программное обеспечение продолжало напрямую манипулировать оборудованием для получения необходимых эффектов в текстовом терминале. ANSI.SYS и подобные драйверы продолжали использоваться в Windows 98, и даже в Windows ME в режиме native DOS (полноэкранный текстовый режим). ANSI.SYS также работает на системах семейства Windows NT в 16-битном режиме для устаревших программ при помощи NTVDM.

Win32-консоль вообще не поддерживала управляющие последовательности ANSI до версии Windows 10 "Threshold 2". Программное обеспечение может управлять консолью посредством ioctl-подобных системных вызовов консольных API, чередующимся с текстовым выводом. Некоторые программы внутренне интерпретирует управляющие последовательности ANSI из текстового ввода и переводят их в соответствующие системные вызовы.

Элементы последовательности

Управляющие последовательности начинаются с символа ESC (ASCII: 27 / 0x1B / 033). Для двусимвольных последовательностей вторым символом может быть символ ASCII в диапазоне от 64 до 95 (от @ до _). Однако большинство последовательностей включают более двух символов и начинаются с символов ESC и [. Совокупность символов ESC и [ называют CSI или Control Sequence Introducer (также Control Sequence Initiator). Последним символом такой последовательности может быть ASCII-символ в диапазоне от 64 до 126 (от @ до ~).

Существует также односимвольный CSI (ASCII: 155 / 0x9B / 0233). CSI вида ESC + [ используется чаще, чем односимвольная альтернатива (см. также C0 and C1 control codes). Только ESC + [ распознаются устройствами, поддерживающими лишь ASCII (7-битные байты) или устройствами, поддерживающими 8-битные байты, но использующие управляющие символы в диапазоне 0x80-0x9F для других целей. В терминалах, использующих кодировку UTF-8, обе формы занимают 2 байта (CSI в UTF-8: 0xC2, 0x9B), но ESC + [ выглядит разборчивей.

Хотя некоторые кодировки и используют несколько байтов для кодировки одного символа, далее в статье мы будем рассматривать только ASCII-символы, которые представляются одним байтом.

CSI коды

Структура большинства управляющих последовательностей ANSI выглядит следующим образом:

CSI [символ(-ы) режима] n1 ; n2... [замыкающий(-ие) символ(-ы)] буква

Последний байт (буква), изменённый символами режима и замыкающими символами, определяет команду. Числа n1, n2, … — необязательные параметры. Если их значения не указаны, то по умолчанию обычно используются 0 или 1, в зависимости от операции. Если не указаны следующие числа, то и точки с запятыми тоже могут быть пропущены.

Последним байтом, формально, может быть любой символ от 64 до 126 (от 0x40 до 0x7e, ASCII: от @ до ~), он может быть изменён впереди стоящими промежуточными байтами в диапазоне от 32 до 47 (от 0x20 до 0x2f).

Символ двоеточия (0x3a) не может содержаться в последовательности. Он был оставлен для будущей стандартизации, поэтому любая последовательность, содержащая двоеточие, игнорируется.

Хотя наличие нескольких символов режима и нескольких замыкающих символов разрешено, это не используется.

Цвета

Цвета текста (и SGR параметры в целом) управляются при помощи последовательностей CSI n1 [;n2 [; ...]] m, где каждый n1, n2, ... является SGR-параметром, как показано выше. Таким образом, например, вы используете коды 30+i для задания цвета текста, 40+i для задания цвета фона, где i — номер цвета из таблички ниже. Следующие примеры могут использоваться с утилитой printf, где x1b[ или e[ реализуют CSI: Для переключения цвета текста в чёрный используйте x1b[30m; в красный x1b[31m; установка жирного серого x1b[30;1m; установить жирный красный x1b[31;1m. Для установки цветов по умолчанию используйте x1b[39;49m (не поддерживается некоторыми терминалами) (или сбросьте все атрибуты x1b[0m).