if version > 580
    hi clear
    if exists('syntax_on')
        syntax reset
    endif
endif

let g:colors_name='ghdark'

let g:github_colors = {
  \ "base0"        : ["#0d1117", 233],
  \ "base1"        : ["#161b22", 235],
  \ "base2"        : ["#21262d", 237],
  \ "base3"        : ["#89929b", 243],
  \ "base4"        : ["#c6cdd5", 249],
  \ "base5"        : ["#ecf2f8", 252],
  \ "red"          : ["#fa7970", 210],
  \ "orange"       : ["#faa356", 178],
  \ "green"        : ["#7ce38b", 114],
  \ "lightblue"    : ["#a2d2fb", 153],
  \ "blue"         : ["#77bdfb", 75],
  \ "purp"         : ["#cea5fb", 183],
  \ "none"         : ["NONE", "NONE"]
  \ }

" if doesn't support termguicolors or < 256 colors exit
if !(has('termguicolors') && &termguicolors) && !has('gui_running') && &t_Co != 256
  finish
endif

"########################################
" Terminal colors for NeoVim

if has('nvim')
    let g:terminal_color_0 = g:github_colors["base0"][0]
    let g:terminal_color_8 = g:github_colors["base3"][0]

    let g:terminal_color_1 = g:github_colors["red"][0]
    let g:terminal_color_9 = g:github_colors["red"][0]

    let g:terminal_color_2 = g:github_colors["green"][0]
    let g:terminal_color_10 = g:github_colors["green"][0]

    let g:terminal_color_3 = g:github_colors["orange"][0]
    let g:terminal_color_11 = g:github_colors["orange"][0]

    let g:terminal_color_4 = g:github_colors["blue"][0]
    let g:terminal_color_12 = g:github_colors["lightblue"][0]

    let g:terminal_color_5 = g:github_colors["purp"][0]
    let g:terminal_color_13 = g:github_colors["purp"][0]

    let g:terminal_color_6 = g:github_colors["blue"][0]
    let g:terminal_color_14 = g:github_colors["lightblue"][0]

    let g:terminal_color_7 = g:github_colors["base4"][0]
    let g:terminal_color_15 = g:github_colors["base5"][0]
endif

" Terminal colors for Vim
if has('*term_setansicolors')
    let g:terminal_ansi_colors = repeat([0], 16)

    let g:terminal_ansi_colors[0] = g:github_colors["base0"][0]
    let g:terminal_ansi_colors[8] = g:github_colors["base3"][0]

    let g:terminal_ansi_colors[1] = g:github_colors["red"][0]
    let g:terminal_ansi_colors[9] = g:github_colors["red"][0]

    let g:terminal_ansi_colors[2] = g:github_colors["green"][0]
    let g:terminal_ansi_colors[10] = g:github_colors["green"][0]

    let g:terminal_ansi_colors[3] = g:github_colors["orange"][0]
    let g:terminal_ansi_colors[11] = g:github_colors["orange"][0]

    let g:terminal_ansi_colors[4] = g:github_colors["blue"][0]
    let g:terminal_ansi_colors[12] = g:github_colors["lightblue"][0]

    let g:terminal_ansi_colors[5] = g:github_colors["purp"][0]
    let g:terminal_ansi_colors[13] = g:github_colors["purp"][0]

    let g:terminal_ansi_colors[6] = g:github_colors["blue"][0]
    let g:terminal_ansi_colors[14] = g:github_colors["lightblue"][0]

    let g:terminal_ansi_colors[7] = g:github_colors["base4"][0]
    let g:terminal_ansi_colors[15] = g:github_colors["base5"][0]
endif

if !exists("g:gh_color")
    let g:gh_color = "hard"
endif

if g:gh_color ==# "soft"
    let g:github_colors["base0"] = g:github_colors["base1"]
    let g:github_colors["base1"] = g:github_colors["base2"]
    let g:github_colors["base2"] = ["#30353c", 238]
endif

"########################################
" funcs

function! s:ghhl(group, guifg, ...)
    " Arguments: group, guifg, guibg, style

    let fg = g:github_colors[a:guifg]

    if a:0 >= 1
        let bg = g:github_colors[a:1]
    else
        let bg = g:github_colors["none"]
    endif

    if a:0 >= 2
        let style = a:2
    else
        let style = "NONE"
    endif

    let hi_str = [ "hi", a:group,
            \ 'guifg=' . fg[0], "ctermfg=" . fg[1],
            \ 'guibg=' . bg[0], "ctermbg=" . bg[1],
            \ 'gui=' . style, "cterm=" . style
            \ ]

    execute join(hi_str, ' ')
endfunction

"########################################
" clear any previous highlighting and syntax

let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 2

"########################################
" set the colors
"
call s:ghhl("GhBase0", "base0")
call s:ghhl("GhBase1", "base1")
call s:ghhl("GhBase2", "base2")
call s:ghhl("GhBase3", "base3")
call s:ghhl("GhBase4", "base4")
call s:ghhl("GhBase5", "base5")
call s:ghhl("GhRed", "red")
call s:ghhl("GhRedItalic", "red", "none", "italic")
call s:ghhl("GhPurp", "purp")
call s:ghhl("GhPurpUnder", "purp", "none", "underline")
call s:ghhl("GhBlue", "blue")
call s:ghhl("GhBlueUnder", "blue", "none", "underline")
call s:ghhl("GhBlueBold", "blue", "none", "bold")
call s:ghhl("GhBlueItalic", "blue", "none", "italic")
call s:ghhl("GhOrange", "orange")
call s:ghhl("GhOrangeBold", "orange", "none", "bold")
call s:ghhl("GhLightBlue", "lightblue")
call s:ghhl("GhGreen", "green")
call s:ghhl("GhUnder", "none", "none", "underline")
call s:ghhl("GhBold", "none", "none", "bold")
call s:ghhl("GhItalic", "none", "none", "italic")

call s:ghhl("Cursor", "base4", "none", "reverse")
call s:ghhl("iCursor", "base0", "red")
call s:ghhl("vCursor", "base0", "purp")
call s:ghhl("CursorColumn", "none", "base1")
call s:ghhl("CursorLine", "none", "base1")
call s:ghhl("CursorLineNr", "lightblue", "base2")
call s:ghhl("DiffAdd", "green", "base0")
call s:ghhl("DiffChange", "orange", "base0")
call s:ghhl("DiffDelete", "red", "base0")
call s:ghhl("ErrorMsg", "red", "base1")
call s:ghhl("Error", "none", "red")
call s:ghhl("Folded", "blue", "base1")
call s:ghhl("MatchParen", "none", "base3")
call s:ghhl("Normal", "base5", "base0")
call s:ghhl("Pmenu", "base4", "base1")
call s:ghhl("PmenuSel", "base4", "base2")
call s:ghhl("Search", "base0", "base5")
call s:ghhl("SignColumn", "none", "base0")
call s:ghhl("StatusLine", "base5", "base2")
call s:ghhl("StatusLineNC", "base3", "base1")
call s:ghhl("Todo", "base4", "base0")
call s:ghhl("VertSplit", "base1", "base1")
call s:ghhl("Visual", "none", "base0", "reverse")
call s:ghhl("WarningMsg", "orange", "base1")

"########################################
" links

hi! link Boolean Constant
hi! link Character Constant
hi! link Comment GhBase3
hi! link Conceal Ignore
hi! link Conditional Statement
hi! link Constant GhLightBlue
hi! link Debug Special
hi! link Define PreProc
hi! link Delimiter GhBase5
hi! link Directory GhBlue
hi! link Exception Statement
hi! link Float Number
hi! link FunctionDef Function
hi! link Function GhPurp
hi! link Identifier GhBlue
hi! link Include Statement
hi! link IncSearch Search
hi! link Keyword GhRed
hi! link Label GhBlue
hi! link LibraryFunc Function
hi! link LibraryIdent Identifier
hi! link LibraryType Type
hi! link LineNr GhBase3
hi! link LocalFunc Function
hi! link LocalIdent Identifier
hi! link LocalType Type
hi! link Macro PreProc
hi! link ModeMsg GhBase4
hi! link MoreMsg GhBase4
hi! link MsgArea Title
hi! link Noise Delimiter
hi! link NonText GhBase3
hi! link NonText Ignore
hi! link Number GhOrange
hi! link Operator GhBlue
hi! link PreCondit PreProc
hi! link PreProc GhBlue
hi! link Question GhBase4
hi! link Quote StringDelimiter
hi! link Repeat GhPurp
hi! link Searchlight Search
hi! link SignifySignAdd Signify
hi! link SignifySignChange Signify
hi! link SignifySignDelete Signify
hi! link SpecialChar Special
hi! link Special GhBlue
hi! link SpecialKey GhBase3
hi! link SpecialKey Ignore
hi! link Statement GhRed
hi! link StatusLineTermNC StatusLineNC
hi! link StatusLineTerm StatusLine
hi! link StorageClass Statement
hi! link String Constant
hi! link StringDelimiter String
hi! link Structure Statement
hi! link TabLineFill StatusLineNC
hi! link TabLineSel StatusLine
hi! link TabLine StatusLineNC
hi! link Tag Special
hi! link Terminal Normal
hi! link Title GhBase4
hi! link Type GhRed

" ALE

hi! link ALEVirtualTextError ErrorMsg
hi! link ALEVirtualTextWarning WarningMsg

" bib

hi! link bibEntryKw LibraryIdent
hi! link bibKey IdentifierDef
hi! link bibType LibraryType

" C

hi! link cDefine Keyword

" Coc

hi! link CocErrorSign ErrorMsg
hi! link CocWarningSign WarningMsg
hi! link CocInfoSign GhLightBlue
hi! link CocHintSign GhPurp
hi! link CocErrorFloat ErrorMsg
hi! link CocWarningFloat WarningMsg
hi! link CocInfoFloat GhLightBlue
hi! link CocHintFloat GhPurp
hi! link CocDiagnosticsError ErrorMsg
hi! link CocDiagnosticsWarning WarningMsg
hi! link CocDiagnosticsInfo GhLightBlue
hi! link CocDiagnosticsHint GhPurp
hi! link CocSelectedText GhRed
hi! link CocCodeLens GhBase3

call s:ghhl("CocErrorHighlight", "none", "none", "undercurl,bold")
hi! link CocWarningHighlight CocErrorHighlight
hi! link CocInfoHighlight CocErrorHighlight
hi! link CocHintHighlight CocErrorHighlight

" CSS

hi! link cssAtRule Keyword
hi! link cssAtKeyword Keyword
hi! link cssMediaProp GhBlue
hi! link cssBoxProp GhBlue
hi! link cssFlexibleBoxProp cssBoxProp
hi! link cssPositioningProp cssBoxProp
hi! link cssBackgroundProp cssBoxProp
hi! link cssBorderProp cssBoxProp
hi! link cssIEUIProp cssBoxProp
hi! link cssFontDescriptorProp cssBoxProp
hi! link cssTextProp cssBoxProp
hi! link cssCustomProp GhWhite
hi! link cssUIProp cssBoxProp
hi! link cssTransitionProp cssBoxProp
hi! link cssCascadeProp cssBoxProp
hi! link cssColorProp cssBoxProp
hi! link cssListProp cssBoxProp
hi! link cssPageProp cssBoxProp
hi! link cssAttrComma GhWhite
hi! link cssBackgroundAttr cssBoxAttr
hi! link cssBorderAttr cssBoxAttr
hi! link cssBoxAttr Normal
hi! link cssBraces cssNoise
hi! link cssClassName LocalIdent
hi! link cssColor LightBlue
hi! link cssCommonAttr cssBoxAttr
hi! link cssFlexibleBoxAttr cssBoxAttr
hi! link cssFunction None
hi! link cssIdentifier LocalIdent
hi! link cssMediaType Normal
hi! link cssMultiColumnAttr cssBoxAttr
hi! link cssNoise Normal
hi! link cssPositioningAttr cssBoxAttr
hi! link cssProp LibraryType
hi! link cssPseudoClassId LibraryIdent
hi! link cssSelectorOp Operator
hi! link cssTableAttr cssBoxAttr
hi! link cssTagName htmlTagName
hi! link cssTextAttr cssBoxAttr
hi! link cssTransitionAttr cssBoxAttr
hi! link cssUIAttr cssBoxAttr
hi! link cssUnitDecorators Normal

" diff

hi! link diffAdded DiffAdd
hi! link diffBDiffer WarningMsg
hi! link diffChanged DiffChange
hi! link diffCommon WarningMsg
hi! link diffDiffer WarningMsg
hi! link diffFile Directory
hi! link diffIdentical WarningMsg
hi! link diffIndexLine Number
hi! link diffIsA WarningMsg
hi! link diffNoEOL WarningMsg
hi! link diffOnly WarningMsg
hi! link diffRemoved DiffDelete

" Git commit

hi! link gitcommitHeader Todo
hi! link gitcommitOverflow Error
hi! link gitcommitSummary Title

" go

hi! link goBuiltins Function
hi! link goField LocalIdent
hi! link goFunctionCall LibraryFunc
hi! link goFunction FunctionDef
hi! link goLabel Keyword
hi! link goType Normal
hi! link goVarAssign LocalIdent
hi! link goVarDefs IdentifierDef

" Vim help

hi! link helpCommand helpExample
hi! link helpExample markdownCode
hi! link helpHeadline Title
hi! link helpHyperTextEntry Comment
hi! link helpHyperTextJump Underlined
hi! link helpSectionDelim Ignore
hi! link helpURL helpHyperTextJump
hi! link helpVim Title

" HTML

hi! link htmlArg Special
hi! link htmlLink Underlined
hi! link htmlSpecialTagName htmlTagName
hi! link htmlTag Identifier
hi! link htmlTagName GhGreen

" java

hi! link javaScriptBraces Normal
hi! link javaScriptFunction Keyword
hi! link javaScriptIdentifier Keyword

" jinja

hi! link jinjaBlockName Typedef
hi! link jinjaFilter LibraryFunc
hi! link jinjaNumber Number
hi! link jinjaOperator Operator
hi! link jinjaRawDelim PreProc
hi! link jinjaSpecial Keyword
hi! link jinjaString String
hi! link jinjaTagDelim Delimiter
hi! link jinjaVarDelim Delimiter

" JavaScript

hi! link jsBuiltins LibraryFunc
hi! link jsClassDefinition Typedef
hi! link jsDestructuringBraces jsFuncBraces
hi! link jsDomErrNo LibraryIdent
hi! link jsDomNodeConsts LibraryIdent
hi! link jsDot Normal
hi! link jsExceptions LibraryType
hi! link jsFuncArgCommas jsFuncParens
hi! link jsFuncBraces jsFuncBraces
hi! link jsFuncName Function
hi! link jsFuncParens Normal
hi! link jsFunction jsStatement
hi! link jsGlobalNodeObjects jsFuncName
hi! link jsGlobalObjects Normal
hi! link jsIfElseBraces jsFuncBraces
hi! link jsNoise jsFuncBraces
hi! link jsObjectBraces jsFuncBraces
hi! link jsObjectKey jsObjectProp
hi! link jsObjectProp LocalIdent
hi! link jsObjectSeparator jsFuncBraces
hi! link jsOperatorKeyword jsStatement
hi! link jsParensIfElse jsFuncBraces
hi! link jsParens jsFuncBraces
hi! link jsThis jsStatement
hi! link jsVariableDef IdentifierDef
hi! link jsBooleanFalse GhBlue
hi! link jsBooleanTrue jsBooleanFalse
hi! link jsRepeat Keyword
hi! link jsArrowFunction GhBlue
hi! link jsTernaryIfOperator jsDot

" markdown

hi! link markdownH1 GhOrangeBold
hi! link markdownH2 markdownH1
hi! link markdownH3 markdownH1
hi! link markdownH4 markdownH1
hi! link markdownH5 markdownH1
hi! link markdownHeadingDelimiter GhBlueBold
hi! link markdownCode GhLightBlue
hi! link markdownCodeDelimiter GhLightBlue
hi! link markdownInlineCode markdownCode
hi! link markdownListMarker GhOrange
hi! link markdownLinkText GhBlueUnder
hi! link markdownUrl GhRedItalic
hi! link markdownLinkUrl markdownUrl
hi! link markdownBold GhBold
hi! link markdownItalic GhItalic

" python
hi! link pythonClass GhOrange
hi! link pythonRepeat Keyword
hi! link pythonBoolean GhBlue
hi! link pythonBuiltin GhBlue
hi! link pythonBuiltinType GhBase5
hi! link pythonClassVar GhBase5
hi! link pythonOperator None
hi! link pythonOperator GhBlue
hi! link pythonRun GhBase3
hi! link pythonDecorator GhPurp

" Rust

hi! link rsForeignConst LibraryIdent
hi! link rsForeignFunc LibraryFunc
hi! link rsForeignType LibraryType
hi! link rsFuncDef FunctionDef
hi! link rsIdentDef IdentifierDef
hi! link rsLibraryConst LibraryIdent
hi! link rsLibraryFunc LibraryFunc
hi! link rsLibraryType LibraryType
hi! link rsLifetimeDef IdentifierDef
hi! link rsSpecialLifetime LibraryIdent
hi! link rsUserConst LocalIdent
hi! link rsUserFunc LocalFunc
hi! link rsUserLifetime LocalIdent
hi! link rsUserMethod LibraryFunc
hi! link rsUserType LocalType
hi! link rustAttribute Normal
hi! link rustCommentLineDoc rustCommentLine
hi! link rustDerive rustAttribute
hi! link rustDeriveTrait rustAttribute
hi! link rustEnumVariant GhBlue
hi! link rustIdentifier Function
hi! link rustIdentifier Normal
hi! link rustLifetime GhPurp
hi! link rustMacro GhBlue
hi! link rustModPath Normal
hi! link rustModPathSep Keyword
hi! link rustOperator Keyword
hi! link rustQuestionMark Normal
hi! link rustSelf GhBlue

" SCSS

hi! link scssAttribute cssNoise
hi! link scssInclude Keyword
hi! link scssMixin Keyword
hi! link scssMixinName LocalFunc
hi! link scssMixinParams cssNoise
hi! link scssSelectorName cssClassName
hi! link scssVariableAssignment Operator
hi! link scssVariableValue Operator

" shell

hi! link shAlias shVariable
hi! link shCaseLabel Type
hi! link shDerefPPS Keyword
hi! link shDeref GhBlue
hi! link shDerefSimple GhBlue
hi! link shDoubleQuote shQuote
hi! link shEcho GhBlue
hi! link shEcho Normal
hi! link shFunctionKey Keyword
hi! link shFunctionOne Normal
hi! link shOperator shParen
hi! link shOption shFunctionOne
hi! link shParen Normal
hi! link shQuote Constant
hi! link shRange shParen
hi! link shRedir Keyword
hi! link shSetList shFunctionOne
hi! link shSnglCase shParen
hi! link shStatement Keyword
hi! link shVariable GhRed
hi! link shWrapLineOperator shParen

" swift

hi! link swiftFuncDef FunctionDef
hi! link swiftIdentDef IdentifierDef
hi! link swiftLibraryFunc LibraryFunc
hi! link swiftLibraryProp LibraryIdent
 hi! link swiftLibraryType LibraryType
hi! link swiftUserFunc LocalFunc
hi! link swiftUserProp LocalIdent
hi! link swiftUserType LocalType

" typescript

hi! link typescriptArrayMethod LibraryFunc
hi! link typescriptArrowFunc Operator
hi! link typescriptAssign Operator
hi! link typescriptBinaryOp Operator
hi! link typescriptBOM LibraryType
hi! link typescriptBOMWindowCons LibraryType
hi! link typescriptBOMWindowMethod LibraryFunc
hi! link typescriptBOMWindowProp LibraryType
hi! link typescriptBraces Delimiter
hi! link typescriptCall None
hi! link typescriptClassHeritage Type
hi! link typescriptClassName TypeDef
hi! link typescriptDOMDocMethod LibraryFunc
hi! link typescriptDOMDocProp LibraryIdent
hi! link typescriptDOMEventCons LibraryType
hi! link typescriptDOMEventMethod LibraryFunc
hi! link typescriptDOMEventMethod LibraryFunc
hi! link typescriptDOMEventProp LibraryIdent
hi! link typescriptDOMEventTargetMethod LibraryFunc
hi! link typescriptDOMNodeMethod LibraryFunc
hi! link typescriptDOMStorageMethod LibraryIdent
hi! link typescriptEndColons Delimiter
hi! link typescriptExport Keyword
hi! link typescriptFuncName FunctionDef
hi! link typescriptFuncTypeArrow typescriptArrowFunc
hi! link typescriptGlobal typescriptPredefinedType
hi! link typescriptIdentifier Keyword
hi! link typescriptInterfaceName Typedef
hi! link typescriptMember LocalFunc
hi! link typescriptObjectLabel LocalIdent
hi! link typescriptOperator Keyword
hi! link typescriptParens Delimiter
hi! link typescriptPredefinedType LibraryType
hi! link typescriptTypeAnnotation Delimiter
hi! link typescriptTypeReference typescriptUserDefinedType
hi! link typescriptUserDefinedType LocalType
hi! link typescriptVariableDeclaration IdentifierDef
hi! link typescriptVariable Keyword

" vim

hi! link vimAutoCmdSfxList LibraryType
hi! link vimAutoEventList LocalIdent
hi! link vimCmdSep vimSep
hi! link vimCommand Keyword
hi! link vimCommentTitle SpecialComment
hi! link vimContinue vimSep
hi! link vimExecute LocalFunc
hi! link vimFuncName LibraryFunc
hi! link vimFunction FunctionDef
hi! link vimFuncVar Normal
hi! link vimGroup vimHiGroup
hi! link vimHiBang vimOper
hi! link vimHighlight Operator
hi! link vimHiGroup GhOrange
hi! link vimIsCommand vimVar
hi! link vimLet vimOper
hi! link vimMapModKey vimNotation
hi! link vimNotation LibraryType
hi! link vimOper Keyword
hi! link vimOperParen Normal
hi! link vimOption LibraryIdent
hi! link vimParenSep vimSep
hi! link vimSep Normal
hi! link vimUserFunc LocalFunc
hi! link vimVar Normal
hi! link vimUserAttrb Identifier
hi! link vimUserCommand vimUserAttrb
hi! link vimPatSepR GhGreen
hi! link vimPatRegion vimPatSepR
hi! link vimSynNotPatRange vimPatSepR
hi! link vimSynKeyRegion Keyword
hi! link vimSynType Identifier
hi! link vimSyncMatch vimSynType

hi! link VisualNOS Visual
hi! link Whitespace Ignore

" yaml

hi! link yamlKey GhGreen
hi! link yamlConstant GhRed

" nerdtree

hi! link NERDTreeDir GhBlue
hi! link NERDTreeDirSlash GhBlue
hi! link NERDTreeOpenable GhRed
hi! link NERDTreeClosable GhGreen
hi! link NERDTreeFile GhBase5
hi! link NERDTreeExecFile GhOrange
hi! link NERDTreeCWD GhPurp
hi! link NERDTreeUp GhBase3
hi! link NERDTreeHelp GhBase5

" toml

hi! link tomlKey GhBase4
hi! link tomlKeyValueArray GhBase4
hi! link tomlTable GhPurp

" json

hi! link jsonBoolean GhBlue
hi! link jsonKeywordMatch GhBase4
hi! link jsonString String
hi! link jsonKeyword jsonString
hi! link jsonQuote jsonString