Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Последовательности виртуальных терминалов — это последовательности символов управления, которые могут управлять перемещением курсора, цветом консоли и другими операциями при записи в выходной поток. Последовательности также могут быть получены в входном потоке в ответ на последовательность данных запроса выходного потока или в качестве кодировки входных данных пользователя при установке соответствующего режима.
Для настройки этого поведения можно использовать функции GetConsoleMode и SetConsoleMode . В конце этого документа представлен пример предлагаемого способа включения поведения виртуальных терминалов.
Поведение следующих последовательностей основано на технологиях эмулятора терминала VT100 и производных эмуляторов терминалов, в частности эмулятора терминала xterm. Дополнительные сведения о последовательностях терминалов можно найти по http://vt100.net адресу и по адресу http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.
Выходные последовательности
Следующие последовательности терминалов перехватываются узлом консоли при записи в выходной поток, если флаг ENABLE_VIRTUAL_TERMINAL_PROCESSING установлен в дескриптор буфера экрана с помощью функции SetConsoleMode . Обратите внимание, что флаг DISABLE_NEWLINE_AUTO_RETURN также может оказаться полезным для эмулирования расположения курсора и прокрутки других эмуляторов терминала в отношении символов, записанных в последний столбец в любой строке.
Простая позиция курсора
Во всех следующих описаниях ESC всегда является шестнадцатеричным значением 0x1B. Пробелы не должны быть включены в последовательности терминалов. Отдельные последовательности терминалов могут быть разделены по любому символу или байтам по нескольким последовательным вызовам WriteFile или WriteConsole , но рекомендуется включить всю последовательность в один вызов. Пример использования этих последовательностей на практике см. в примере в конце этого раздела.
В следующей таблице описываются простые escape-последовательности с одной командой действия непосредственно после символа ESC. Эти последовательности не имеют параметров и немедленно вступают в силу.
Все команды в этой таблице обычно эквивалентны вызову API консоли SetConsoleCursorPosition для размещения курсора.
Перемещение курсора будет привязано текущим окном представления к буферу. Прокрутка (если она доступна) не будет выполняться.
| Последовательность | Стенография | Поведение |
|---|---|---|
| ESC M | РИ | Обратный индекс — выполняет обратную операцию \n, перемещает курсор вверх по одной строке, сохраняет горизонтальное положение, буфер прокрутки при необходимости* |
| ESC 7 | DECSC | Сохранение позиции курсора в памяти** |
| ESC 8 | DECSR | Восстановление позиции курсора из памяти** |
Замечание
* Если есть поля прокрутки, ri внутри полей прокрутит только содержимое полей и оставьте окно просмотра без изменений. (См. поля прокрутки)
**Нет значения, сохраненного в памяти, пока не будет выполнено первое использование команды сохранения. Единственным способом доступа к сохраненному значению является команда восстановления.
Размещение курсора
В следующих таблицах содержатся последовательности типов вводного элемента управления (CSI). Все последовательности CSI начинаются с ESC (0x1B), за которым следует [ (левая скобка, 0x5B) и могут содержать параметры переменной длины, чтобы указать дополнительные сведения для каждой операции. Это будет представлено коротким <n>. Каждая таблица ниже сгруппирована по функциям с заметками ниже каждой таблицы, объясняющей, как работает группа.
Для всех параметров применяются следующие правила, если не указано иное:
- <n> представляет расстояние для перемещения и является необязательным параметром
- Если <n> опущен или равен 0, он будет рассматриваться как 1
- <n> не может быть больше 32 767 (максимальное короткое значение)
- <n> не может быть отрицательным
Все команды в этом разделе обычно эквивалентны вызову API консоли SetConsoleCursorPosition .
Перемещение курсора будет привязано текущим окном представления к буферу. Прокрутка (если она доступна) не будет выполняться.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ <n> A | CUU | Курсор вверх | Курсор вверх по <n> |
| ESC [ <n> B | ЖВАЧКА | Курсор вниз | Курсор вниз по <n> |
| ESC [ <n> C | CUF | Переадресация курсора | Курсор вперед (справа) на <n> |
| ESC [ <n> D | ЩЕНОК | Курсор назад | Курсор назад (слева) на <n> |
| ESC [ <n> E | CNL | Следующая строка курсора | Курсор вниз <по n> строкам из текущей позиции |
| ESC [ <n> F | CPL | Предыдущая строка курсора | Курсор вверх <по n> строкам из текущей позиции |
| ESC [ <n> G | CHA | Курсор горизонтального абсолютного | Курсор перемещается в <положение n-го>по горизонтали в текущей строке |
| ESC [ <n> d | VPA | Абсолютная позиция вертикальной линии | Курсор перемещается в <положение n-го>по вертикали в текущем столбце |
| ESC [ <y> ; <x> H | ЧАШКА | Положение курсора | *Курсор перемещается на <x>; <Координата y в области просмотра, где <x> — столбец <строки y>> |
| ESC [ <y>; <x f> | HVP | Горизонтальное вертикальное положение | *Курсор перемещается на <x>; <Координата y в области просмотра, где <x> — столбец <строки y>> |
| ESC [ s | ANSISYSSC | Сохранение курсора — эмуляция Ansi.sys | **Без параметров выполняет операцию сохранения курсора, например DECSC |
| ESC [ u | ANSISYSRC | Курсор восстановления — эмуляция Ansi.sys | **Без параметров выполняет операцию курсора восстановления, например DECRC |
Замечание
*<X> и y> имеют те же ограничения, что <и <n> выше. Если <x> и <y> опущены, они будут иметь значение 1;1.
**ANSI.sys историческую документацию можно найти https://msdn.microsoft.com/library/cc722862.aspx и реализовать для удобства и совместимости.
Видимость курсора
Следующие команды управляют видимостью курсора и его состоянием мигания. Последовательности DECTCEM обычно эквивалентны вызову API консоли SetConsoleCursorInfo для переключения видимости курсора.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ ? 12 ч | ATT160 | Включение мигания в текстовом курсоре | Запуск мигания курсора |
| ESC [ ? 12 l | ATT160 | Отключение мигания текстового курсора | Остановить мигание курсора |
| ESC [ ? 25 ч | DECTCEM | Отображение режима включения текстового курсора | Отображение курсора |
| ESC [ ? 25 л | DECTCEM | Скрытие режима включения текстового курсора | Скрытие курсора |
Подсказка
Включение последовательностей заканчивается строчным символом H (h), а последовательности отключения заканчиваются строчным символом L (l).
Фигура курсора
Следующие команды управляют и позволяют настраивать фигуру курсора.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ 0 SP q | DECSCUSR | Фигура пользователя | Фигура курсора по умолчанию, настроенная пользователем |
| ESC [ 1 SP q | DECSCUSR | Блок мигания | Фигура курсора блока мигания |
| ESC [ 2 SP q | DECSCUSR | Устойчивый блок | Устойчивая фигура курсора блока |
| ESC [ 3 SP q | DECSCUSR | Подчеркивание мигания | Фигура курсора подчеркивания мигания |
| ESC [ 4 SP q | DECSCUSR | Устойчивое подчеркивание | Фигура курсора устойчивого подчеркивания |
| ESC [ 5 SP q | DECSCUSR | Мигающий бар | Фигура курсора индикатора мигания |
| ESC [ 6 SP q | DECSCUSR | Устойчивый бар | Фигура курсора устойчивой панели |
Замечание
SP — символ пробела литерала (0x20) в промежуточной позиции, за которым следует q (0x71) в конечной позиции.
Размещение в представлении
Все команды в этом разделе обычно эквивалентны вызову API консоли ScrollConsoleScreenBuffer для перемещения содержимого буфера консоли.
Осторожность Имена команд вводят в заблуждение. Прокрутка ссылается на то, в каком направлении текст перемещается во время операции, а не по пути перемещения окна просмотра.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ <n> S | SU | Прокрутка вверх | Прокрутите текст вверх по <n>. Также называется сдвига вниз, новые строки заполняются в нижней части экрана |
| ESC [ <n> T | стандартное разрешение (SD) | Прокрутите вниз | Прокрутите вниз по <n>. Также называется сдвига, новые строки заполняются в верхней части экрана |
Текст перемещается, начиная с строки курсора. Если курсор находится в средней строке окна представления, прокрутите внизу половину окна просмотра и вставьте пустые строки внизу. Прокрутите вниз верхнюю половину строк окна представления и вставьте новые строки вверху.
Также важно отметить, что прокрутка вверх и вниз также влияет на поля прокрутки. Прокрутка вверх и вниз не влияет на какие-либо линии за пределами полей прокрутки.
Значение по умолчанию для <n> равно 1, а значение может быть опущено необязательно.
Изменение текста
Все команды в этом разделе обычно эквивалентны вызову API консоли FillConsoleOutputCharacter, FillConsoleOutputAttribute и ScrollConsoleScreenBuffer для изменения содержимого буфера текста.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ <n> @ | ICH | Вставка символа | Вставьте n> пробелы в текущей позиции курсора, переместив <весь существующий текст вправо. Текст, выход из экрана справа, удаляется. |
| ESC [ <n> P | DCH | Удаление символа | Удалите n> символов в текущей позиции курсора, переместив <пробелы с правого края экрана. |
| ESC [ <n> X | ECH | Стереть символ | Удалите <n> символы из текущей позиции курсора, перезаписав их пробелом. |
| ESC [ <n> L | Иллинойс | Вставить строку | <Вставляет n> строк в буфер в положение курсора. Линия курсора включена, и строки под ним будут смещены вниз. |
| ESC [ <n> M | DL | Удалить строку | <Удаляет n> строк из буфера, начиная с строки курсора. |
Замечание
Для IL и DL затрагиваются только строки в полях прокрутки (см. раздел "Прокручиваемые поля"). Если поля не заданы, границы полей по умолчанию являются текущим окном просмотра. Если строки будут перемещены под полями, они удаляются. При удалении строк пустые строки вставляются в нижней части полей, линии извне окна просмотра никогда не затрагиваются.
Для каждой последовательности значение по умолчанию для <n> , если оно опущено, равно 0.
Для следующих команд параметр <n> имеет 3 допустимых значения:
- 0 удаляется из текущей позиции курсора (включительно) до конца строки или отображения
- 1 удаляется с начала строки или отображения до текущей позиции курсора
- 2 удаляет всю строку или отображение
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ <n> J | ЭД | Удаление в отображении | Замените весь текст в текущем режиме или экране, <заданном n> пробелами |
| ESC [ <n> K | EL | Удаление в строке | Замените весь текст в строке курсором <, заданным n> пробелами |
Форматирование текста
Все команды в этом разделе обычно эквивалентны вызову API консоли SetConsoleTextAttribute для настройки форматирования всех будущих операций записи в выходной текстовый буфер консоли.
Эта команда особенно связана с тем, что <указанная ниже позиция n> может принимать от 0 до 16 параметров, разделенных точкой с запятой.
Если параметры не указаны, он обрабатывается так же, как и один параметр 0.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ <n> m | SGR | Настройка представления графики | Задание формата экрана и текста, указанного <в n> |
Следующая таблица значений может использоваться в <n> для представления различных режимов форматирования.
Режимы форматирования применяются слева направо. Применение конкурирующих параметров форматирования приведет к тому, что наиболее правильный вариант имеет приоритет.
Для параметров, определяющих цвета, цвета будут использоваться в таблице цветов консоли, которую можно изменить с помощью API SetConsoleScreenBufferInfoEx . Если таблица изменена, чтобы сделать положение "синий" в таблице отображением оттенка RGB красного цвета, все вызовы foreground Blue будут отображать этот красный цвет, пока в противном случае не изменится.
| Ценность | Описание | Поведение |
|---|---|---|
| 0 | По умолчанию | Возвращает все атрибуты в состояние по умолчанию до изменения |
| 1 | Полужирный или яркий | Применение флага яркости и интенсивности к цвету переднего плана |
| двадцать два | Без полужирного или яркого | Удаляет флаг яркости и интенсивности из цвета переднего плана |
| 4 | Подчеркивание | Добавляет подчеркивание |
| двадцать четыре | Нет подчеркивания | Удаляет подчеркивание |
| 7 | Отрицательные | Переключение переднего плана и фоновых цветов |
| двадцать семь | Положительный (нет отрицательных) | Возвращает передний план или фон в нормальное состояние |
| 30 | Передний план черный | Применяет нежирный или яркий черный к переднему плану |
| 31 | Передний план красный | Применяет нежирный или яркий красный к переднему плану |
| 32 | Передний план зеленый | Применяет нежирный/яркий зеленый к переднему плану |
| 33 | Желтый передний план | Применяет нежирный или яркий желтый к переднему плану |
| 34 | Передний план синий | Применяет нежирный или яркий синий к переднему плану |
| 35 | Передний план Magenta | Применяет нежирный или яркий магдент к переднему плану |
| 36 | Передний план Cyan | Применяет нежирный/яркий синяк на переднем плане |
| 37 | Передний план Белый | Применяет нежирный или яркий белый к переднему плану |
| 38 | Расширенный передний план | Применяет расширенное цветовое значение к переднему плану (см. сведения ниже) |
| 39 | По умолчанию переднего плана | Применяет только часть переднего плана по умолчанию (см. 0). |
| 40 | Фон черный | Применяет нежирный или яркий черный к фону |
| 41 | Цвет фона | Применяет нежирный или яркий красный к фону |
| 42 | Фоновый зеленый | Применяет нежирный или ярко-зеленый к фону |
| 43 | Желтый фон | Применяет нежирный или яркий желтый к фону |
| 44 | Фоновый синий | Применяет нежирный или ярко-синий к фону |
| 45 | Фоновая магента | Применяет нежирный или яркий магдент к фону |
| 46 | Фоновый Cyan | Применяет нежирный/яркий синяк к фону |
| 47 | Фоновый белый | Применяет нежирный или яркий белый к фону |
| 48 | Расширенный фон | Применяет расширенное цветовое значение к фону (см. сведения ниже) |
| 49 | Фоновое значение по умолчанию | Применяет только фоновую часть по умолчанию (см. 0). |
| девяносто | Яркий передний план черный | Применяет полужирный или яркий черный к переднему плану |
| 91 | Яркий передний план красный | Применяет полужирный или яркий красный к переднему плану |
| 92 | Яркий передний план зеленый | Применяет полужирный или ярко-зеленый к переднему плану |
| 93 | Яркий желтый переднего плана | Применяет полужирный или яркий желтый к переднему плану |
| 94 | Яркий передний план синий | Применяет полужирный или яркий синий к переднему плану |
| 95 | Яркое переднее сияние | Применяет полужирный или яркий магдент к переднему плану |
| 96 | Яркий передний план Cyan | Применяет полужирный/яркий цвет к переднему плану |
| 97 | Яркий передний план белый | Применяет полужирный или яркий белый к переднему плану |
| 100 | Яркий фон черный | Применяет полужирный или яркий черный к фону |
| 101 | Яркий цвет фона | Применяет полужирный или яркий красный к фону |
| 102 | Яркий фон зеленый | Применяет полужирный или ярко-зеленый к фону |
| 103 | Яркий желтый фон | Применяет полужирный или яркий желтый к фону |
| 104 | Ярко-синий фон | Применяет полужирный или ярко-синий к фону |
| 105 | Яркий фон magenta | Применяет полужирный или яркий магенциар к фону |
| 106 | Яркий фон Cyan | Применяет полужирный/яркий синяк к фону |
| 107 | Яркий фон белый | Применяет полужирный или яркий белый к фону |
Расширенные цвета
Некоторые эмуляторы виртуального терминала поддерживают палитру цветов, превышающих 16 цветов, предоставляемых консолью Windows. Для этих расширенных цветов консоль Windows выберет ближайший подходящий цвет из существующей 16 цветовой таблицы для отображения. В отличие от стандартных значений SGR выше, расширенные значения будут использовать дополнительные параметры после начального индикатора в соответствии с таблицей ниже.
| SGR Subsequence | Описание |
|---|---|
| 38 ; 2 ; <r> ; <g> ; <b> | Задайте для цвета переднего плана значение RGB, указанное в <r>, <g>, <b> parameters* |
| 48 ; 2 ; <r> ; <g> ; <b> | Задайте для цвета фона значение RGB, указанное в <r>, g>, <<b> parameters* |
| 38 ; 5 ; <s> | Задайте цвет переднего плана индексу <> в таблице цветов 88 или 256* |
| 48 ; 5 ; <s> | Задайте цвет фона> индексу <в таблице цветов 88 или 256* |
*Палитры цветов 88 и 256, поддерживаемые внутренне для сравнения, основаны на эмуляторе терминала xterm. В настоящее время нельзя изменить таблицы сравнения и округления.
Цвета экрана
Следующая команда позволяет приложению задать значения палитры цветов экрана любым значением RGB.
Значения RGB должны быть шестнадцатеричными значениями между 0 и ff, а также разделены символом косой черты вперед (например, rgb:1/24/86).
Обратите внимание, что эта последовательность является последовательностью OSC "Команда операционной системы", а не CSI, как и многие другие последовательности, перечисленные, и как таковое, начинается с "\x1b], а не "\x1b[". Как последовательности OSC, они заканчиваются строковым терминатором , представленным как <ST> и передаваемые с ESC \ (0x1B 0x5C).
BEL (0x7) вместо этого можно использовать в качестве конца, но более длинная форма предпочтительна.
| Последовательность | Описание | Поведение |
|---|---|---|
| ESC ] 4; <i>; rgb: <r> / g> / <<b><ST> | Изменение цветов экрана | Задает индекс <цветовой палитры экрана для> значений RGB, указанных в <r>, g>, <<b> |
Изменения в режиме
Это последовательности, которые управляют режимами ввода. Существует два разных набора входных режимов, режим ключей курсора и режим ключей клавиатуры. Режим ключей курсоров управляет последовательности, создаваемые клавишами со стрелками, а также "Главная" и "Конец", а режим ключей клавиатуры клавиатуры управляет последовательности, создаваемые ключами на цифровой панели, в первую очередь, а также ключами функции.
Каждый из этих режимов — это простые логические параметры: режим ключей курсора — обычный (по умолчанию) или приложение, а режим ключей клавиатуры — числовой (по умолчанию) или приложение.
Дополнительные сведения см. в разделах "Ключи курсора" и "Клавиши numpad" и "Ключи функции" для последовательностей, создаваемых в этих режимах.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC = | DECKPAM | Включение режима приложения клавиатуры | Ключи клавиатуры будут выдавать последовательности режима приложения. |
| ESC > | DECKPNM | Включение числового режима клавиатуры | Ключи клавиатуры будут выдавать их последовательности числовых режимов. |
| ESC [ ? 1 ч | DECCKM | Включение режима приложения ключей курсоров | Ключи клавиатуры будут выдавать последовательности режима приложения. |
| ESC [ ? 1 l | DECCKM | Отключить режим приложения ключей курсоров (использовать обычный режим) | Ключи клавиатуры будут выдавать их последовательности числовых режимов. |
Состояние запроса
Все команды в этом разделе обычно эквивалентны вызову API консоли Get* для получения сведений о состоянии текущего состояния буфера консоли.
Замечание
Эти запросы будут выдавать свои ответы в поток входных данных консоли сразу после того, как он распознается в выходном потоке, а ENABLE_VIRTUAL_TERMINAL_PROCESSING задано. Флаг ENABLE_VIRTUAL_TERMINAL_INPUT не применяется к командам запросов, так как предполагается, что приложение, выполняющее запрос, всегда хочет получить ответ.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ 6 n | DECXCPR | Положение курсора отчета | Выведите позицию курсора следующим образом: ESC [ <r> ; <c> R Where <r> = строка курсора и <c> = столбец курсора |
| ESC [ 0 c | ДА | Атрибуты устройства | Сообщите об удостоверении терминала. Выдаст "\x1b[?1; 0c, указывающий "VT101 без параметров". |
Вкладки
Хотя консоль Windows традиционно ожидает, что вкладки будут исключительно восемь символов широкими, *nix приложения, использующие определенные последовательности, могут управлять тем, где остановки вкладок находятся в окнах консоли для оптимизации перемещения курсора приложением.
Следующие последовательности позволяют приложению задавать расположения стоп-вкладок в окне консоли, удалять их и перемещаться между ними.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC H | HTS | Горизонтальный набор вкладок | Задает остановку табуляции в текущем столбце, в котором находится курсор. |
| ESC [ <n> I | CHT | Вкладка "Горизонтальная курсор" (вперед) | Переведите курсор к следующему столбцу (в той же строке) с помощью остановки табуляции. Если в строке больше нет остановок табуляции, перейдите к последнему столбцу в строке. Если курсор находится в последнем столбце, перейдите к первому столбцу следующей строки. |
| ESC [ <n> Z | CBT | Вкладка назад курсора | Переместите курсор на предыдущий столбец (в той же строке) с остановкой табуляции. Если нет дополнительных остановок табуляции, переместите курсор на первый столбец. Если курсор находится в первом столбце, не перемещает курсор. |
| ESC [ 0 г | TBC | Вкладка "Очистить" (текущий столбец) | Очищает остановку вкладки в текущем столбце, если она есть. В противном случае ничего не делает. |
| ESC [ 3 г | TBC | Tab Clear (все столбцы) | Удаляет все остановки табуляции, заданные в данный момент. |
- Для CHT и CBT n> является необязательным параметром, <который (по умолчанию=1) указывает, сколько раз следует передвигать курсор в указанном направлении.
- Если нет табуляции, заданные через HTS, CHT и CBT будут обрабатывать первые и последние столбцы окна, как только две остановки вкладки.
- При использовании HTS для установки остановки табуляции консоль также приведет к переходу к следующей остановке табуляции в выходных данных символа TAB (0x09, '\t') таким же образом, как CHT.
Назначение набора символов
Следующие последовательности позволяют программе изменять сопоставление активного набора символов. Это позволяет программе выдавать 7-разрядные символы ASCII, но отображать их как другие глифы на экране терминала. В настоящее время единственными двумя поддерживаемыми наборами символов являются ASCII (по умолчанию) и специальный набор графических символов DEC. См http://vt100.net/docs/vt220-rm/table2-4.html . список всех символов, представленных набором специальных графических символов DEC.
| Последовательность | Описание | Поведение |
|---|---|---|
| ESC ( 0 | Назначение набора символов — рисование линии DEC | Включает режим рисования линии DEC |
| ESC (B) | Назначение набора символов — US ASCII | Включает режим ASCII (по умолчанию) |
В частности, режим рисования линии ДЕК используется для рисования границ в консольных приложениях. В следующей таблице показано, что символ ASCII сопоставляется с символом рисования линий.
| Hex | ASCII | Рисование линии DEC |
|---|---|---|
| 0x6a | j | ┘ |
| 0x6b | k | ┐ |
| 0x6c | l | ┌ |
| 0x6d | m | └ |
| 0x6e | н | ┼ |
| 0x71 | q | ─ |
| 0x74 | t | ├ |
| 0x75 | u | ┤ |
| 0x76 | в | ┴ |
| 0x77 | w | ┬ |
| 0x78 | x | │ |
Прокрутка полей
Следующие последовательности позволяют программе настроить "область прокрутки" экрана, затронутого операциями прокрутки. Это подмножество строк, которые корректируются при прокрутке экрана, например на\nили ri. Эти поля также влияют на строки, измененные вставленной строкой (IL) и удалением (DL), прокруткой вверх (SU) и прокруткой вниз (SD).
Поля прокрутки могут быть особенно полезны для того, чтобы часть экрана, которая не прокручивается, когда остальная часть экрана заполнена, например с заголовком в верхней части или строкой состояния в нижней части приложения.
Для DECSTBM существуют два необязательных параметра, <t> и <b>, которые используются для указания строк, представляющих верхние и нижние строки области прокрутки, включительно. Если параметры опущены, <значение> по умолчанию равно 1 и <b> по умолчанию для текущей высоты окна просмотра.
Поля прокрутки являются на буфер, поэтому важно, чтобы альтернативный буфер и основной буфер поддерживали отдельные параметры полей прокрутки (поэтому приложение полноэкранного в альтернативном буфере не отравляет поля основного буфера).
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ <t> ; <b> r | DECSTBM | Настройка области прокрутки | Задает поля прокрутки VT окна просмотра. |
Заголовок окна
Следующие команды позволяют приложению задать заголовок окна консоли заданным <параметром строки> . Строка должна быть меньше 255 символов, которые должны приниматься. Это эквивалентно вызову SetConsoleTitle с заданной строкой.
Обратите внимание, что эти последовательности являются последовательностями OSC "Команда операционной системы", а не CSI, как и многие другие последовательности, перечисленные, и как это начинается с "\x1b], а не "\x1b[". Как последовательности OSC, они заканчиваются строковым терминатором , представленным как <ST> и передаваемые с ESC \ (0x1B 0x5C).
BEL (0x7) вместо этого можно использовать в качестве конца, но более длинная форма предпочтительна.
| Последовательность | Описание | Поведение |
|---|---|---|
| ESC ] 0; <струна><УЛ> | Установка заголовка окна | Задает заголовок <окна консоли строкой>. |
| ESC ] 2; <струна><УЛ> | Установка заголовка окна | Задает заголовок <окна консоли строкой>. |
Завершающий символ здесь — символ "Колокол", "\x07"
Альтернативный буфер экрана
*Приложения стилей Nix часто используют альтернативный буфер экрана, чтобы они могли изменять все содержимое буфера, не влияя на запущенное приложение. Альтернативный буфер — это именно измерения окна без каких-либо областей прокрутки.
Для примера этого поведения рассмотрим, когда vim запускается из bash. Vim использует всю часть экрана для редактирования файла, а затем возврат к bash оставляет исходный буфер без изменений.
| Последовательность | Описание | Поведение |
|---|---|---|
| ESC [ ? 1 0 4 9 ч | Использование альтернативного буфера экрана | Переключается на новый альтернативный буфер экрана. |
| ESC [ ? 1 0 4 9 l | Использование основного буфера экрана | Переключается на основной буфер. |
Ширина окна
Следующие последовательности можно использовать для управления шириной окна консоли. Они примерно эквивалентны вызову API консоли SetConsoleScreenBufferInfoEx, чтобы задать ширину окна.
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ ? 3 ч | DECCOLM | Задать число столбцов в 132 | Задает ширину консоли 132 столбцам. |
| ESC [ ? 3 л | DECCOLM | Задайте для числа столбцов значение 80 | Задает ширину консоли в 80 столбцов. |
Обратимый сброс
Следующая последовательность может использоваться для сброса определенных свойств в значения по умолчанию. Следующие свойства сбрасываются до следующих значений по умолчанию (также перечислены последовательности, управляющие этими свойствами):
- Видимость курсора: видимая (DECTEM)
- Числовая клавиатура: числовой режим (DECNKM)
- Режим ключей курсора: обычный режим (DECCKM)
- Верхние и нижние поля: top=1, Bottom=Console height (DECSTBM)
- Набор символов: US ASCII
- Представление графики: по умолчанию или отключению (SGR)
- Сохранение состояния курсора: положение дома (0,0) (DECSC)
| Последовательность | Код | Описание | Поведение |
|---|---|---|---|
| ESC [ ! п | DECSTR | Обратимый сброс | Сбросьте определенные параметры терминала в значения по умолчанию. |
Входные последовательности
Следующие последовательности терминалов создаются узлом консоли во входном потоке, если флаг ENABLE_VIRTUAL_TERMINAL_INPUT установлен в дескриптор входного буфера с помощью флага SetConsoleMode.
Существует два внутренних режима, которые определяют, какие последовательности создаются для заданных входных ключей, режима клавиш курсора и режима ключей клавиатуры. Они описаны в разделе "Изменения режима".
Клавиши курсора
| Ключ | Обычный режим | Режим приложения |
|---|---|---|
| СТРЕЛКА ВВЕРХ | ESC [ A | ESC O A |
| Стрелка вниз | ESC [ B | ESC O B |
| Стрелка вправо | ESC [ C | ESC O C |
| Стрелка влево | ESC [ D | ESC O D |
| Дом | ESC [ H | ESC O H |
| Конец | ESC [ F | ESC O F |
Кроме того, если клавиши CTRL нажимаются с помощью любого из этих ключей, вместо этого создаются следующие последовательности независимо от режима клавиш курсора:
| Ключ | Любой режим |
|---|---|
| CTRL+СТРЕЛКА ВВЕРХ | ESC [ 1; 5 A |
| CTRL+СТРЕЛКА ВНИЗ | ESC [ 1; 5 B |
| CTRL+СТРЕЛКА ВПРАВО | ESC [ 1; 5 C |
| CTRL +СТРЕЛКА ВЛЕВО | ESC [ 1; 5 D |
Клавиши Numpad и функции
| Ключ | Последовательность |
|---|---|
| Бэкспейс | 0x7f (DEL) |
| Пауза | 0x1a (SUB) |
| Побег | 0x1b (ESC) |
| Вставить | ESC [ 2 ~ |
| Удалить | ESC [ 3 ~ |
| Пэйдж Ап | ESC [ 5 ~ |
| Страница вниз | ESC [ 6 ~ |
| F1 | ESC O P |
| F2 | ESC O Q |
| F3 | ESC O R |
| F4 | ESC O S |
| Клавиша F5 | ESC [ 1 5 ~ |
| F6 | ESC [ 1 7 ~ |
| F7 | ESC [ 1 8 ~ |
| F8 | ESC [ 1 9 ~ |
| F9 | ESC [ 2 0 ~ |
| F10 | ESC [ 2 1 ~ |
| F11 | ESC [ 2 3 ~ |
| F12 | ESC [ 2 4 ~ |
Модификаторы
Alt обрабатывается префиксом последовательности с помощью escape-файла: ESC <c> , где <c> — символ, передаваемый операционной системой. Alt+CTRL обрабатывается так же, как и операционная система, предварительно переместив <клавишу C> в соответствующий символ управления, который будет ретранслирован в приложение.
Ctrl обычно передается точно так же, как показано в системе. Обычно это один символ, смещенный вниз в зарезервированное пространство элемента управления (0x0-0x1f). Например, ctrl+@ (0x40) становится NUL (0x00), CTRL+[ (0x5b) становится ESC (0x1b) и т. д. Несколько сочетаний клавиш CTRL обрабатываются специально в следующей таблице:
| Ключ | Последовательность |
|---|---|
| CTRL+ПРОБЕЛ | 0x00 (NUL) |
| CTRL+СТРЕЛКА ВВЕРХ | ESC [ 1; 5 A |
| CTRL+СТРЕЛКА ВНИЗ | ESC [ 1; 5 B |
| CTRL+СТРЕЛКА ВПРАВО | ESC [ 1; 5 C |
| CTRL +СТРЕЛКА ВЛЕВО | ESC [ 1; 5 D |
Замечание
Клавиши CTRL +RIGHT ALT рассматриваются как ALTGr. При совместном просмотре оба символа будут отрезаны, а значение Юникода, представленного системой, будет передано в целевой объект. Система будет предварительно преобразовывать значения AltGr в соответствии с текущими параметрами входных данных системы.
примеры
Пример последовательностей терминалов SGR
В следующем коде представлено несколько примеров форматирования текста.
#include <stdio.h>
#include <wchar.h>
#include <windows.h>
int main()
{
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
return GetLastError();
}
DWORD dwMode = 0;
if (!GetConsoleMode(hOut, &dwMode))
{
return GetLastError();
}
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(hOut, dwMode))
{
return GetLastError();
}
// Try some Set Graphics Rendition (SGR) terminal escape sequences
wprintf(L"\x1b[31mThis text has a red foreground using SGR.31.\r\n");
wprintf(L"\x1b[1mThis text has a bright (bold) red foreground using SGR.1 to affect the previous color setting.\r\n");
wprintf(L"\x1b[mThis text has returned to default colors using SGR.0 implicitly.\r\n");
wprintf(L"\x1b[34;46mThis text shows the foreground and background change at the same time.\r\n");
wprintf(L"\x1b[0mThis text has returned to default colors using SGR.0 explicitly.\r\n");
wprintf(L"\x1b[31;32;33;34;35;36;101;102;103;104;105;106;107mThis text attempts to apply many colors in the same command. Note the colors are applied from left to right so only the right-most option of foreground cyan (SGR.36) and background bright white (SGR.107) is effective.\r\n");
wprintf(L"\x1b[39mThis text has restored the foreground color only.\r\n");
wprintf(L"\x1b[49mThis text has restored the background color only.\r\n");
return 0;
}
Замечание
В предыдущем примере строка '\x1b[31m' является реализацией ESC [ <n> m с <n> 31.
На следующем рисунке показаны выходные данные предыдущего примера кода.
Пример включения обработки виртуального терминала
В следующем коде приведен пример рекомендуемого способа включения обработки виртуальных терминалов для приложения. Цель примера — продемонстрировать следующее:
Существующий режим всегда следует извлекать с помощью GetConsoleMode и анализировать перед настройкой с помощью SetConsoleMode.
Проверка того, возвращается
0ли SetConsoleMode и GetLastError возвращает ERROR_INVALID_PARAMETER является текущим механизмом для определения при запуске в системе нижнего уровня. Приложение, получающее ERROR_INVALID_PARAMETER с одним из более новых флагов режима консоли в битовом поле, должно корректно снизить поведение и повторить попытку.
#include <stdio.h>
#include <wchar.h>
#include <windows.h>
int main()
{
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
return false;
}
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
if (hIn == INVALID_HANDLE_VALUE)
{
return false;
}
DWORD dwOriginalOutMode = 0;
DWORD dwOriginalInMode = 0;
if (!GetConsoleMode(hOut, &dwOriginalOutMode))
{
return false;
}
if (!GetConsoleMode(hIn, &dwOriginalInMode))
{
return false;
}
DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;
DWORD dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
if (!SetConsoleMode(hOut, dwOutMode))
{
// we failed to set both modes, try to step down mode gracefully.
dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
if (!SetConsoleMode(hOut, dwOutMode))
{
// Failed to set any VT mode, can't do anything here.
return -1;
}
}
DWORD dwInMode = dwOriginalInMode | dwRequestedInModes;
if (!SetConsoleMode(hIn, dwInMode))
{
// Failed to set VT input mode, can't do anything here.
return -1;
}
return 0;
}
Пример выбора юбилейных компонентов обновления
Следующий пример предназначен для более надежного примера кода с помощью различных escape-последовательностей для управления буфером, с акцентом на функции, добавленные в юбилейное обновление для Windows 10.
В этом примере используется альтернативный буфер экрана, управление остановками табуляции, настройка полей прокрутки и изменение набора символов.
// System headers
#include <windows.h>
// Standard library C-style
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>
#define ESC "\x1b"
#define CSI "\x1b["
bool EnableVTMode()
{
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
return false;
}
DWORD dwMode = 0;
if (!GetConsoleMode(hOut, &dwMode))
{
return false;
}
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(hOut, dwMode))
{
return false;
}
return true;
}
void PrintVerticalBorder()
{
printf(ESC "(0"); // Enter Line drawing mode
printf(CSI "104;93m"); // bright yellow on bright blue
printf("x"); // in line drawing mode, \x78 -> \u2502 "Vertical Bar"
printf(CSI "0m"); // restore color
printf(ESC "(B"); // exit line drawing mode
}
void PrintHorizontalBorder(COORD const Size, bool fIsTop)
{
printf(ESC "(0"); // Enter Line drawing mode
printf(CSI "104;93m"); // Make the border bright yellow on bright blue
printf(fIsTop ? "l" : "m"); // print left corner
for (int i = 1; i < Size.X - 1; i++)
printf("q"); // in line drawing mode, \x71 -> \u2500 "HORIZONTAL SCAN LINE-5"
printf(fIsTop ? "k" : "j"); // print right corner
printf(CSI "0m");
printf(ESC "(B"); // exit line drawing mode
}
void PrintStatusLine(const char* const pszMessage, COORD const Size)
{
printf(CSI "%d;1H", Size.Y);
printf(CSI "K"); // clear the line
printf(pszMessage);
}
int __cdecl wmain(int argc, WCHAR* argv[])
{
argc; // unused
argv; // unused
//First, enable VT mode
bool fSuccess = EnableVTMode();
if (!fSuccess)
{
printf("Unable to enter VT processing mode. Quitting.\n");
return -1;
}
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
printf("Couldn't get the console handle. Quitting.\n");
return -1;
}
CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo;
GetConsoleScreenBufferInfo(hOut, &ScreenBufferInfo);
COORD Size;
Size.X = ScreenBufferInfo.srWindow.Right - ScreenBufferInfo.srWindow.Left + 1;
Size.Y = ScreenBufferInfo.srWindow.Bottom - ScreenBufferInfo.srWindow.Top + 1;
// Enter the alternate buffer
printf(CSI "?1049h");
// Clear screen, tab stops, set, stop at columns 16, 32
printf(CSI "1;1H");
printf(CSI "2J"); // Clear screen
int iNumTabStops = 4; // (0, 20, 40, width)
printf(CSI "3g"); // clear all tab stops
printf(CSI "1;20H"); // Move to column 20
printf(ESC "H"); // set a tab stop
printf(CSI "1;40H"); // Move to column 40
printf(ESC "H"); // set a tab stop
// Set scrolling margins to 3, h-2
printf(CSI "3;%dr", Size.Y - 2);
int iNumLines = Size.Y - 4;
printf(CSI "1;1H");
printf(CSI "102;30m");
printf("Windows 10 Anniversary Update - VT Example");
printf(CSI "0m");
// Print a top border - Yellow
printf(CSI "2;1H");
PrintHorizontalBorder(Size, true);
// // Print a bottom border
printf(CSI "%d;1H", Size.Y - 1);
PrintHorizontalBorder(Size, false);
wchar_t wch;
// draw columns
printf(CSI "3;1H");
int line = 0;
for (line = 0; line < iNumLines * iNumTabStops; line++)
{
PrintVerticalBorder();
if (line + 1 != iNumLines * iNumTabStops) // don't advance to next line if this is the last line
printf("\t"); // advance to next tab stop
}
PrintStatusLine("Press any key to see text printed between tab stops.", Size);
wch = _getwch();
// Fill columns with output
printf(CSI "3;1H");
for (line = 0; line < iNumLines; line++)
{
int tab = 0;
for (tab = 0; tab < iNumTabStops - 1; tab++)
{
PrintVerticalBorder();
printf("line=%d", line);
printf("\t"); // advance to next tab stop
}
PrintVerticalBorder();// print border at right side
if (line + 1 != iNumLines)
printf("\t"); // advance to next tab stop, (on the next line)
}
PrintStatusLine("Press any key to demonstrate scroll margins", Size);
wch = _getwch();
printf(CSI "3;1H");
for (line = 0; line < iNumLines * 2; line++)
{
printf(CSI "K"); // clear the line
int tab = 0;
for (tab = 0; tab < iNumTabStops - 1; tab++)
{
PrintVerticalBorder();
printf("line=%d", line);
printf("\t"); // advance to next tab stop
}
PrintVerticalBorder(); // print border at right side
if (line + 1 != iNumLines * 2)
{
printf("\n"); //Advance to next line. If we're at the bottom of the margins, the text will scroll.
printf("\r"); //return to first col in buffer
}
}
PrintStatusLine("Press any key to exit", Size);
wch = _getwch();
// Exit the alternate buffer
printf(CSI "?1049l");
}