I'm trying to understand exactly how colors are processed in my terminal emulator (iTerm2).
In iTerm2 I can configure my "base 16" color palette - in iTerm2 this is done using HSL, not 16-bit RGB values. The colors defined this way are native - they use the cocoa API and are not limited to the typical 256 color palette (they are rendered in true color).
X11'srgb.txt defines names for the colors in the 256 color palette.
In a shell, bash or zsh, I can print text using the 16bit 256 color palette with echo -e "\e[38;5;82mHello \e[38;5;198mWorld"
(the third parameter is the xterm color code)
In vim (terminal not gui) the colors are utilized as a 'cterm' value when defining highlights (for example: :highlight Normal ctermfg=188 ctermbg=233 guifg=#e8e8d3 guibg=#151515
), however as far as I can tell - there is no way to define a terminal color using an RGB code, so while I can display the base16 colors in truecolor, the rest of the colors are arbitrarily limited to the 256 color palette.
What I haven't been able to figure out is where rgb values are mapped to the xterm codes. It appears to be an arbitrary relationship (the xterm codes don't appear to have a functional relationship with the RGB values), so I assume there must be a mapping somewhere.
I believe that the colors can be redefined in .Xresources (here is an example), but I'm unsure about a couple things:
- .Xresources is specific to the xterm terminal emulator, and I'm using iTerm2, so (I believe) that this is irrelevant in my case. I've mucked around and iTerm2 doesn't seem to respect the .Xresources configuration. I was unable to find more documentation on this subject.
- I've read that xterm will approximate color definitions from .Xresources that are outside of the web-safe palette - I'm not sure if this is true or exactly how it's done, but I imagine that this is a historical limitation associated with the amount of bits being used to store the colors.
So at this point I believe way it works is:
- Terminal applications emit the xterm-compatible escape code sequence - and colors are always defined as an xterm color code (0-255).
- iTerm2 detects the escape sequence.
- iTerm2 uses an internal mapping that respects X11's rgb.txt to map the xterm color code to an HSL value.
- iTerm2 renders color using the cocoa API.
So, no other applications (X11 or anything else) are involved in the color mapping or conversion - it's straight from the terminal application to the terminal emulator.
This being the case, since iTerm2 only allows user to configure the "base 16 colors" users are free to use true color when rendering those only, but restricted to the web-safe palette for all other colors.
Is this correct?