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

Коды escape ANSI

Код escape ANSI — это короткая последовательность символов, которую программа выводит, чтобы сказать терминалу сделать что-то другое, чем просто показать эти символы — покрасить следующие слова в красный, переместить курсор на две строки вверх, очистить экран. Терминал поглощает последовательность и исполняет её, поэтому лог с этими кодами выглядит как шум при открытии в редакторе.

Каждый код ниже начинается с символа escape и, за одним исключением, открывающей скобкой. Столбец параметров показывает часть между скобкой и конечной буквой, то есть то, что вы собираете в коде; первый столбец показывает всю последовательность так, как вы бы её написали в shell.

Поддержка варьируется между терминалами, и эта страница указывает это там, где это важно. Восемь основных цветов и полужирный работают везде; мигание, двойное подчеркивание и true color не работают.

Строение последовательности

6

Каждый код на этой странице имеет одинаковую структуру: символ escape, открывающая скобка, параметры и одна буква, которая говорит, что с ними делать.

ПоследовательностьПараметрЭффект
\e0x1BСимвол escape, который начинает каждую последовательностьПишется \e в shell, \033 в C, \x1b в большинстве языков и \u001b в JSON и Java.
\e[CSIControl Sequence Introducer — открывает параметризованную команду
\e[<n>mmSelect Graphic Rendition: все цвета и стили заканчиваются на m
\e[1;4;31m1;4;31Несколько параметров сразу, разделённых точками с запятойПолужирный, подчеркнутый и красный в одной последовательности — короче, чем три отдельные, и одинаковый эффект.
\e[0m0Сбрасывает все атрибуты к умолчанию терминалаВыведите это в конце цветного вывода. Программа, завершающаяся без него, оставляет пользователю цветное приглашение.
\e]8;;URL\e\\text\e]8;;\e\\OSC 8Кликабельная гиперссылка в терминалах, которые её поддерживаютЭто последовательность OSC, а не CSI, и заканчивается ESC \ вместо буквы.

Атрибуты текста

14

Поддержка неровная ниже первых пяти. Мигание почти везде игнорируется, и некоторые терминалы отображают тусклое и курсив одинаково.

ПоследовательностьПараметрЭффект
\e[1m1Полужирный или яркий
\e[2m2Тусклый
\e[3m3Курсив
\e[4m4Подчеркнутый
\e[5m5МиганиеОбычно игнорируется; современные терминалы отображают его как обычный текст.
\e[7m7Инверсия: меняет местами передний и задний план
\e[8m8Скрытый: текст есть, но не отображается
\e[9m9Зачёркнутый
\e[21m21Двойное подчеркиваниеНекоторые терминалы читают 21 как "отключить полужирный".
\e[22m22Нормальная интенсивность: отменяет полужирный и тусклый
\e[23m23Отменяет курсив
\e[24m24Отменяет подчеркивание
\e[27m27Отменяет инверсию
\e[29m29Отменяет зачёркивание

Цвет текста

17

Восемь стандартных цветов и их яркие аналоги. То, что видит читатель, зависит от темы его терминала — «красный» это позиция в палитре, не шестнадцатеричное значение.

ПоследовательностьПараметрЭффект
\e[30m30Чёрный текст
\e[31m31Красный текст
\e[32m32Зелёный текст
\e[33m33Жёлтый текст
\e[34m34Синий текст
\e[35m35Пурпурный текст
\e[36m36Голубой текст
\e[37m37Белый текст
\e[39m39Вернуться к цвету текста по умолчанию
\e[90m90Яркий чёрный текст
\e[91m91Яркий красный текст
\e[92m92Яркий зелёный текст
\e[93m93Яркий жёлтый текст
\e[94m94Яркий синий текст
\e[95m95Яркий пурпурный текст
\e[96m96Яркий голубой текст
\e[97m97Яркий белый текст

Цвет фона

17

Та же палитра, сдвинутая на десять. Код фона устанавливает ячейку позади текста и остаётся в действии, пока не будет отменён.

ПоследовательностьПараметрЭффект
\e[40m40Чёрный фон
\e[41m41Красный фон
\e[42m42Зелёный фон
\e[43m43Жёлтый фон
\e[44m44Синий фон
\e[45m45Пурпурный фон
\e[46m46Голубой фон
\e[47m47Белый фон
\e[49m49Вернуться к фону по умолчанию
\e[100m100Яркий чёрный фон
\e[101m101Яркий красный фон
\e[102m102Яркий зелёный фон
\e[103m103Яркий жёлтый фон
\e[104m104Яркий синий фон
\e[105m105Яркий пурпурный фон
\e[106m106Яркий голубой фон
\e[107m107Яркий белый фон

256 цветов и true color

4

Два расширения одного механизма SGR. Оба широко, но не повсеместно поддерживаются; терминал, который их не понимает, обычно игнорирует последовательность.

ПоследовательностьПараметрЭффект
\e[38;5;<n>m38;5;nТекст цветом палитры n, 0–2550–15 это шестнадцать выше, 16–231 куб цветов 6×6×6, 232–255 шкала серого.
\e[48;5;<n>m48;5;nФон цветом палитры n, 0–255
\e[38;2;<r>;<g>;<b>m38;2;r;g;bТекст точным 24-битным цветом
\e[48;2;<r>;<g>;<b>m48;2;r;g;bФон точным 24-битным цветом

Движение курсора

11

Движения не прокручивают и не переносят: курсор уже вверху экрана игнорирует запрос подняться.

ПоследовательностьПараметрЭффект
\e[<n>AAВверх на n строк
\e[<n>BBВниз на n строк
\e[<n>CCВправо на n столбцов
\e[<n>DDВлево на n столбцов
\e[<n>EEВниз на n строк, в начало строки
\e[<n>FFВверх на n строк, в начало строки
\e[<n>GGВ столбец n текущей строки
\e[<row>;<col>HHНа абсолютную строку и столбец, считая с 1
\e[ssЗапомнить позицию курсора
\e[uuВернуться к запомненной позиции
\e[6n6nСпросить терминал, где находится курсорТерминал отвечает на стандартный ввод как \e[<строка>;<столбец>R — единственная последовательность здесь, которая даёт ответ.

Стирание

7

Стирание пишет пробелы текущим цветом фона; курсор не движется.

ПоследовательностьПараметрЭффект
\e[0J0JСтереть от курсора до конца экрана
\e[1J1JСтереть от начала экрана до курсора
\e[2J2JСтереть весь экранКурсор остаётся там, где он был — поэтому обычно комбинируется с \e[H.
\e[3J3JСтереть также буфер прокрутки
\e[0K0KСтереть от курсора до конца строки
\e[1K1KСтереть от начала строки до курсора
\e[2K2KСтереть всю строку\r\e[2K обычный способ перерисовать строку прогресса на месте.

Режимы терминала

8

Частные режимы, отмеченные вопросительным знаком. Они меняют поведение терминала, а не внешний вид одного куска текста, и каждый надо отключить перед выходом из программы.

ПоследовательностьПараметрЭффект
\e[?25l?25lСкрыть курсор
\e[?25h?25hПоказать курсор
\e[?1049h?1049hПереключиться на альтернативный экранТо, что использует полноэкранная программа, чтобы история shell под ней сохранилась.
\e[?1049l?1049lПереключиться обратно на основной экран
\e[?7h?7hПереносить длинные строки на правом краю
\e[?7l?7lПозволить длинным строкам выходить за правый край
\e[?2004h?2004hВключить bracketed pasteВставленный текст приходит обёрнутый в \e[200~ и \e[201~, так что shell может различить ввод с клавиатуры и вставку.
\e[?2004l?2004lОтключить bracketed paste

FAQ

Почему вывод остаётся цветным после завершения программы?
Потому что его ничего не сбросило. Код цвета остаётся в действии, пока его не заменит другой, поэтому программа, завершающаяся посередине цвета, передаёт шелу цветное приглашение. Перед выходом выведите \e[0m — включая путь ошибки, на который обычно забывают.
В чём разница между \e, \033 и \x1b?
Никакой. Все три — это один и тот же байт 0x1B, записанный так, как его пишет конкретный язык: \e в bash и zsh, \033 в C и echo -e, \x1b в Python, Go, Rust и JavaScript, \u001b где допускается только Unicode escape, например в JSON и Java.
Как удалить их из файла логов?
Вставьте его в средство удаления ANSI кодов на этом сайте. Оно удаляет последовательности цвета, курсора и режима и может также преобразовать цвета в HTML или Markdown вместо удаления, что вам нужно, если смысл лога был в выделении.
Должен ли я жёстко кодировать цвета или использовать библиотеку?
Для чего-либо больше чем несколько строк используйте библиотеку — она проверит, является ли вывод вообще терминалом. Коды цвета, записанные в трубу или файл, остаются в файле, и так build логи приобретают шум.
Одно ли полужирный с ярким?
Исторически да, и на некоторых терминалах до сих пор. Код 1 был определён как полужирный, но многие терминалы реализовали его переключением на яркую половину палитры, так что полужирный красный и яркий красный могут выглядеть одинаково. Диапазон 90–97 существует, чтобы вы могли просить яркое без полужирного.