В обоих ответах здесь не упоминается поддержка Truecolor ANSI для цвета 8 бит / с. Это даст цвет RGB, который первоначально запрашивал OP.
Вместо ;5
используйте ;2
и укажите значения R , G и B (0-255) в следующих три контрольных сегмента.
\x1b[38;2;40;177;249m
Чтобы проверить , поддерживает ли ваш терминал Truecolor :
printf "\x1b[38;2;40;177;249mTRUECOLOR\x1b[0m\n"
На моей машине XTerm успешно вывел правильный цвет; хотя терминалы, которые смоделированы после терминалов, которые предшествуют современному цвету RGB, обычно не будут поддерживать truecolor - убедитесь, что вы знаете свою цель, прежде чем использовать этот конкретный вариант escape-кода.
Я также хотел бы отметить 38
и ;5
/ ;2
- Blue Ice упомянул , что 38
направляет, а затем 5
меняет цвет , Это немного неверно.
38
- расширенный код цвета переднего плана xterm-256; 30
- 37
- это просто 16-цветовые коды переднего плана (с яркостью, управляемой escape-кодом 1
в некоторых системах, и, возможно, поддерживаемые 90
- 97
нестандартные «яркие» коды), которые поддерживается всеми цветными терминалами, совместимыми с vt100 / xterm.
;2
и ;5
указывают формат цвета, в конечном итоге сообщая терминалу, сколько еще последовательностей нужно извлечь: ;5
задает 8-битный формат (как упомянуто Blue Ice), требующий только еще 1 управляющего сегмента и ;2
указание полного 24-битного формата RGB, требующего 3 управляющих сегмента.
Эти расширенные режимы технически «недокументированы» и полностью определены реализацией. Насколько я знаю и могу исследовать, они не управляются комитетом ANSI.
Для такого наклонного формата 5;
(256 цветов) начинается с 16 исходных цветов (темных / светлых, т. е. 30-37 и 90-97) в качестве цветов 0-15.
Исходящие 216 цветов (16-231) образованы смещением значения RGB на 3 бит / с на 16, упакованным в одно значение.
Последние 24 цвета (232-256) имеют оттенки серого, начиная с оттенка, слегка светлее черного, вплоть до оттенка, немного темнее белого. Некоторые эмуляторы интерпретируют эти шаги как линейные приращения от (256 / 24
) на всех трех каналах, хотя я встречал некоторые эмуляторы, которые явно определяют эти значения.
Вот функция Javascript, которая выполняет такое преобразование, принимая во внимание все серые.
function rgbToAnsi256(r, g, b) {
// we use the extended greyscale palette here, with the exception of
// black and white. normal palette only has 4 greyscale shades.
if (r === g && g === b) {
if (r < 8) {
return 16;
}
if (r > 248) {
return 231;
}
return Math.round(((r - 8) / 247) * 24) + 232;
}
var ansi = 16
+ (36 * Math.round(r / 255 * 5))
+ (6 * Math.round(g / 255 * 5))
+ Math.round(b / 255 * 5);
return ansi;
}
Таким образом, вы можете вычислить 256 цветов ANSI из начальных значений RGB, уменьшив их с 8 до 3 бит, чтобы сформировать 256 закодированное значение в событии, которое вы хотите программно сделайте это на терминалах, которые не поддерживают Truecolor.
Вам также следует подумать, действительно ли вам это нужно (преждевременная оптимизация, ядда, ядда). Во всех современных операционных системах ввод-вывод файловой системы в любом случае кэшируется, поэтому часто используемые файлы работают практически так же быстро, как RAM-диск.
Связанный вопрос (с множеством хороших ответов): RAM-диск для компиляции - существует ли такая вещь?
Commons VFS предоставляет удобные интерфейсы для виртуальных файловых систем, включая файловую систему в памяти.