e5f0974656
* add option to set full special attributes support This is useful to inform Dracula that the current UI has full support for special attributes like underlines and undercurls, as by default it assumes no terminal emulator have such support. The default value falls back to the current behavior, assuming only graphical interfaces have full support. Fix #266 * fix grammar issues Co-authored-by: D. Ben Knoble <ben.knoble+github@gmail.com> * add documentation for the new option Co-authored-by: D. Ben Knoble <ben.knoble+github@gmail.com>
328 lines
9.9 KiB
VimL
328 lines
9.9 KiB
VimL
" Dracula Theme: {{{
|
|
"
|
|
" https://github.com/zenorocha/dracula-theme
|
|
"
|
|
" Copyright 2016, All rights reserved
|
|
"
|
|
" Code licensed under the MIT license
|
|
" http://zenorocha.mit-license.org
|
|
"
|
|
" @author Trevor Heins <@heinst>
|
|
" @author Éverton Ribeiro <nuxlli@gmail.com>
|
|
" @author Derek Sifford <dereksifford@gmail.com>
|
|
" @author Zeno Rocha <hi@zenorocha.com>
|
|
scriptencoding utf8
|
|
" }}}
|
|
|
|
" Configuration: {{{
|
|
|
|
if v:version > 580
|
|
highlight clear
|
|
if exists('syntax_on')
|
|
syntax reset
|
|
endif
|
|
endif
|
|
|
|
let g:colors_name = 'dracula'
|
|
|
|
if !(has('termguicolors') && &termguicolors) && !has('gui_running') && &t_Co != 256
|
|
finish
|
|
endif
|
|
|
|
" Palette: {{{2
|
|
|
|
let s:fg = g:dracula#palette.fg
|
|
|
|
let s:bglighter = g:dracula#palette.bglighter
|
|
let s:bglight = g:dracula#palette.bglight
|
|
let s:bg = g:dracula#palette.bg
|
|
let s:bgdark = g:dracula#palette.bgdark
|
|
let s:bgdarker = g:dracula#palette.bgdarker
|
|
|
|
let s:comment = g:dracula#palette.comment
|
|
let s:selection = g:dracula#palette.selection
|
|
let s:subtle = g:dracula#palette.subtle
|
|
|
|
let s:cyan = g:dracula#palette.cyan
|
|
let s:green = g:dracula#palette.green
|
|
let s:orange = g:dracula#palette.orange
|
|
let s:pink = g:dracula#palette.pink
|
|
let s:purple = g:dracula#palette.purple
|
|
let s:red = g:dracula#palette.red
|
|
let s:yellow = g:dracula#palette.yellow
|
|
|
|
let s:none = ['NONE', 'NONE']
|
|
|
|
if has('nvim')
|
|
for s:i in range(16)
|
|
let g:terminal_color_{s:i} = g:dracula#palette['color_' . s:i]
|
|
endfor
|
|
endif
|
|
|
|
if has('terminal')
|
|
let g:terminal_ansi_colors = []
|
|
for s:i in range(16)
|
|
call add(g:terminal_ansi_colors, g:dracula#palette['color_' . s:i])
|
|
endfor
|
|
endif
|
|
|
|
" }}}2
|
|
" User Configuration: {{{2
|
|
|
|
if !exists('g:dracula_bold')
|
|
let g:dracula_bold = 1
|
|
endif
|
|
|
|
if !exists('g:dracula_italic')
|
|
let g:dracula_italic = 1
|
|
endif
|
|
|
|
if !exists('g:dracula_underline')
|
|
let g:dracula_underline = 1
|
|
endif
|
|
|
|
if !exists('g:dracula_undercurl')
|
|
let g:dracula_undercurl = g:dracula_underline
|
|
endif
|
|
|
|
if !exists('g:dracula_full_special_attrs_support')
|
|
let g:dracula_full_special_attrs_support = has('gui_running')
|
|
endif
|
|
|
|
if !exists('g:dracula_inverse')
|
|
let g:dracula_inverse = 1
|
|
endif
|
|
|
|
if !exists('g:dracula_colorterm')
|
|
let g:dracula_colorterm = 1
|
|
endif
|
|
|
|
"}}}2
|
|
" Script Helpers: {{{2
|
|
|
|
let s:attrs = {
|
|
\ 'bold': g:dracula_bold == 1 ? 'bold' : 0,
|
|
\ 'italic': g:dracula_italic == 1 ? 'italic' : 0,
|
|
\ 'underline': g:dracula_underline == 1 ? 'underline' : 0,
|
|
\ 'undercurl': g:dracula_undercurl == 1 ? 'undercurl' : 0,
|
|
\ 'inverse': g:dracula_inverse == 1 ? 'inverse' : 0,
|
|
\}
|
|
|
|
function! s:h(scope, fg, ...) " bg, attr_list, special
|
|
let l:fg = copy(a:fg)
|
|
let l:bg = get(a:, 1, ['NONE', 'NONE'])
|
|
|
|
let l:attr_list = filter(get(a:, 2, ['NONE']), 'type(v:val) == 1')
|
|
let l:attrs = len(l:attr_list) > 0 ? join(l:attr_list, ',') : 'NONE'
|
|
|
|
" If the UI does not have full support for special attributes (like underline and
|
|
" undercurl) and the highlight does not explicitly set the foreground color,
|
|
" make the foreground the same as the attribute color to ensure the user will
|
|
" get some highlight if the attribute is not supported. The default behavior
|
|
" is to assume that terminals do not have full support, but the user can set
|
|
" the global variable `g:dracula_full_special_attrs_support` explicitly if the
|
|
" default behavior is not desirable.
|
|
let l:special = get(a:, 3, ['NONE', 'NONE'])
|
|
if l:special[0] !=# 'NONE' && l:fg[0] ==# 'NONE' && !g:dracula_full_special_attrs_support
|
|
let l:fg[0] = l:special[0]
|
|
let l:fg[1] = l:special[1]
|
|
endif
|
|
|
|
let l:hl_string = [
|
|
\ 'highlight', a:scope,
|
|
\ 'guifg=' . l:fg[0], 'ctermfg=' . l:fg[1],
|
|
\ 'guibg=' . l:bg[0], 'ctermbg=' . l:bg[1],
|
|
\ 'gui=' . l:attrs, 'cterm=' . l:attrs,
|
|
\ 'guisp=' . l:special[0],
|
|
\]
|
|
|
|
execute join(l:hl_string, ' ')
|
|
endfunction
|
|
|
|
"}}}2
|
|
" Dracula Highlight Groups: {{{2
|
|
|
|
call s:h('DraculaBgLight', s:none, s:bglight)
|
|
call s:h('DraculaBgLighter', s:none, s:bglighter)
|
|
call s:h('DraculaBgDark', s:none, s:bgdark)
|
|
call s:h('DraculaBgDarker', s:none, s:bgdarker)
|
|
|
|
call s:h('DraculaFg', s:fg)
|
|
call s:h('DraculaFgUnderline', s:fg, s:none, [s:attrs.underline])
|
|
call s:h('DraculaFgBold', s:fg, s:none, [s:attrs.bold])
|
|
|
|
call s:h('DraculaComment', s:comment)
|
|
call s:h('DraculaCommentBold', s:comment, s:none, [s:attrs.bold])
|
|
|
|
call s:h('DraculaSelection', s:none, s:selection)
|
|
|
|
call s:h('DraculaSubtle', s:subtle)
|
|
|
|
call s:h('DraculaCyan', s:cyan)
|
|
call s:h('DraculaCyanItalic', s:cyan, s:none, [s:attrs.italic])
|
|
|
|
call s:h('DraculaGreen', s:green)
|
|
call s:h('DraculaGreenBold', s:green, s:none, [s:attrs.bold])
|
|
call s:h('DraculaGreenItalic', s:green, s:none, [s:attrs.italic])
|
|
call s:h('DraculaGreenItalicUnderline', s:green, s:none, [s:attrs.italic, s:attrs.underline])
|
|
|
|
call s:h('DraculaOrange', s:orange)
|
|
call s:h('DraculaOrangeBold', s:orange, s:none, [s:attrs.bold])
|
|
call s:h('DraculaOrangeItalic', s:orange, s:none, [s:attrs.italic])
|
|
call s:h('DraculaOrangeBoldItalic', s:orange, s:none, [s:attrs.bold, s:attrs.italic])
|
|
call s:h('DraculaOrangeInverse', s:bg, s:orange)
|
|
|
|
call s:h('DraculaPink', s:pink)
|
|
call s:h('DraculaPinkItalic', s:pink, s:none, [s:attrs.italic])
|
|
|
|
call s:h('DraculaPurple', s:purple)
|
|
call s:h('DraculaPurpleBold', s:purple, s:none, [s:attrs.bold])
|
|
call s:h('DraculaPurpleItalic', s:purple, s:none, [s:attrs.italic])
|
|
|
|
call s:h('DraculaRed', s:red)
|
|
call s:h('DraculaRedInverse', s:fg, s:red)
|
|
|
|
call s:h('DraculaYellow', s:yellow)
|
|
call s:h('DraculaYellowItalic', s:yellow, s:none, [s:attrs.italic])
|
|
|
|
call s:h('DraculaError', s:red, s:none, [], s:red)
|
|
|
|
call s:h('DraculaErrorLine', s:none, s:none, [s:attrs.undercurl], s:red)
|
|
call s:h('DraculaWarnLine', s:none, s:none, [s:attrs.undercurl], s:orange)
|
|
call s:h('DraculaInfoLine', s:none, s:none, [s:attrs.undercurl], s:cyan)
|
|
|
|
call s:h('DraculaTodo', s:cyan, s:none, [s:attrs.bold, s:attrs.inverse])
|
|
call s:h('DraculaSearch', s:green, s:none, [s:attrs.inverse])
|
|
call s:h('DraculaBoundary', s:comment, s:bgdark)
|
|
call s:h('DraculaLink', s:cyan, s:none, [s:attrs.underline])
|
|
|
|
call s:h('DraculaDiffChange', s:orange, s:none)
|
|
call s:h('DraculaDiffText', s:bg, s:orange)
|
|
call s:h('DraculaDiffDelete', s:red, s:bgdark)
|
|
|
|
" }}}2
|
|
|
|
" }}}
|
|
" User Interface: {{{
|
|
|
|
set background=dark
|
|
|
|
" Required as some plugins will overwrite
|
|
call s:h('Normal', s:fg, g:dracula_colorterm || has('gui_running') ? s:bg : s:none )
|
|
call s:h('StatusLine', s:none, s:bglighter, [s:attrs.bold])
|
|
call s:h('StatusLineNC', s:none, s:bglight)
|
|
call s:h('StatusLineTerm', s:none, s:bglighter, [s:attrs.bold])
|
|
call s:h('StatusLineTermNC', s:none, s:bglight)
|
|
call s:h('WildMenu', s:bg, s:purple, [s:attrs.bold])
|
|
call s:h('CursorLine', s:none, s:subtle)
|
|
|
|
hi! link ColorColumn DraculaBgDark
|
|
hi! link CursorColumn CursorLine
|
|
hi! link CursorLineNr DraculaYellow
|
|
hi! link DiffAdd DraculaGreen
|
|
hi! link DiffAdded DiffAdd
|
|
hi! link DiffChange DraculaDiffChange
|
|
hi! link DiffDelete DraculaDiffDelete
|
|
hi! link DiffRemoved DiffDelete
|
|
hi! link DiffText DraculaDiffText
|
|
hi! link Directory DraculaPurpleBold
|
|
hi! link ErrorMsg DraculaRedInverse
|
|
hi! link FoldColumn DraculaSubtle
|
|
hi! link Folded DraculaBoundary
|
|
hi! link IncSearch DraculaOrangeInverse
|
|
call s:h('LineNr', s:comment)
|
|
hi! link MoreMsg DraculaFgBold
|
|
hi! link NonText DraculaSubtle
|
|
hi! link Pmenu DraculaBgDark
|
|
hi! link PmenuSbar DraculaBgDark
|
|
hi! link PmenuSel DraculaSelection
|
|
hi! link PmenuThumb DraculaSelection
|
|
hi! link Question DraculaFgBold
|
|
hi! link Search DraculaSearch
|
|
call s:h('SignColumn', s:comment)
|
|
hi! link TabLine DraculaBoundary
|
|
hi! link TabLineFill DraculaBgDark
|
|
hi! link TabLineSel Normal
|
|
hi! link Title DraculaGreenBold
|
|
hi! link VertSplit DraculaBoundary
|
|
hi! link Visual DraculaSelection
|
|
hi! link VisualNOS Visual
|
|
hi! link WarningMsg DraculaOrangeInverse
|
|
|
|
" }}}
|
|
" Syntax: {{{
|
|
|
|
" Required as some plugins will overwrite
|
|
call s:h('MatchParen', s:green, s:none, [s:attrs.underline])
|
|
call s:h('Conceal', s:cyan, s:none)
|
|
|
|
" Neovim uses SpecialKey for escape characters only. Vim uses it for that, plus whitespace.
|
|
if has('nvim')
|
|
hi! link SpecialKey DraculaRed
|
|
hi! link LspReferenceText DraculaSelection
|
|
hi! link LspReferenceRead DraculaSelection
|
|
hi! link LspReferenceWrite DraculaSelection
|
|
hi! link LspDiagnosticsDefaultInformation DraculaCyan
|
|
hi! link LspDiagnosticsDefaultHint DraculaCyan
|
|
hi! link LspDiagnosticsDefaultError DraculaError
|
|
hi! link LspDiagnosticsDefaultWarning DraculaOrange
|
|
hi! link LspDiagnosticsUnderlineError DraculaErrorLine
|
|
hi! link LspDiagnosticsUnderlineHint DraculaInfoLine
|
|
hi! link LspDiagnosticsUnderlineInformation DraculaInfoLine
|
|
hi! link LspDiagnosticsUnderlineWarning DraculaWarnLine
|
|
else
|
|
hi! link SpecialKey DraculaPink
|
|
endif
|
|
|
|
hi! link Comment DraculaComment
|
|
hi! link Underlined DraculaFgUnderline
|
|
hi! link Todo DraculaTodo
|
|
|
|
hi! link Error DraculaError
|
|
hi! link SpellBad DraculaErrorLine
|
|
hi! link SpellLocal DraculaWarnLine
|
|
hi! link SpellCap DraculaInfoLine
|
|
hi! link SpellRare DraculaInfoLine
|
|
|
|
hi! link Constant DraculaPurple
|
|
hi! link String DraculaYellow
|
|
hi! link Character DraculaPink
|
|
hi! link Number Constant
|
|
hi! link Boolean Constant
|
|
hi! link Float Constant
|
|
|
|
hi! link Identifier DraculaFg
|
|
hi! link Function DraculaGreen
|
|
|
|
hi! link Statement DraculaPink
|
|
hi! link Conditional DraculaPink
|
|
hi! link Repeat DraculaPink
|
|
hi! link Label DraculaPink
|
|
hi! link Operator DraculaPink
|
|
hi! link Keyword DraculaPink
|
|
hi! link Exception DraculaPink
|
|
|
|
hi! link PreProc DraculaPink
|
|
hi! link Include DraculaPink
|
|
hi! link Define DraculaPink
|
|
hi! link Macro DraculaPink
|
|
hi! link PreCondit DraculaPink
|
|
hi! link StorageClass DraculaPink
|
|
hi! link Structure DraculaPink
|
|
hi! link Typedef DraculaPink
|
|
|
|
hi! link Type DraculaCyanItalic
|
|
|
|
hi! link Delimiter DraculaFg
|
|
|
|
hi! link Special DraculaPink
|
|
hi! link SpecialComment DraculaCyanItalic
|
|
hi! link Tag DraculaCyan
|
|
hi! link helpHyperTextJump DraculaLink
|
|
hi! link helpCommand DraculaPurple
|
|
hi! link helpExample DraculaGreen
|
|
hi! link helpBacktick Special
|
|
|
|
"}}}
|
|
|
|
" vim: fdm=marker ts=2 sts=2 sw=2 fdl=0 et:
|