Я пытаюсь понять, как именно цвета обрабатываются в моем эмуляторе терминала (iTerm2).
В iTerm2 я могу настроить свою цветовую палитру «базовые 16» — в iTerm2 это делается с использованием HSL, а не 16-битных значений RGB. Определенные таким образом цвета являются нативными — они используют API какао и не ограничены типичной палитрой из 256 цветов (они отображаются в истинном цвете).
rgb.txt X11 определяет названия цветов в палитре 256 цветов.
В оболочке, bash или zsh я могу печатать текст, используя 16-битную 256-цветную палитру с echo -e "\e[38;5;82mHello \e[38;5;198mWorld"
(третий параметр — цветовой код xterm)
В vim (терминал, а не графический интерфейс) цвета используются как значение «cterm» при определении бликов (например: :highlight Normal ctermfg=188 ctermbg=233 guifg=#e8e8d3 guibg=#151515
), однако, насколько я могу судить, нет способа определить цвет терминала с помощью кода RGB, поэтому в то время как я могу отображать базовые 16 цветов в истинном цвете, остальные цвета произвольно ограничены палитрой из 256 цветов.
Чего я не смог понять, так это того, где значения rgb сопоставляются с кодами xterm. Похоже, что это произвольная связь (коды xterm не имеют функциональной связи со значениями RGB), поэтому я предполагаю, что где-то должно быть сопоставление.
Я считаю, что цвета можно переопределить в .Xresources (вот пример), но я не уверен в паре вещей:
- .Xresources специфичен для эмулятора терминала xterm, и я использую iTerm2, поэтому (я считаю), что это не имеет значения в моем случае. Я повозился, и iTerm2, похоже, не соблюдает конфигурацию .Xresources. Я не смог найти больше документации по этому вопросу.
- Я читал, что xterm будет аппроксимировать определения цвета из .Xresources, которые находятся за пределами веб-безопасной палитры - я не уверен, правда ли это или как именно это делается, но я полагаю, что это историческое ограничение, связанное с количество битов, используемых для хранения цветов.
Итак, на данный момент я считаю, что это работает следующим образом:
- Терминальные приложения выдают последовательность управляющих кодов, совместимую с xterm, а цвета всегда определяются как цветовой код xterm (0-255).
- iTerm2 обнаруживает управляющую последовательность.
- iTerm2 использует внутреннее сопоставление, которое соответствует rgb.txt X11, для сопоставления цветового кода xterm со значением HSL.
- iTerm2 отображает цвет с помощью API какао.
Таким образом, никакие другие приложения (X11 или что-то еще) не участвуют в отображении или преобразовании цветов - это прямо из терминального приложения в эмулятор терминала.
В этом случае, поскольку iTerm2 позволяет пользователю настраивать только «базовые 16 цветов», пользователи могут использовать истинный цвет только при рендеринге, но ограничены веб-безопасной палитрой для всех остальных цветов.
Это правильно?