Цветовые схемы для терминалов (консолей)

Jul 12, 2022 15:39

Когда-то давно, в прошлом веке, существовали устройства, которые называли «терминалами» и устройства, которые называли «консолями». Эти устройства входили в состав больших и маленьких компьютеров. В то время под «терминалами» и «консолями» подразумевали разные устройства, но сейчас люди забыли, в чем именно между ними была разница. «Терминалы» и «консоли» постепенно превратились из физических устройств в программы, эмулирующие работу тех устройств. Слова «терминал» и «консоль» сегодня стали синонимами. Далее я буду использовать только слово «терминал».

Когда терминал был физическим устройством, в какой-то момент он воплотился в дисплей (экран) с клавиатурой. На дисплее отображался текстовый интерфейс (командная строка), с помощью которого пользователь терминала общался с компьютером. Кроме текстового интерфейса терминал больше ничего не отображал. Сегодня в состав настольного компьютера тоже входят дисплей и клавиатура. Однако, современный дисплей отображает кучу окон с самыми разнообразными программами, а не только текстовый интерфейс (командную строку). Люди продолжили работать и с текстовым интерфейсом, для этого используют программы-«эмуляторы терминала», которые реализуют свои собственные окна с текстовым интерфейсом.

В старые времена дисплеи изначально были монохромные (бинарные), то есть они отображали только два цвета: для текста и для фона. Затем люди отвели для хранения цвета 3 бита и появились дисплеи с поддержкой 8 цветов (в 3 битах можно хранить 8 различных значений). В стандартах для этих 8 цветов определили следующие названия:

black, red, green, yellow, blue, magenta, cyan, white
черный, красный, зеленый, желтый, синий, пурпурный, голубой, белый

Возможно, вы уже видите проблему. В стандартах были определены названия, но не точные значения этих цветов. Каждый производитель терминалов старался подобрать цвета, подходящие под эти названия. Однако, в реальности цвет с одним и тем же названием на терминалах разных производителей мог слегка (а иногда и не слегка) различаться. (Что тут скажешь, если существуют люди, которые не различают пурпурный, лиловый и сиреневый. Кошмар!)

После этого производители терминалов придумали, что каждый из вышеуказанных цветов можно на дисплее делать ярче. Таким образом на терминалах стало возможным использовать 16 цветов. Такую гамму цветов назвали 4-битной (в 4 битах можно хранить 16 различных значений). Перед названием каждого цвета, полученного из исходного увеличением яркости дисплея, добавили слово «bright» (по-русски «яркий»).

Эти 16 наименований цветов сегодня известны под названием «ANSI colors» (по-русски «цвета ANSI»). «ANSI» - это институт США, занимающийся разработкой различных стандартов. То есть под словосочетанием «ANSI colors» подразумевается фраза «цвета, определенные в одном из стандартов, разработанных в ANSI».

Любой из этих 16 цветов мог быть применен пользователем терминала к цвету текста и только 8 базовых цветов ANSI могли быть применены к фону терминала с помощью управляющих кодов ANSI, про которые у меня недавно был отдельный пост. Если вы не представляете, что такое управляющие коды ANSI, прочитайте его. Вот сопоставление цветов ANSI и соответствующих им управляющих кодов ANSI (имейте в виду, что, во-первых, это не полный список всех существующих кодов, и, во-вторых, на конкретном терминале коды могут не соответствовать стандарту):

Для цвета текста:

black (черный) ESC[30m | bright black (ярко-черный) ESC[1;30m
red (красный) ESC[31m | bright red (ярко-красный) ESC[1;31m
green (зеленый) ESC[32m | bright green (ярко-зеленый) ESC[1;32m
yellow (желтый) ESC[33m | bright yellow (ярко-желтый) ESC[1;33m
blue (синий) ESC[34m | bright blue (ярко-голубой) ESC[1;34m
magenta (пурпурный) ESC[35m | bright magenta (ярко-пурпурный) ESC[1;35m
cyan (голубой) ESC[36m | bright cyan (ярко-голубой) ESC[1;36m
white (белый) ESC[37m | bright white (ярко-белый) ESC[1;37m

Для цвета фона:

black (черный) ESC[40m
red (красный) ESC[41m
green (зеленый) ESC[42m
yellow (желтый) ESC[43m
blue (синий) ESC[44m
magenta (пурпурный) ESC[45m
cyan (голубой) ESC[46m
white (белый) ESC[47m

То есть в управляющих последовательностях ANSI числом в диапазоне 30-37 обозначается цвет текста, соответствующий одному из 8 базовых цветов ANSI, а числом в диапазоне 40-47 обозначается цвет фона, соответствующий одному из 8 базовых цветов ANSI. Добавление в управляющую последовательность ANSI числа 1 означает повышение яркости цвета текста (не фона).

Напомню, одной управляющей последовательностью можно указать сразу изменение и цвета текста, и цвета фона. Например, управляющая последовательность ESC[41;30m изменяет сразу цвет фона (на красный) и цвет текста (на черный). Или еще пример - управляющая последовательность ESC[1;41;30m меняет сразу цвет фона (на красный) и цвет текста (на ярко-черный).

Позже для обозначения ярких цветов текста придумали дополнительный диапазон чисел 90-97, а для обозначения ярких цветов текста придумали дополнительный диапазон чисел 100-107. Однако, для составления цветовых схем терминалов уже прижились управляющие коды, указанные в блоках выше.

Источник:
https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters

Наше время

В наше время терминалы из физических устройств превратились в программы-«эмуляторы терминалов». Для разных операционных систем таких программ существует много.

Для хранения цвета со временем стали использовать 8 бит и в терминалах стало можно пользоваться 256 цветами (в 8 битах можно сохранить 256 различных значений). Сейчас современные терминалы умеют отображать так называемый «true color», когда для хранения цвета используется 24 бита (в 24 битах можно сохранить 16 777 216 различных значений-цветов).

Однако, для расцвечивания терминалов по умолчанию всё еще используются цветовые схемы, построенные по вышеописанным давно устаревшим принципам. Почему их продолжают использовать?

Дело в том, что специалистам, которые работают с терминалами, на самом деле не слишком важно, какие в терминалах используются цвета. Теоретически можно работать и в двухцветных терминалах, как в самом начале (один цвет для текста, другой цвет - для фона). Всё же использование цветов делает работу намного удобнее, но специалистам в большинстве случаев хватает за глаза 16 цветов ANSI для текста и 8 цветов ANSI для фона.

Энтузиасты когда-то давным-давно написали скрипты, которые выводят все возможные сочетания 16 цветов ANSI для текста и 8 цветов ANSI для фона компактно в одной таблице (для конкретной программы «эмулятора терминала»). С помощью таких таблиц определяется цветовая схема, используемая в терминале. Такими таблицами обмениваются в интернете, давая определенным сочетаниям конкретные названия. Разработкой удобных сочетаний цветов в таких таблицах занимается множество энтузиастов.

Ниже я приведу пример одной из таких таблиц. Эта цветовая схема называется «Solarized Dark»:



Данная картинка взята со следующего сайта-сборника цветовых схем (таких сайтов много):
https://github.com/lysyi3m/macos-terminal-themes

В этой таблице слева и сверху указаны управляющие коды ANSI. Только в этих кодах опущено начало ESC[ каждой последовательности, но оно подразумевается. Текст «gYw» ничего особо не значит, это просто тестовый текст для демонстрации того, как будет выглядеть любой текст в данном сочетании цвета фона и цвета текста.

Следует отметить, что к описанной выше «классической» цветовой схеме в данного вида таблице добавлена колонка слева (над ней иногда пишут «def», что означает «default», то есть «по умолчанию») и строка сверху (слева от этой строки указаны управляющие коды m и 1m, имеются в виду управляющие коды ESC[m и ESC[1m). В колонке слева показано, как будет выглядеть текст 16-ти цветов ANSI на «фоне по умолчанию» (background color), а в строке сверху показано, как будет выглядеть текст «основного цвета по умолчанию» (foreground color) и текст «основного цвета по умолчанию» увеличенной яркости на фоне 8 базовых цветов ANSI.

Таким образом, в ячейке данной таблицы, находящейся в левом верхнем углу, показано, как будут выглядеть текст «основного цвета по умолчанию» и текст «основного цвета по умолчанию» увеличенной яркости на «фоне по умолчанию».

Выводы

Следует помнить, что в современных цветовых схемах для программ-«эмуляторов терминала» 16 цветов ANSI и три цвета по умолчанию (цвет фона по умолчанию, цвет текста по умолчанию и цвет текста по умолчанию увеличенной яркости), а также другие цвета (там есть еще), на самом деле, являются всего лишь названиями. Каждому из этих названий можно назначить любое из 16 777 216 значений «true color». Я это продемонстрирую на практическом примере в следующем посте.

Инструмент, Образование, Программирование, История

Previous post Next post
Up