Перейти к содержанию

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

Материал из Википедии — свободной энциклопедии

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

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

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

Первым популярным терминалом, поддерживающим эти последовательности, стал VT100, представленный в 1978 году[2]. Среди многочисленных «клонов» VT100, самым ранним и наиболее популярным стал наиболее доступный Zenith Z-19, вышедший в 1979 году[3]. Их популярность постепенно приводила к появлению большого количества программного обеспечения (особенно 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 в полноэкранном и оконном режиме консоли включена по умолчанию.

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

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

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

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

[править | править код]

Управляющие последовательности ANSI начинаются с символа ASCII ESC (код 27 / 0x1B / 033). Для двусимвольных последовательностей вторым символом может быть ASCII-символ в диапазоне 0x40–0x5F (от @ до _). Большинство последовательностей включают более двух символов и начинаются с комбинации ESC и [ — эту последовательность называют CSI (Control Sequence Introducer). Последний символ такой последовательности находится в диапазоне 0x40–0x7E (от @ до ~).

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

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

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

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

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

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

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

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

Некоторые управляющие последовательности ANSI (неполный список)
КодНазваниеЭффект
CSI n ACUU — Cursor UpПеремещает курсор на n (по умолчанию 1) позиций в указанном направлении. Если курсор уже находится с краю окна терминала, ничего не происходит.
CSI n BCUD — Cursor Down
CSI n CCUF — Cursor Forward
CSI n DCUB — Cursor Back
CSI n ECNL — Cursor Next LineПеремещает курсор в начало n-ой (по умолчанию 1-й) строки снизу относительно текущей.
CSI n FCPL — Cursor Previous LineПеремещает курсор в начало n-ой (по умолчанию 1-й) строки сверху относительно текущей.
CSI n GCHA — Cursor Horizontal AbsoluteПеремещает курсор в столбец n.
CSI n ; m HCUP — Cursor PositionПеремещает курсор в строку n, столбец m. Значения n и m по умолчанию 1 (левый верхний угол), если указан только один аргумент без точки с запятой, считается что это n. Например, последовательность CSI ;5H синонимична CSI 1;5H, CSI 17;H синонимична CSI 17H и CSI 17;1H.
CSI n JED — Erase DataОчищает часть окна терминала. Если n равно нулю (или отсутствует), очищает всё от курсора до конца окна терминала. Если n равно единице, очищает всё от курсора до начала окна терминала. Если n равно двум, очищает всё окно терминала (и перемещает курсор в левый верхний угол в MS-DOS ANSI.SYS). В случае n равного 2, вместо очистки может произойти просто создание новых строчек так чтобы предшествующее содержимое терминала вытеснилось вверх.
CSI n KEL — Erase in LineУдаляет часть строки. Если n равно нулю (или отсутствует), очищает всё от курсора до конца строки. Если n равно единице, очищает всё от курсора до начала строки. Если n равно двум, очищает всю строку. Положение курсора не меняется.
CSI n SSU — Scroll UpПрокручивает текущую страницу терминала вверх на n (по умолчанию 1) строк. Новые строки добавляются снизу, строки в верхней части текущей страницы затираются. (не ANSI.SYS)
CSI n TSD — Scroll DownПрокручивает текущую страницу терминала вниз на n (по умолчанию 1) строк. Новые строки добавляются сверху, строки в нижней части текущей страницы удаляются. (не ANSI.SYS)
CSI n ; m fHVP — Horizontal and Vertical PositionПеремещает курсор в строку n, столбец m. Значение по умолчанию обоих параметров 1. Тот же эффект, что и CUP.
CSI n [;k] mSGR — Select Graphic RenditionУстановка SGR параметров, определяющих цвета текста и фона. После CSI могут находиться ноль или более параметров, разделённых точками с запятыми. Если параметры не указаны, CSI m ведёт себя как CSI 0 m (reset / normal).
CSI 6 nDSR — Device Status ReportСообщает текущее положение курсора в формате ESC[n;mR, где n — строка, m — столбец. (Может не работать в MS-DOS)
CSI sSCP — Save Cursor PositionСохраняет положение курсора.
CSI uRCP — Restore Cursor PositionВосстанавливает положение курсора.
CSI ?25lDECTCEMСкрывает курсор.
CSI ?25hDECTCEMДелает курсор видимым.
SGR (Select Graphic Rendition) параметры
КодЭффектПримечание
0Reset / Normalвыключение всех атрибутов
1Жирный или увеличить яркость
2Блёклый (уменьшить яркость)Не везде поддерживается
3Курсив: вкл.Не везде поддерживается. Иногда обрабатывается как инверсия.
4Подчёркнутый: один раз
5Мигание: Медленноменее 150 раз в минуту
6Мигание: ЧастоMS-DOS ANSI.SYS; 150+ в минуту; не везде поддерживается
7Отображение: Негативинвертирует или обращает; меняет цвета фона и текста
8СкрытыйНе везде поддерживается.
9ЗачёркнутыйСимволы разборчивы, но помечены как удалённые. Не везде поддерживается.
10Основной (по умолчанию) шрифт
11—19-й альтернативный шрифтВыбирает -й альтернативный шрифт (от 11 — первый альтернативный шрифт до 19 — девятый альтернативный шрифт).
20Фрактуравряд ли поддерживается
21Жирный: выкл. или Подчёркивание: Двойноежирный не всегда поддерживается; двойное подчёркивание вряд ли поддерживается.
22Обычный цвет или яркостьНи жирный ни блеклый
23Не курсивный, не фрактура
24Подчёркивание: НетПодчёркивание ни одиночное ни двойное
25Мигание: выкл.
26Зарезервирован
27Отображение: обычноене негатив
28Отображающийсявыключить скрытие
29Не зачёркнутый
30—37Установить цвет текста (на переднем плане)30 + , где из таблицы цветов ниже
38Зарезервировано для дополнительных цветовобычно поддерживаются следующие аргументы: 5;n где индекс цвета (0..255) или 2;r;g;b где  — красный, зелёный и синий каналы цвета (в пределах 255)
39Цвет текста по умолчанию (на переднем плане)зависит от реализации (в соответствии со стандартом)
40—47Установить цвет фона40 + , где из таблицы цветов снизу
48Зарезервировано для установки расширенного цвета фонаобычно поддерживает следующие аргументы 5;n где индекс цвета (0..255) или 2;r;g;b где  — красный, зелёный и синий каналы цвета (в пределах 255)
49Цвет фона по умолчаниюзависит от реализации (в соответствии со стандартом)
50Зарезервировано
51Обрамлённый
52Окружённый
53Надчёркнутый
54Не обрамлённый и не окружённый
55Не надчёркнутый
56—59Зарезервировано
60ideogram underline or right side lineвряд ли поддерживается
61ideogram double underline or double line on the right sideвряд ли поддерживается
62ideogram overline or left side lineвряд ли поддерживается
63ideogram double overline or double line on the left sideвряд ли поддерживается
64ideogram stress markingвряд ли поддерживается
65ideogram attributes offвряд ли поддерживается, отменяет эффекты кодов 60—64
90—97Set foreground text color, high intensityaixterm (не стандарт)
100—107Set background color, high intensityaixterm (не стандарт)

Цвета текста (и 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).

Таблица цветов[6]
Intensity01234567
Normal Black Red Green Yellow Blue Magenta Cyan White
Bright Black Red Green Yellow Blue Magenta Cyan White

Примечания

[править | править код]
  1. ↑ NIST list of withdrawn standards
  2. ↑ Paul Williams. Digital's Video Terminals. VT100.net (2006). Дата обращения: 17 августа 2011. Архивировано из оригинала 6 августа 2011 года.
  3. ↑ Heathkit Company. Heathkit Catalog 1979. Heathkit Company (1979). Дата обращения: 4 ноября 2011. Архивировано из оригинала 13 января 2012 года.
  4. ↑ Michael Mefford. ANSI.com: Download It Here. PC Magazine (7 февраля 1989). Дата обращения: 10 августа 2011. Архивировано 18 декабря 2012 года.
  5. ↑ Dan Kegel, Eric Auer. Nansi and NNansi - ANSI Drivers for MS-DOS. Dan Kegel's Web Hostel (28 февраля 1999). Дата обращения: 10 августа 2011. Архивировано 18 декабря 2012 года.
  6. ↑ имена стандартны, но точные значения цветов не стандартизированы и зависит от устройства, которое их отображает.