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

223 lines
8.6 KiB
VimL

" sprinkles - a vim colorscheme with a configurable color palette
" Maintainer: Alex Griffin <alex@alexjgriffin.com>
" Version: 0.2.0-pre
" License: This file is placed under an ISC-style license. See the included
" LICENSE file for details.
" Standard Colorscheme Boilerplate {{{
highlight clear
if exists("syntax_on")
syntax reset
endif
let g:colors_name = "sprinkles"
" }}}
" Utility Functions {{{
" prints a warning message
function! s:Warn(msg)
echohl WarningMsg
echomsg "sprinkles: " . a:msg
echohl NONE
endfunction
" ensures the given dictionary only contains rgb hex colors
function! s:CheckPalette(palette)
for color in values(a:palette)
if color !~# '^#\x\{6}$'
call s:Warn("invalid palette color: " . color)
return 0
endif
endfor
return 1
endfunction
" Sets the text color, background color, and attributes for the given
" highlight group, in both terminal and gui vim. The values of a:hlgroup and
" a:attr are directly inserted into a highlight command. Valid values for
" a:fg and a:bg include the empty string (indicating NONE) and the first
" eight items in s:color_indices.
function! s:Style(hlgroup, fg, bg, attr)
" get terminal color index
let l:fg_idx = index(s:color_indices, a:fg)
let l:bg_idx = index(s:color_indices, a:bg)
let l:ctermfg = l:fg_idx == -1 ? "NONE" : l:fg_idx
let l:ctermbg = l:bg_idx == -1 ? "NONE" : l:bg_idx
let l:guifg = a:fg == "" ? "NONE" : a:fg
let l:guibg = a:bg == "" ? "NONE" : a:bg
let l:attr = a:attr == "" ? "NONE" : a:attr
" use bright colors with the bold attr
if a:attr =~# "bold" && (0 <= l:fg_idx && l:fg_idx < 8)
let l:guifg = s:color_indices[l:fg_idx + 8]
endif
execute "highlight " . a:hlgroup . " ctermfg=" . l:ctermfg . " ctermbg=" .
\ l:ctermbg . " cterm=" . l:attr . " guifg=" . l:guifg . " guibg=" .
\ l:guibg . " gui=" . l:attr
endfunction
" }}}
" Set Color Palette {{{
" Default gui colors if background is *light* and no custom palette is used.
" This is the Tango theme from gnome-terminal.
let s:default_light = {
\'text': '#000000',
\'background': '#ffffff',
\'black': '#000000', 'dark_grey': '#555753',
\'red': '#cc0000', 'bright_red': '#ef2929',
\'green': '#4e9a06', 'bright_green': '#8ae234',
\'yellow': '#c4a000', 'bright_yellow': '#fce94f',
\'blue': '#3465a4', 'bright_blue': '#729fcf',
\'magenta': '#75507b', 'bright_magenta': '#ad7fa8',
\'cyan': '#06989a', 'bright_cyan': '#34e2e2',
\'white': '#d3d7cf', 'bright_white': '#eeeeec',
\}
" Default gui colors if background is *dark* and no custom palette is used.
" This is the Tango theme from gnome-terminal.
let s:default_dark = {
\'text': '#d3d7cf',
\'background': '#222222',
\'black': '#000000', 'dark_grey': '#555753',
\'red': '#cc0000', 'bright_red': '#ef2929',
\'green': '#4e9a06', 'bright_green': '#8ae234',
\'yellow': '#c4a000', 'bright_yellow': '#fce94f',
\'blue': '#3465a4', 'bright_blue': '#729fcf',
\'magenta': '#75507b', 'bright_magenta': '#ad7fa8',
\'cyan': '#06989a', 'bright_cyan': '#34e2e2',
\'white': '#d3d7cf', 'bright_white': '#eeeeec',
\}
" choose default colors based on background
if &background == "light"
let s:palette = s:default_light
else
let s:palette = s:default_dark
endif
" override default colors with custom palette
if exists("g:sprinkles_palette")
if s:CheckPalette(g:sprinkles_palette)
call extend(s:palette, g:sprinkles_palette)
else
call s:Warn("using default palette instead")
endif
endif
" Set some convenience variables so that, e.g. s:palette.red can be referred
" to as s:red.
call extend(s:, s:palette)
" used to look up the corresponding terminal color index for a color
let s:color_indices = [
\s:black, s:red, s:green, s:yellow, s:blue, s:magenta, s:cyan, s:white,
\s:dark_grey,
\ s:bright_red,
\ s:bright_green,
\ s:bright_yellow,
\ s:bright_blue,
\ s:bright_magenta,
\ s:bright_cyan,
\ s:bright_white,
\]
" }}}
" Standard Syntax Highlighting Groups {{{
if has("gui_running")
call s:Style("Normal", s:text, s:background, "")
else
call s:Style("Normal", "", "", "")
endif
"" HIGHLIGHT GROUP TEXT BACKGROUND ATTRIBUTES
call s:Style("Constant", "", "", "")
call s:Style("Identifier", "", "", "")
call s:Style("Ignore", "", "", "")
call s:Style("Type", "", "", "")
call s:Style("Statement", "", "", "bold")
call s:Style("Comment", s:blue, "", "")
call s:Style("String", s:red, "", "")
call s:Style("Special", s:magenta, "", "")
call s:Style("SpecialComment", s:blue, "", "")
call s:Style("PreProc", s:magenta, "", "")
call s:Style("Underlined", "", "", "underline")
call s:Style("Error", s:white, s:red, "bold")
call s:Style("Todo", s:black, s:yellow, "")
call s:Style("MatchParen", "", s:cyan, "")
" }}}
" FileType-specific Tweaks {{{
"" HIGHLIGHT GROUP TEXT BACKGROUND ATTRIBUTES
call s:Style("javaStorageClass","", "", "bold")
call s:Style("javascriptFunction", "", "", "bold")
call s:Style("javascriptIdentifier", "", "", "bold")
call s:Style("luaFunction", "", "", "bold")
call s:Style("phpDefine", "", "", "bold")
call s:Style("rubyDefine", "", "", "bold")
" this might be a bit too invasive, but for some reason phpVarSelector doesn't
" respond to normal styling
highlight link phpVarSelector phpIdentifier
" }}}
" Vim UI Highlight Groups {{{
"" HIGHLIGHT GROUP TEXT BACKGROUND ATTRIBUTES
call s:Style("NonText", s:cyan, "", "")
call s:Style("SpecialKey", s:cyan, "", "")
call s:Style("LineNr", s:cyan, "", "")
call s:Style("CursorLineNr", s:cyan, "", "")
call s:Style("ErrorMsg", s:white, s:red, "bold")
call s:Style("MoreMsg", s:cyan, "", "")
call s:Style("ModeMsg", "", "", "bold")
call s:Style("Question", s:cyan, "", "")
call s:Style("Title", s:magenta, "", "")
call s:Style("WarningMsg", s:red, "", "")
call s:Style("Cursor", s:text, s:background, "reverse")
call s:Style("lCursor", s:text, s:background, "reverse")
call s:Style("Visual", "", "", "reverse")
call s:Style("VisualNOS", "", "", "bold,underline")
call s:Style("TabLine", "", "", "")
call s:Style("TabLineSel", s:cyan, "", "")
call s:Style("TabLineFill", "", "", "")
call s:Style("ColorColumn", "", s:red, "")
call s:Style("CursorColumn", "", "", "reverse")
call s:Style("CursorLine", "", "", "underline")
call s:Style("VertSplit", "", "", "reverse")
call s:Style("StatusLine", "", "", "reverse,bold")
call s:Style("StatusLineNC", "", "", "reverse")
call s:Style("WildMenu", s:white, s:magenta, "bold")
call s:Style("Search", s:black, s:yellow, "")
call s:Style("IncSearch", s:black, s:cyan, "")
call s:Style("Directory", s:blue, "", "bold")
call s:Style("DiffAdd", s:green, "", "")
call s:Style("DiffDelete", s:red, "", "bold")
call s:Style("DiffChange", s:magenta, "", "")
call s:Style("DiffText", s:magenta, "", "bold")
call s:Style("Folded", s:cyan, "", "")
call s:Style("FoldColumn", s:cyan, "", "")
call s:Style("SignColumn", s:cyan, "", "")
call s:Style("Pmenu", s:white, s:magenta, "")
call s:Style("PmenuSel", "", "", "reverse")
call s:Style("PmenuSbar", "", s:white, "")
call s:Style("PmenuThumb", "", s:black, "")
call s:Style("SpellBad", "", s:red, "")
call s:Style("SpellCap", "", s:green, "")
call s:Style("SpellRare", "", s:green, "")
call s:Style("SpellLocal", "", s:green, "")
" Purposefully left unset: Conceal
" }}}