Files
nix-config/.config/nvim/colors/CandyPaper.vim
2020-07-15 09:28:34 -04:00

286 lines
9.2 KiB
VimL

" Color Scheme: CandyPaper
" Author: DF_XYZ
" License: MIT
highlight clear
set background=dark
if exists("syntax_on")
syntax reset
endif
let colors_name = "CandyCode"
" Convert color from HSV to RGB as a hex string
" See: https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV
function s:hsv_to_rgb(h, s, v) "{
let l:C = (a:s / 100.0) * (a:v / 100.0)
let l:H = a:h / 60.0 | let l:H_mod_2 = float2nr(l:H) % 2 + l:H - float2nr(l:H)
let l:X = l:C * (1 - abs(l:H_mod_2 - 1))
if 0 <= l:H && l:H < 1
let l:r = l:C
let l:g = l:X
let l:b = 0
elseif 1 <= H && H < 2
let l:r = l:X
let l:g = l:C
let l:b = 0
elseif 2 <= l:H && l:H < 3
let l:r = 0
let l:g = l:C
let l:b = l:X
elseif 3 <= l:H && l:H < 4
let l:r = 0
let l:g = l:X
let l:b = l:C
elseif 4 <= l:H && l:H < 5
let l:r = X
let l:g = 0
let l:b = C
elseif 5 <= l:H && l:H < 6
let l:r = C
let l:g = 0
let l:b = X
else
let l:r = 0
let l:g = 0
let l:b = 0
endif
let l:r += a:v / 100.0 - l:C
let l:g += a:v / 100.0 - l:C
let l:b += a:v / 100.0 - l:C
let l:R = float2nr(round(l:r * 255))
let l:G = float2nr(round(l:g * 255))
let l:B = float2nr(round(l:b * 255))
return printf("#%02x%02x%02x", l:R, l:G, l:B)
endfunction "}
" Return the approximate grey index with the given grey level
function s:grey_index(x) "{
if a:x < 14
return 0
else
let l:i = (a:x - 8) / 10
let l:j = (a:x - 8) % 10
return l:j < 5 ? l:i : l:i + 1
endif
endfunction "}
" Return the actual grey level with the grey index
function s:grey_level(x) "{
return a:x == 0 ? 0 : a:x * 10 + 8
endfunction "}
" Return the color index with the given grey index
function s:grey_color_index(x) "{
if a:x == 0
return 16
elseif a:x == 25
return 231
else
return 231 + a:x
endif
endfunction "}
" Return the approximate color index with the given color level
function s:color_index(x) "{
if a:x < 75
return 0
else
let l:i = (a:x - 55) / 40
let l:j = (a:x - 55) % 40
return l:j < 20 ? l:i : l:i + 1
endif
endfunction "}
" Return the actual color level with the color index
function s:color_level(x) "{
return a:x == 0 ? 0 : a:x * 40 + 55
endfunction "}
" Return the color index with the given color indices
function s:rgb_color_index(x, y, z) "{
return 16 + a:x * 36 + a:y * 6 + a:z
endfunction "}
" Return the color index with the given RGB hex string
function s:rgb_to_index(rgb) "{
let l:r = str2nr(strpart(a:rgb, 1, 2), 16)
let l:g = str2nr(strpart(a:rgb, 3, 2), 16)
let l:b = str2nr(strpart(a:rgb, 5, 2), 16)
let l:grey_x = s:grey_index(l:r)
let l:grey_y = s:grey_index(l:g)
let l:grey_z = s:grey_index(l:b)
let l:x = s:color_index(l:r)
let l:y = s:color_index(l:g)
let l:z = s:color_index(l:b)
if l:grey_x == l:grey_y && l:grey_y == l:grey_z
let l:diff_grey_r = s:grey_level(l:grey_x) - l:r
let l:diff_grey_g = s:grey_level(l:grey_y) - l:g
let l:diff_grey_b = s:grey_level(l:grey_z) - l:b
let l:diff_grey = l:diff_grey_r * l:diff_grey_r + l:diff_grey_g * l:diff_grey_g + l:diff_grey_b * l:diff_grey_b
let l:diff_r = s:color_level(l:grey_x) - l:r
let l:diff_g = s:color_level(l:grey_y) - l:g
let l:diff_b = s:color_level(l:grey_z) - l:b
let l:diff_color = l:diff_r * l:diff_r + l:diff_g * l:diff_g + l:diff_b * l:diff_b
return l:diff_grey < l:diff_color ? s:grey_color_index(l:grey_x) : s:rgb_color_index(l:x, l:y, l:z)
else
return s:rgb_color_index(l:x, l:y, l:x)
endif
endfunction "}
" Set foreground color
function s:fg(group, h, s, v) "{
let l:rgb = s:hsv_to_rgb(a:h, a:s, a:v)
let l:index = s:rgb_to_index(l:rgb)
exec "highlight " . a:group . " guifg=" . l:rgb . " ctermfg=" . l:index
endfunction "}
" Set background color
function s:bg(group, h, s, v) "{
let l:rgb = s:hsv_to_rgb(a:h, a:s, a:v)
let l:index = s:rgb_to_index(l:rgb)
exec "highlight " . a:group . " guibg=" . l:rgb . " ctermbg=" . l:index
endfunction "}
" Set attributions
function s:attr(group, attr) "{
exec "highlight " . a:group . " gui=" . a:attr . " cterm=" . a:attr
endfunction "}
" Basic Highlighting Groups:
" {
call s:fg("SpecialKey", 60, 60, 75)
call s:fg("NonText", 120, 15, 45) | call s:attr("NonText", "none")
call s:fg("Directory", 210, 60, 75)
call s:fg("IncSearch", 0, 0, 15) | call s:bg("IncSearch", 90, 45, 75) | call s:attr("IncSearch", "none")
call s:fg("Search", 0, 0, 15) | call s:bg("Search", 60, 60, 75) | call s:attr("Search", "none")
call s:fg("ErrorMsg", 0, 0, 75) | call s:bg("ErrorMsg", 0, 75, 60)
call s:fg("WarningMsg", 0, 60, 75)
call s:fg("MoreMsg", 120, 45, 75) | call s:attr("MoreMsg", "none")
call s:attr("ModeMsg", "none")
call s:fg("LineNr", 120, 15, 45)
call s:fg("CursorLineNr", 120, 15, 60) | call s:attr("CursorLineNr", "none")
call s:fg("Question", 120, 45, 75) | call s:attr("Question", "none")
call s:fg("StatusLine", 0, 0, 15) | call s:bg("StatusLine", 120, 15, 75) | call s:attr("StatusLine", "none")
call s:fg("StatusLineNC", 120, 15, 30) | call s:bg("StatusLineNC", 120, 15, 75) | call s:attr("StatusLine", "none")
call s:fg("Title", 120, 45, 75) | call s:attr("Title", "none")
call s:bg("Visual", 210, 60, 30)
call s:bg("VisualNOS", 210, 60, 30) | call s:attr("VisualNOS", "underline")
call s:fg("WildMenu", 120, 15, 75) | call s:bg("WildMenu", 0, 0, 15)
call s:fg("Folded", 90, 45, 75) | call s:bg("Folded", 150, 45, 30)
call s:fg("FoldColumn", 90, 45, 75) | call s:bg("FoldColumn", 0, 0, 15)
call s:bg("DiffAdd", 120, 45, 30)
call s:bg("DiffChange", 210, 45, 30)
call s:fg("DiffDelete", 120, 15, 75) | call s:bg("DiffDelete", 0, 0, 30) | call s:attr("DiffDelete", "none")
call s:bg("DiffText", 0, 45, 30) | call s:attr("DiffText", "none")
call s:fg("SignColumn", 90, 45, 75) | call s:bg("SignColumn", 0, 0, 15)
call s:fg("Conceal", 210, 60, 75) | call s:bg("Conceal", 0, 0, 15)
call s:fg("Pmenu", 0, 0, 15) | call s:bg("Pmenu", 120, 15, 60)
call s:fg("PmenuSel", 120, 15, 75) | call s:bg("PmenuSel", 210, 60, 30)
call s:bg("PmenuSbar", 120, 5, 45)
call s:bg("PmenuThumb", 120, 5, 75)
call s:fg("TabLine", 0, 0, 15) | call s:bg("TabLine", 120, 15, 75) | call s:attr("TabLine", "none")
call s:attr("TabLineSel", "none")
call s:bg("CursorLine", 120, 15, 20) | call s:attr("CursorLine", "none")
call s:bg("CursorColumn", 120, 15, 20)
call s:bg("ColorColumn", 120, 15, 30)
" }
" Basic Syntax Groups:
" {
call s:fg("MatchParen", 90, 45, 75) | call s:bg("MatchParen", 150, 45, 30)
call s:fg("Normal", 120, 15, 75) | call s:bg("Normal", 0, 0, 15)
call s:fg("Comment", 120, 30, 60)
call s:fg("Constant", 300, 30, 75)
call s:fg("String", 90, 45, 75)
call s:fg("Character", 90, 45, 75)
call s:fg("Boolean", 120, 45, 75)
call s:fg("Identifier", 210, 60, 75)
call s:fg("Function", 210, 30, 75)
call s:fg("Statement", 120, 45, 75) | call s:attr("Statement", "none")
call s:fg("Operator", 210, 30, 75)
call s:fg("PreProc", 120, 45, 75)
call s:fg("Type", 120, 45, 75) | call s:attr("Type", "none")
call s:fg("Special", 60, 60, 75)
call s:fg("Tag", 120, 45, 75)
call s:fg("SpecialComment", 120, 45, 75)
call s:fg("Underlined", 210, 45, 75)
call s:fg("Ignore", 120, 15, 45)
highlight clear Error | call s:fg("Error", 0, 60, 75)
highlight clear Todo | call s:fg("Todo", 60, 60, 60)
" }
" Java Syntax:
" {
call s:fg("javaOperator", 120, 45, 75)
call s:fg("javaCommentTitle", 120, 30, 60)
call s:fg("javaDocTags", 120, 45, 75)
call s:fg("javaDocParam", 120, 15, 75)
call s:fg("javaConstant", 120, 45, 75)
call s:fg("javaAnnotation", 270, 30, 75)
" }
" Python:
" {
call s:fg("pythonOperator", 120, 45, 75)
call s:fg("pythonDecorator", 270, 30, 75)
call s:fg("pythonDecoratorName", 270, 30, 75)
call s:fg("pythonExceptions", 210, 60, 75)
" }
" Markdown:
" {
call s:fg("markdownHeadingDelimiter", 120, 45, 75)
call s:fg("markdownCodeDelimiter", 90, 45, 75)
call s:fg("markdownCode", 90, 45, 75)
call s:fg("markdownCodeBlock", 90, 45, 75)
" }
" Vim Syntax:
" {
call s:fg("vimOption", 270, 30, 75)
call s:fg("vimParenSep", 210, 30, 75)
" }
" XML Syntax:
" {
call s:fg("xmlEntity", 270, 30, 75)
call s:fg("xmlAttrib", 210, 60, 75)
call s:fg("xmlTagName", 120, 45, 75)
call s:fg("xmlTag", 120, 45, 75)
call s:fg("xmlEndTag", 120, 45, 75)
" }
" HTML Syntax:
" {
call s:fg("htmlTag", 120, 45, 75)
call s:fg("htmlEndTag", 120, 45, 75)
call s:fg("htmlArg", 210, 60, 75)
call s:fg("htmlSpecialChar", 270, 30, 75)
call s:fg("javascript", 120, 15, 75)
" }
" Delete Functions:
" {
delfunction s:hsv_to_rgb
delfunction s:grey_index
delfunction s:grey_level
delfunction s:grey_color_index
delfunction s:color_index
delfunction s:color_level
delfunction s:rgb_color_index
delfunction s:rgb_to_index
delfunction s:fg
delfunction s:bg
delfunction s:attr
" }
" vim: cc=120 foldmethod=marker foldmarker={,}