Control Sequence Introducer
Control Sequence Introducer (CSI) — это управляющая последовательность в стандарте ANSI X3.64 (ECMA-48), используемая для передачи команд терминалу или эмулятору терминала. CSI является частью семейства escape-последовательностей, которые позволяют управлять отображением текста, положением курсора, цветами, атрибутами и другими параметрами вывода на текстовых терминалах и в консольных приложениях. Последовательность CSI начинается с символа ESC (код 27 в десятичной системе, 0x1B в шестнадцатеричной) и символа [ (левая квадратная скобка), что в совокупности записывается как ESC[ или \x1b[ в программном коде.
История и стандартизация
Происхождение CSI связано с развитием текстовых терминалов в 1970-х годах. Первоначально escape-последовательности использовались для управления такими устройствами, как VT52 (Digital Equipment Corporation, DEC). В 1978 году DEC выпустила терминал VT100, который стал основой для стандарта ANSI X3.64-1979, позже принятого как международный стандарт ECMA-48. CSI был введён как универсальный способ передачи команд, заменив более ранние, менее структурированные последовательности.
Стандарт ECMA-48 (ныне ISO/IEC 6429) определяет CSI как часть набора управляющих последовательностей C1 (Control Functions for Coded Character Sets). В этом стандарте CSI обозначается как управляющий символ с кодом 0x9B в 8-битной кодировке, однако в 7-битной среде (например, ASCII) он представляется двумя символами: ESC (0x1B) и [ (0x5B). Такой дуализм связан с историческими ограничениями: 7-битные каналы передачи данных не могли передавать символы с кодами выше 127.
В СССР и России стандарт ANSI X3.64 был адаптирован как ГОСТ 27465-87 (система обработки информации, кодирование символов, управляющие функции), который регламентировал использование CSI в отечественных терминалах, таких как «Электроника 85» и «Видеотон». В современных операционных системах, включая Linux, macOS и Windows (начиная с Windows 10), CSI поддерживается на уровне консольного драйвера или эмулятора терминала.
Структура последовательности CSI
Формат CSI-последовательности имеет следующий синтаксис:
`` CSI [P1;P2;...Pn] [I] F ``
Где:
- CSI — начальная последовательность (
ESC[или 0x9B). - P1;P2;...Pn — необязательные числовые параметры, разделённые точкой с запятой (;). Если параметр опущен, он принимает значение по умолчанию (обычно 1 или 0). Параметры могут быть десятичными числами от 0 до 65535.
- I — необязательный промежуточный символ (intermediate byte), который расширяет функциональность. В стандарте ECMA-48 определены промежуточные символы из диапазона 0x20–0x2F (пробел, цифры и знаки препинания).
- F — завершающий символ (final byte), который определяет конкретную команду. Завершающие символы находятся в диапазоне 0x40–0x7E (например,
A,B,H,m,J).
Примеры:
ESC[2J— очистка экрана (параметр 2, завершающий символJ).ESC[1;31m— установка красного цвета текста (параметр 1 — яркость, параметр 31 — красный, завершающий символm).ESC[10;20H— перемещение курсора на строку 10, столбец 20 (завершающий символH).
Классификация команд CSI
Команды CSI делятся на несколько категорий в зависимости от их назначения. Ниже приведены основные группы с примерами.
Управление курсором
Эти команды перемещают курсор или изменяют его положение на экране. Они широко используются в текстовых интерфейсах и редакторах.
| Команда | Описание | Пример |
|---|---|---|
C | Перемещение курсора вправо на N столбцов | ESC[5C — на 5 вправо |
D | Перемещение курсора влево на N столбцов | ESC[3D — на 3 влево |
A | Перемещение курсора вверх на N строк | ESC[2A — на 2 строки вверх |
B | Перемещение курсора вниз на N строк | ESC[1B — на 1 строку вниз |
H | Прямое позиционирование курсора (строка, столбец) | ESC[5;10H — строка 5, столбец 10 |
f | Альтернативное позиционирование (аналогично H) | ESC[1;1f — левый верхний угол |
Управление отображением и стилями
Команды с завершающим символом m (Select Graphic Rendition, SGR) задают атрибуты текста: цвет, насыщенность, подчёркивание, мигание и другие.
| Параметр | Атрибут | Пример |
|---|---|---|
| 0 | Сброс всех атрибутов | ESC[0m |
| 1 | Яркий (жирный) текст | ESC[1m |
| 4 | Подчёркнутый текст | ESC[4m |
| 5 | Мигающий текст | ESC[5m |
| 7 | Инвертированные цвета | ESC[7m |
| 30–37 | Цвет текста (чёрный, красный, зелёный, жёлтый, синий, пурпурный, голубой, белый) | ESC[31m — красный |
| 40–47 | Цвет фона | ESC[42m — зелёный фон |
| 90–97 | Яркий цвет текста | ESC[91m — ярко-красный |
| 100–107 | Яркий цвет фона | ESC[102m — ярко-зелёный фон |
Пример комбинации: ESC[1;31;42m — яркий красный текст на зелёном фоне.
Управление экраном и буфером
Команды с завершающим символом J (Erase in Display) и K (Erase in Line) очищают части экрана или строки.
| Команда | Параметр | Описание |
|---|---|---|
J | 0 | Очистка от курсора до конца экрана |
J | 1 | Очистка от начала экрана до курсора |
J | 2 | Очистка всего экрана |
K | 0 | Очистка от курсора до конца строки |
K | 1 | Очистка от начала строки до курсора |
K | 2 | Очистка всей строки |
Управление режимами терминала
Команды с завершающим символом h (Set Mode) и l (Reset Mode) включают или отключают различные режимы терминала, такие как режим вставки, автоматический перенос строк, курсор и другие.
| Параметр | Режим | Описание |
|---|---|---|
| 4 | Insert Mode | Включение режима вставки |
| 20 | Auto Newline | Автоматический перевод строки |
| 25 | Cursor Visible | Показывать курсор |
| 7 | Line Wrap | Автоматический перенос строк |
Пример: ESC[?25l — скрыть курсор (параметр 25, режим сброса).
Применение CSI
Консольные приложения и эмуляторы терминалов
CSI широко используется в операционных системах для создания текстовых интерфейсов. В Linux и macOS эмуляторы терминалов (например, xterm, GNOME Terminal, iTerm2) поддерживают ANSI-последовательности, включая CSI. В Windows, начиная с версии 10, консоль также поддерживает CSI, что позволило унифицировать разработку кроссплатформенных приложений.
Программирование и библиотеки
В языках программирования CSI часто применяется для вывода форматированного текста. Например, в Python: ``python print("\x1b[1;32mЗелёный жирный текст\x1b[0m") `` В C и C++ используются макросы или строки с escape-последовательностями. Библиотеки, такие как ncurses (Linux) и PDCurses (Windows), абстрагируют работу с CSI, предоставляя высокоуровневый API.
Текстовые редакторы и утилиты
Редакторы, такие как Vim, Emacs, и утилиты вроде less и top, активно используют CSI для обновления экрана, цветовой подсветки и управления курсором. Например, в Vim команда :highlight устанавливает цвета через SGR-последовательности.
Игры и анимации
В консольных играх и демосценах CSI применяется для создания анимаций, рисования графики (ASCII-арт) и управления цветами. Например, игра «Rogue» (1980) использовала CSI для перемещения курсора, а современные проекты, такие как «Dwarf Fortress», используют CSI для отображения сложных интерфейсов.
Проблемы и ограничения
Совместимость
Не все терминалы и эмуляторы полностью поддерживают CSI. Некоторые старые терминалы (например, VT52) используют собственные escape-последовательности, отличные от ANSI. В современных системах эмуляторы могут иметь различия в реализации: например, в Windows 10 до обновления 2018 года поддержка CSI была ограниченной.
Безопасность
CSI-последовательности могут быть использованы для атак на терминалы, известных как «терминальные инъекции» (terminal injection). Злоумышленник может внедрить CSI в вывод программы, чтобы изменить отображение, скрыть данные или выполнить произвольные команды (например, через последовательности, управляющие буфером). В связи с этим в некоторых системах (например, в браузерах) CSI-последовательности фильтруются или экранируются.
Производительность
В приложениях с интенсивным выводом (например, видео в терминале) частое использование CSI может приводить к задержкам из-за обработки последовательностей драйвером терминала. Для оптимизации применяются буферизация и пакетная отправка команд.
Интересные факты
- CSI-последовательности используются в протоколах удалённого доступа, таких как SSH и Telnet, для передачи управляющих команд между клиентом и сервером.
- В стандарте ECMA-48 определено более 100 различных команд CSI, но на практике используется около 30–40.
- В России CSI применялся в терминалах «Электроника 85» (аналог VT100) и в системе «Видеотон» для отображения текстовой информации.
- В современных эмуляторах терминалов (например, Alacritty, Kitty) поддержка CSI расширена за счёт дополнительных последовательностей, не входящих в стандарт (например, для управления цветовой палитрой True Color).
Источники
- ECMA International. Standard ECMA-48: Control Functions for Coded Character Sets. 5th edition, 1991.
- ISO/IEC 6429:1992. Information technology — Control functions for coded character sets.
- Digital Equipment Corporation. VT100 User Guide. 1979.
- ГОСТ 27465-87. Системы обработки информации. Кодирование символов. Управляющие функции.
- Shill, R. (2021). ANSI Escape Sequences: A Comprehensive Guide. GitHub Repository.
- FreeBSD Documentation Project. Terminal Control Sequences. 2023.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →