vim-hexokinase: display colors
highlight color code
TLDR: vim-hexokinase isn't perfect but works.
It need works in termguicolors mode.
It is better to choose a color scheme which is visualized in gui mode.
And it is very tricky to setting colors in termguicolors & notermguicolors the same, which is insane.
It would be convenient, if color code can be visualised in editor, especially in web programming. I found two candidates plugins to achieve this goal, vim-css-color, vim-hexokinase.
Vim-css-color is not compatible with tree-sitter, due to regex based highlight. See Github Issue: Neovim tree sitter support for details. Vim-css-color sometimes cannot render same text color. I need to scroll my vim viewport, then it may render color correctly.
Vim-hexokinase is good, but must depends on termguicolors is turned on.
termguicolors will enable 24-bit RGB color,
while originally vim uses Base16 color.
The result is the color theme you familiar with will be changed.
Here is the visual comparison between vim-css-color and vim-hexokinase. I copy these text as html from my vim.
| vcc | vcc tgc | vh tgc |
|---|---|---|
| #ff0000 | #ff0000 | #ff0000 |
| #ff1111 | #ff1111 | #ff1111 |
| #ff2222 | #ff2222 | #ff2222 |
| #ff3333 | #ff3333 | #ff3333 |
| #ff4444 | #ff4444 | #ff4444 |
| #ff5555 | #ff5555 | #ff5555 |
| #ff6666 | #ff6666 | #ff6666 |
| #ff7777 | #ff7777 | #ff7777 |
| #ff8888 | #ff8888 | #ff8888 |
| #ff9999 | #ff9999 | #ff9999 |
| #ffaaaa | #ffaaaa | #ffaaaa |
| #ffbbbb | #ffbbbb | #ffbbbb |
| #ffcccc | #ffcccc | #ffcccc |
| #ffdddd | #ffdddd | #ffdddd |
| #ffeeee | #ffeeee | #ffeeee |
| #ffffff | #ffffff | #ffffff |
| #000000 | #000000 | #000000 |
| #111111 | #111111 | #111111 |
| #222222 | #222222 | #222222 |
| #333333 | #333333 | #333333 |
| #444444 | #444444 | #444444 |
| #555555 | #555555 | #555555 |
| #666666 | #666666 | #666666 |
| #777777 | #777777 | #777777 |
| #888888 | #888888 | #888888 |
| #999999 | #999999 | #999999 |
| #aaaaaa | #aaaaaa | #aaaaaa |
| #bbbbbb | #bbbbbb | #bbbbbb |
| #cccccc | #cccccc | #cccccc |
| #dddddd | #dddddd | #dddddd |
| #eeeeee | #eeeeee | #eeeeee |
| #ffffff | #ffffff | #ffffff |
Vim-css-color with out termguicolors cannot display color correctly (or say precisely),
if you dont believe your eye, see the source code of this page.
I think vim-hexokinase with a termguicolors toggle is a acceptable compromise.
Toggle termguicolors by :set termguicolors!.
I personally prefer to assign <leader>c to toggle termguicolors.
cterm & gui
TLDR: I still haven't find a elegant solution to keep termguicolors and notermguicolors visually same.
neovim has 2 color schemes cterm & gui,
see :h cterm-colors & :h gui-colors.
Default sntax colors are different in these two schemes.
For example, :verbose highlight Comment returns
Comment xxx ctermfg=14 guifg=#80a0ff
Last set from /nix/store/pr1pwjjsm3k45rwi3w0xh2296rpymjlz-neovim-unwrapped-0.5.1/share/nvim/runtime/syntax/syncolor.vim
which means ctermfg uses the 14th color in ANSI colors,
while guifg use a hex color code.
The detailed setting is located in ${VIMRUNTIME}/syntax/syncolor.vim.
I create a new syncolor.vim based the default one, and modify the all ctermfg and guifg to same color name, like below. The colors in two schemes are still different.
if !exists("syntax_cmd") || syntax_cmd == "on"
" ":syntax on" works like in Vim 5.7: set colors but keep links
command -nargs=* SynColor hi <args>
command -nargs=* SynLink hi link <args>
else
if syntax_cmd == "enable"
" ":syntax enable" keeps any existing colors
command -nargs=* SynColor hi def <args>
command -nargs=* SynLink hi def link <args>
elseif syntax_cmd == "reset"
" ":syntax reset" resets all colors to the default
command -nargs=* SynColor hi <args>
command -nargs=* SynLink hi! link <args>
else
" User defined syncolor file has already set the colors.
finish
endif
endif
" Many terminals can only use six different colors (plus black and white).
" Therefore the number of colors used is kept low. It doesn't look nice with
" too many colors anyway.
" Careful with "cterm=bold", it changes the color to bright for some terminals.
" There are two sets of defaults: for a dark and a light background.
if &background == "dark"
SynColor Comment term=bold cterm=NONE ctermfg=Cyan ctermbg=NONE gui=NONE guifg=Cyan guibg=NONE
SynColor Constant term=underline cterm=NONE ctermfg=Magenta ctermbg=NONE gui=NONE guifg=Magenta guibg=NONE
SynColor Special term=bold cterm=NONE ctermfg=LightRed ctermbg=NONE gui=NONE guifg=LightRed guibg=NONE
SynColor Identifier term=underline cterm=bold ctermfg=Cyan ctermbg=NONE gui=bold guifg=Cyan guibg=NONE
SynColor Statement term=bold cterm=NONE ctermfg=Yellow ctermbg=NONE gui=NONE guifg=Yellow guibg=NONE
SynColor PreProc term=underline cterm=NONE ctermfg=LightBlue ctermbg=NONE gui=NONE guifg=LightBlue guibg=NONE
SynColor Type term=underline cterm=NONE ctermfg=LightGreen ctermbg=NONE gui=NONE guifg=LightGreen guibg=NONE
SynColor Underlined term=underline cterm=underline ctermfg=LightBlue gui=underline guifg=LightBlue
SynColor Ignore term=NONE cterm=NONE ctermfg=black ctermbg=NONE gui=NONE guifg=black guibg=NONE
else
SynColor Comment term=bold cterm=NONE ctermfg=DarkBlue ctermbg=NONE gui=NONE guifg=DarkBlue guibg=NONE
SynColor Constant term=underline cterm=NONE ctermfg=DarkRed ctermbg=NONE gui=NONE guifg=DarkBlue guibg=NONE
SynColor Special term=bold cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=DarkMagenta guibg=NONE
SynColor Identifier term=underline cterm=NONE ctermfg=DarkCyan ctermbg=NONE gui=NONE guifg=DarkCyan guibg=NONE
SynColor Statement term=bold cterm=NONE ctermfg=Brown ctermbg=NONE gui=bold guifg=Brown guibg=NONE
SynColor PreProc term=underline cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=DarkMagenta guibg=NONE
SynColor Type term=underline cterm=NONE ctermfg=DarkGreen ctermbg=NONE gui=NONE guifg=DarkGreen guibg=NONE
SynColor Underlined term=underline cterm=underline ctermfg=DarkMagenta gui=underline guifg=DarkMagenta
SynColor Ignore term=NONE cterm=NONE ctermfg=white ctermbg=NONE gui=NONE guifg=white guibg=NONE
endif
SynColor Error term=reverse cterm=NONE ctermfg=White ctermbg=Red gui=NONE guifg=White guibg=Red
SynColor Todo term=standout cterm=NONE ctermfg=Black ctermbg=Yellow gui=NONE guifg=Black guibg=Yellow
The Magenta is especially dazzling, and cannot change it by below tries.
Refers to Change Vim's terminal colors when termguicolors is set #2353, nvim-terminal-emulator-configuration,
let g:terminal_color_13 = '#AD7FA8' " Magenta doesn't work.
Finally I choose to add a color-scheme manager, and choose a theme which has both cterm & gui color scheme.
{ config, pkgs, stdenv, lib, ... }:
let
my-vim-hexokinase = {
plugin = pkgs.vimPlugins.vim-hexokinase;
config = ''
let g:Hexokinase_highlighters = ['backgroundfull']
'';
};
in {
programs.neovim = {
plugins = [
my-vim-hexokinase
];
};
}