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 следует открывающая квадратная скобка [ (CSI — Control 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 →