Открыть сервис

Escape-последовательность ANSI

Escape-последовательность ANSI (ANSI escape code) — это стандартизированный набор управляющих последовательностей символов, используемый для форматирования текстового вывода в терминалах и эмуляторах терминалов. Эти последовательности позволяют изменять цвет текста и фона, стиль шрифта (жирный, курсив, подчёркнутый), перемещать курсор, очищать экран и выполнять другие действия, не зависящие от конкретного аппаратного обеспечения. Название происходит от стандарта ANSI X3.64 (1979), хотя фактически последовательности были разработаны ранее и получили широкое распространение благодаря системам на базе Unix и MS-DOS.

История

Происхождение escape-последовательностей связано с развитием телетайпов и видеодисплеев. В 1960-х годах компания Digital Equipment Corporation (DEC) выпустила серию терминалов VT, которые использовали управляющие коды для позиционирования курсора и форматирования текста. В 1979 году Американский национальный институт стандартов (ANSI) опубликовал стандарт X3.64, который унифицировал эти коды. Однако реальная популярность пришла с появлением ANSI.SYS — драйвера для MS-DOS, который интерпретировал эти последовательности в текстовом режиме. В 1990-х годах escape-последовательности стали основой для BBS (электронных досок объявлений) и ANSI-арта. В современных операционных системах (Linux, macOS, Windows 10+) они поддерживаются на уровне эмуляторов терминалов (xterm, GNOME Terminal, Windows Terminal).

Структура

Escape-последовательность всегда начинается с символа ESC (ASCII 27, в шестнадцатеричной системе — 0x1B, в управляющей записи — \e или \033). После ESC следует открывающая квадратная скобка [ (CSIControl Sequence Introducer). Далее идут параметры, разделённые точкой с запятой (;), и завершающая буква, определяющая команду. Например, последовательность \e[31m (где \e — ESC) устанавливает красный цвет текста.

Формальная запись

Общий вид: ESC [ <параметры> <команда>

  • ESC — управляющий символ (0x1B).
  • [ — обязательный символ CSI.
  • Параметры — один или несколько чисел (от 1 до 3 цифр), разделённых ;. Если параметр опущен, по умолчанию используется 0.
  • Команда — буква латинского алфавита (например, m для SGR, H для позиционирования курсора).

Классификация команд

Команды делятся на несколько функциональных групп:

Управление курсором

  • CUP (Cursor Position)ESC [ <строка> ; <столбец> H — перемещает курсор в указанную позицию (нумерация с 1).
  • CUU (Cursor Up)ESC [ <n> A — поднимает курсор на n строк.
  • CUD (Cursor Down)ESC [ <n> B — опускает курсор на n строк.
  • CUF (Cursor Forward)ESC [ <n> C — сдвигает курсор вправо на n позиций.
  • CUB (Cursor Back)ESC [ <n> D — сдвигает курсор влево на n позиций.
  • DSR (Device Status Report)ESC [ 6 n — запрашивает позицию курсора; терминал отвечает последовательностью ESC [ <строка> ; <столбец> R.

Очистка экрана и строк

  • ED (Erase Display)ESC [ <n> J:
  • 0 — очистить от курсора до конца экрана.
  • 1 — очистить от начала экрана до курсора.
  • 2 — очистить весь экран (курсор не перемещается).
  • 3 — очистить весь экран и буфер прокрутки (не во всех терминалах).
  • EL (Erase Line)ESC [ <n> K:
  • 0 — очистить от курсора до конца строки.
  • 1 — очистить от начала строки до курсора.
  • 2 — очистить всю строку.

Управление цветом и стилем (SGR — Select Graphic Rendition)

Команда ESC [ <параметры> m — наиболее часто используемая группа. Параметры могут быть комбинированы через точку с запятой. Основные коды:

ПараметрЭффект
0Сброс всех атрибутов (обычный текст, цвета по умолчанию)
1Жирный/яркий текст
2Тусклый (dim)
3Курсив (не везде поддерживается)
4Подчёркнутый
5Медленное мигание
6Быстрое мигание (редко поддерживается)
7Инверсные цвета (текст и фон меняются местами)
8Невидимый (скрытый) текст
9Перечёркнутый
30–37Цвет текста (стандартная палитра)
38Расширенный цвет текста (256 или TrueColor)
39Цвет текста по умолчанию
40–47Цвет фона (стандартная палитра)
48Расширенный цвет фона (256 или TrueColor)
49Цвет фона по умолчанию
90–97Яркий цвет текста (светлые тона)
100–107Яркий цвет фона

Стандартная 8-цветная палитра (коды 30–37 и 40–47):

КодЦветКод (яркий)Цвет
30Чёрный90Тёмно-серый
31Красный91Светло-красный
32Зелёный92Светло-зелёный
33Жёлтый93Светло-жёлтый
34Синий94Светло-синий
35Пурпурный95Светло-пурпурный
36Голубой96Светло-голубой
37Белый97Ярко-белый

Расширенный цвет (256-цветная палитра) задаётся как 38;5;<n> для текста и 48;5;<n> для фона, где n — число от 0 до 255. TrueColor (24-битный) — 38;2;<r>;<g>;<b> (аналогично для фона — 48;2;...). Поддержка TrueColor зависит от терминала.

Режимы и дополнительные команды

  • SM (Set Mode)ESC [ <n> h — включает режим (например, ?25h — показать курсор, ?1049hальтернативный буфер экрана).
  • RM (Reset Mode)ESC [ <n> l — выключает режим (например, ?25l — скрыть курсор).
  • SCP (Save Cursor Position)ESC [ s (некоторые терминалы используют ESC 7).
  • RCP (Restore Cursor Position)ESC [ u (или ESC 8).

Применение

Escape-последовательности ANSI широко используются в:

  • Консольных приложениях — для цветного вывода логов, отчётов, прогресс-баров (например, grep --color, ls --color, git log --graph).
  • Скриптах оболочки (bash, zsh) — для создания интерактивных меню и форматирования подсказок (PS1).
  • ANSI-арте — создание изображений из текстовых символов с цветами (популярно в BBS в 1980–1990-х годах).
  • Современных терминальных интерфейсах — программы вроде htop, vim, tmux используют их для отрисовки интерфейса.
  • Тестировании и отладке — для выделения ошибок или предупреждений в выводе компиляторов и тестовых фреймворков.

Поддержка в операционных системах

  • Unix-подобные системы (Linux, macOS, BSD) — эмуляторы терминалов (xterm, GNOME Terminal, Konsole, iTerm2) поддерживают ANSI-последовательности нативно.
  • Windows — классическая консоль (cmd.exe) до Windows 10 имела ограниченную поддержку (только через ANSI.SYS в DOS). Начиная с Windows 10 версии 1511, встроенная консоль и Windows Terminal поддерживают полный набор последовательностей ANSI.
  • Встраиваемые системы — многие микроконтроллеры и одноплатные компьютеры (например, Arduino с последовательным портом) могут выводить ANSI-коды для взаимодействия с терминалом.

Ограничения и особенности

  • Не все терминалы поддерживают все команды (например, курсив или мигание часто игнорируются).
  • TrueColor (24-битный цвет) поддерживается не всеми эмуляторами (например, старые версии xterm — нет).
  • Последовательности могут быть уязвимостью безопасности (например, инъекция ANSI-кодов в логи может привести к сокрытию вредоносного вывода).
  • Для переносимости рекомендуется использовать библиотеки (например, ncurses в C, colorama в Python), которые абстрагируют различия между терминалами.

Интересные факты

  • Символ ESC (0x1B) в шестнадцатеричном виде часто записывают как \x1b или \033 в языках программирования.
  • В ANSI.SYS для MS-DOS последовательности были ограничены 8 цветами и не поддерживали расширенные палитры.
  • Некоторые BBS (Bulletin Board System) использовали ANSI-арт для создания интерфейсов и логотипов, что привело к появлению сообществ художников (ANSI artists).
  • В современных терминалах последовательность ESC [ 2 J (очистка экрана) может не очищать прокрутку назад, в отличие от ESC [ 3 J.

Источники

  • Стандарт ANSI X3.64 (1979) — Control Functions for Coded Character Sets.
  • Документация ECMA-48 (5-е издание, 1991) — Control Functions for Coded Character Sets.
  • Руководство по ANSI escape-кодам (man-страницы: console_codes в Linux).
  • Спецификация терминала VT100 (Digital Equipment Corporation, 1978).
  • Статья «ANSI escape code» в английской Википедии (версия от 2024 года).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →