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

402 lines
12 KiB
VimL

" Seattle
" An elegant yet efficient color scheme for coders
" Author: MingBai <mbbill at gmail.com>
"
" "
" "
" "
" "
" "
"
" To Enable Color Preview:
" :SeattleLightsUp
"
" To Update Cterm Color After Modifying RGB Color:
" :SeattleNeon
" {{{
" CMD is not supported currently.
if &term == "win32"
finish
endif
set background=dark
if exists("g:syntax_on")
syntax reset
endif
hi clear
let g:colors_name="seattle"
" }}}
" Color Palette
" GUI BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
highlight Normal guifg=#cccccc guibg=#292929
highlight CP_01 guifg=#CCCCCC
highlight CP_02 guifg=#7f7f7f gui=italic
highlight CP_03 guifg=#87C0E0 gui=underline
highlight CP_04 guifg=#292929 guibg=#CCCCCC
highlight CP_05 guifg=NONE guibg=#4D4D4D
highlight CP_06 guifg=#7F7F7F guibg=#333333
highlight CP_07 guifg=#4D4D4D guibg=#4D4D4D
highlight CP_08 guifg=NONE guibg=#666666
highlight CP_09 guifg=#AAAAAA guibg=#333333
highlight CP_0A guifg=#7f7f7f
highlight CP_11 guifg=#F06A6A
highlight CP_12 guifg=#F69A42
highlight CP_13 guifg=#FAC863
highlight CP_14 guifg=#DDA790
highlight CP_15 guifg=#AB7967
highlight CP_16 guifg=#99C794
highlight CP_17 guifg=#5FB3B3
highlight CP_18 guifg=#63B0DC
highlight CP_19 guifg=#6699CC
highlight CP_1a guifg=#C594C5
highlight CP_1b guifg=#EE799F
highlight CP_21 guibg=#F06A6A guifg=#000000
highlight CP_22 guibg=#F69A42 guifg=#000000
highlight CP_23 guibg=#FAC863 guifg=#000000
highlight CP_24 guibg=#DDA790 guifg=#000000
highlight CP_25 guibg=#AB7967 guifg=#000000
highlight CP_26 guibg=#99C794 guifg=#000000
highlight CP_27 guibg=#5FB3B3 guifg=#000000
highlight CP_28 guibg=#63B0DC guifg=#000000
highlight CP_29 guibg=#6699CC guifg=#000000
highlight CP_2a guibg=#C594C5 guifg=#000000
highlight CP_2b guibg=#EE799F guifg=#000000
highlight CP_31 guibg=#F06A6A guifg=#FFFFFF
highlight CP_32 guibg=#F69A42 guifg=#FFFFFF
highlight CP_33 guibg=#FAC863 guifg=#FFFFFF
highlight CP_34 guibg=#DDA790 guifg=#FFFFFF
highlight CP_35 guibg=#AB7967 guifg=#FFFFFF
highlight CP_36 guibg=#99C794 guifg=#FFFFFF
highlight CP_37 guibg=#5FB3B3 guifg=#FFFFFF
highlight CP_38 guibg=#63B0DC guifg=#FFFFFF
highlight CP_39 guibg=#6699CC guifg=#FFFFFF
highlight CP_3a guibg=#C594C5 guifg=#FFFFFF
highlight CP_3b guibg=#EE799F guifg=#FFFFFF
" GUI END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if !has("gui_running")
set t_Co=256
" Lines between CTERM BEGIN and CTERM END will be re-written,
" so DO NOT EDIT! Change GUI colors then call SeattleNeon()
" CTERM BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
highlight Normal ctermfg=252 ctermbg=235
highlight CP_01 ctermfg=252
highlight CP_02 ctermfg=244 cterm=NONE
highlight CP_03 ctermfg=110 cterm=underline
highlight CP_04 ctermfg=235 ctermbg=252
highlight CP_05 ctermfg=NONE ctermbg=239
highlight CP_06 ctermfg=244 ctermbg=236
highlight CP_07 ctermfg=239 ctermbg=239
highlight CP_08 ctermfg=NONE ctermbg=241
highlight CP_09 ctermfg=248 ctermbg=236
highlight CP_0A ctermfg=244
highlight CP_11 ctermfg=203
highlight CP_12 ctermfg=209
highlight CP_13 ctermfg=221
highlight CP_14 ctermfg=180
highlight CP_15 ctermfg=137
highlight CP_16 ctermfg=114
highlight CP_17 ctermfg=73
highlight CP_18 ctermfg=74
highlight CP_19 ctermfg=68
highlight CP_1a ctermfg=176
highlight CP_1b ctermfg=211
highlight CP_21 ctermbg=203 ctermfg=16
highlight CP_22 ctermbg=209 ctermfg=16
highlight CP_23 ctermbg=221 ctermfg=16
highlight CP_24 ctermbg=180 ctermfg=16
highlight CP_25 ctermbg=137 ctermfg=16
highlight CP_26 ctermbg=114 ctermfg=16
highlight CP_27 ctermbg=73 ctermfg=16
highlight CP_28 ctermbg=74 ctermfg=16
highlight CP_29 ctermbg=68 ctermfg=16
highlight CP_2a ctermbg=176 ctermfg=16
highlight CP_2b ctermbg=211 ctermfg=16
highlight CP_31 ctermbg=203 ctermfg=231
highlight CP_32 ctermbg=209 ctermfg=231
highlight CP_33 ctermbg=221 ctermfg=231
highlight CP_34 ctermbg=180 ctermfg=231
highlight CP_35 ctermbg=137 ctermfg=231
highlight CP_36 ctermbg=114 ctermfg=231
highlight CP_37 ctermbg=73 ctermfg=231
highlight CP_38 ctermbg=74 ctermfg=231
highlight CP_39 ctermbg=68 ctermfg=231
highlight CP_3a ctermbg=176 ctermfg=231
highlight CP_3b ctermbg=211 ctermfg=231
" CTERM END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
endif " has gui_running
" Real color definitions starts from here
" Syntax highlighting groups, using "!" to avoid E414
highlight! link Normal CP_01
highlight! link Comment CP_02
highlight! link Constant CP_1b
highlight! link Identifier CP_16
highlight! link Function CP_18
highlight! link Type CP_1a
highlight! link Keyword CP_12
highlight! link PreProc CP_1b
highlight! link Statement CP_14
highlight! link Special CP_16
highlight! link Underlined CP_03
highlight! link Ignore CP_02
highlight! link Error CP_21
highlight! link Todo CP_22
highlight! link Directory CP_18
highlight! link Title CP_14
" Others
highlight! link SignColumn CP_01
highlight! link Cursor CP_04
highlight! link CursorLine CP_05
highlight! link CursorColumn CP_05
highlight! link ErrorMsg CP_31
highlight! link FoldColumn CP_08
highlight! link Folded CP_08
highlight! link IncSearch CP_28
highlight! link LineNr CP_06
highlight! link MatchParen CP_03
highlight! link ModeMsg CP_18
highlight! link MoreMsg CP_16
highlight! link NonText CP_15
highlight! link Pmenu CP_28
highlight! link PmenuSel CP_35
highlight! link Question CP_1a
highlight! link Search CP_39
highlight! link SpecialKey CP_0A
highlight! link StatusLine CP_24
highlight! link StatusLineNC CP_06
highlight! link VertSplit CP_07
highlight! link Visual CP_08
highlight! link WarningMsg CP_11
highlight! link WildMenu CP_05
highlight! link colorcolumn CP_06
highlight! link TabLine CP_18
highlight! link TabLineFill CP_06
highlight! link TabLineSel CP_28
" Diff
highlight! link DiffAdd CP_26
highlight! link DiffChange CP_28
highlight! link DiffDelete CP_05
highlight! link DiffText CP_2b
" {{{ Unimportant stuff
let s:gray_scale_json = '{
\"000000":16,
\"080808":232,
\"121212":233,
\"1c1c1c":234,
\"262626":235,
\"303030":236,
\"3a3a3a":237,
\"444444":238,
\"4e4e4e":239,
\"585858":240,
\"626262":241,
\"6c6c6c":242,
\"767676":243,
\"808080":244,
\"8a8a8a":245,
\"949494":246,
\"9e9e9e":247,
\"a8a8a8":248,
\"b2b2b2":249,
\"bcbcbc":250,
\"c6c6c6":251,
\"d0d0d0":252,
\"dadada":253,
\"e4e4e4":254,
\"eeeeee":255,
\"ffffff":231
\}'
function! s:read_rgb_txt()
let rgb_file = $VIMRUNTIME."/rgb.txt"
let rgb_lines = readfile(rgb_file)
let ret = {}
" each line is like r g b name
for line in rgb_lines
let s = split(line)
let key = tolower(s[3])
let ret[key] = printf("%02x", str2nr(s[0])).
\printf("%02x", str2nr(s[1])).
\printf("%02x", str2nr(s[2]))
endfor
return ret
endfunction
function! s:close_color(c)
let steps = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]
for i in range(5)
if a:c >= steps[i] && a:c <= steps[i+1]
if abs(a:c - steps[i]) < abs(steps[i+1] - a:c)
return i
else
return i+1
endif
endif
endfor
endfunction
let s:gray_scale = {}
" accepts a number from 0-255
function! s:close_gray_scale(c)
if len(s:gray_scale) == 0
let s:gray_scale = json_decode(s:gray_scale_json)
endif
let gs_keys = sort(keys(s:gray_scale))
for i in range(len(gs_keys)-1)
let c1 = str2nr(gs_keys[i][:1], 16)
let c2 = str2nr(gs_keys[i+1][:1], 16)
if a:c >= c1 && a:c <= c2
if abs(a:c - c1) < abs(a:c - c2)
return s:gray_scale[gs_keys[i]]
else
return s:gray_scale[gs_keys[i+1]]
endif
endif
endfor
echoerr "Should not reach here"
endfunction
let s:color_name_to_rgb = {}
" this function takes either #RRGGBB or a color name like blue
function! s:rgb_to_256(rgb)
let _rgb = tolower(a:rgb)
" initialize once
if len(s:color_name_to_rgb) == 0
let s:color_name_to_rgb = s:read_rgb_txt()
if len(s:color_name_to_rgb) == 0
echoerr "Failed to read rgb.txt"
return 0
endif
endif
" get name->rgb from rgb.txt
if has_key(s:color_name_to_rgb, _rgb)
let _rgb = s:color_name_to_rgb[_rgb]
elseif matchstr(_rgb, "^#") != ""
let _rgb = _rgb[1:]
endif
if strlen(_rgb) != 6
echoerr "Invalid rgb value: "._rgb
return
endif
let r = str2nr(_rgb[:1], 16)
let g = str2nr(_rgb[2:3], 16)
let b = str2nr(_rgb[4:], 16)
" process gray scale if r g b is close
if abs(r-g)<=2 && abs(g-b)<=2
return s:close_gray_scale((r+g+b) / 3)
endif
return s:close_color(r) * 36
\+ s:close_color(g) * 6
\+ s:close_color(b) + 16
endfunction
function! s:process_line(line)
let result = a:line
if match(result, "^highlight")
return ""
endif
" Starts processing
let guis = ["guifg", "guibg", "gui"]
let cterms = ["ctermfg", "ctermbg", "cterm"]
for i in range(3)
let matched = matchstr(a:line, guis[i].'=\S\+')
if matched == ""
continue
endif
let converted = matchstr(matched, '=\zs.*')
" special treat for some unsupported properties
if index(["italic","reverse","inverse","standout"], converted) != -1
let converted = "NONE"
endif
if i != 2 && converted != "NONE" " do not convert gui= or NONE
let converted = s:rgb_to_256(converted)
endif
let converted = cterms[i] . "=" . converted
let result = substitute(result, matched, converted, "")
endfor
return result
endfunction
function! s:SeattleLightsUp()
if v:version < 800
echoerr "The magic power needs Vim 8.0 and later."
return
endif
if exists("s:run_once")
return
else
let s:run_once = 1
endif
let current_filename = expand('%:p')
let lines = readfile(current_filename)
for i in lines
" highlight link
let hi_name = matchstr(i, '^highlight!\s\+link\s\+\zs\S\+\ze')
if hi_name != ""
exec "syn match " . hi_name . ' "^highlight! link '.hi_name.'\s*"'
continue
endif
" normal highlight
let hi_name = matchstr(i, '^highlight\s\+\zs\S\+\ze')
if hi_name != ""
exec "syn match " . hi_name . ' "^highlight '.hi_name.'\s*"'
continue
endif
endfor
" Magic..
call map(json_decode("[{4:4,10:6,18:4,24:6,31:6,38:2,45:6},{3:2,10:2,17:2,
\21:2,26:2,33:2,38:2,45:2},{4:4,10:4,17:6,26:2,33:2,38:2,45:4},{7:2,
\10:2,17:2,21:2,26:2,33:2,38:2,45:2},{4:4,10:6,17:2,21:2,26:2,33:2,38:6,
\45:6}]"),{i,v->(map(v,{m,n->(i+matchadd("CP_2".(i+1),'\%'.(i+5).'l\%'.m.
\'c.\{'.n.'}',99))}))})
endfunction
function! s:SeattleNeon()
if v:version < 800
echoerr "The magic power needs Vim 8.0 and later."
return
endif
let saved_cursor = getcurpos()
let gui_begin = search("^\" GUI BEGIN")
let gui_end = search("^\" GUI END")
if gui_begin == 0 || gui_end == 0 || gui_begin >= gui_end
echoerr "Invalid GUI marker"
return
endif
if gui_begin >= gui_end-1
echoerr "Empty highlight lines?"
return
endif
let cterm_lines = []
for i in range(gui_begin+1, gui_end-1)
let line = s:process_line(getline(i))
if line != ""
let cterm_lines += [ line ]
endif
endfor
let cterm_begin = search("^\" CTERM BEGIN") + 1
let cterm_end = search("^\" CTERM END") - 1
if cterm_begin == 0 || cterm_end == 0 || cterm_begin > cterm_end+1
echoerr "Invalid CTERM marker"
return
endif
if cterm_end >= cterm_begin
exec cterm_begin . "," . cterm_end . " delete"
endif
call append(cterm_begin-1, cterm_lines)
call setpos('.', saved_cursor)
call s:SeattleLightsUp()
endfunction
command! SeattleLightsUp so % | call s:SeattleLightsUp()
command! SeattleNeon so % | call s:SeattleNeon()
" }}}
" vim: set ts=4 et ft=vim ff=unix fdm=marker: