lua/compline-colorscheme.lua 58.8 K raw
1
-- Some useful links for making your own colorscheme:
2
--
3
-- https://github.com/chriskempson/base16
4
-- https://colourco.de/
5
-- https://color.adobe.com/create/color-wheel
6
-- http://vrl.cs.brown.edu/color
7
8
local M = {}
9
local hex_re = vim.regex('#\\x\\x\\x\\x\\x\\x')
10
11
local HEX_DIGITS = {
12
    ['0'] = 0,
13
    ['1'] = 1,
14
    ['2'] = 2,
15
    ['3'] = 3,
16
    ['4'] = 4,
17
    ['5'] = 5,
18
    ['6'] = 6,
19
    ['7'] = 7,
20
    ['8'] = 8,
21
    ['9'] = 9,
22
    ['a'] = 10,
23
    ['b'] = 11,
24
    ['c'] = 12,
25
    ['d'] = 13,
26
    ['e'] = 14,
27
    ['f'] = 15,
28
    ['A'] = 10,
29
    ['B'] = 11,
30
    ['C'] = 12,
31
    ['D'] = 13,
32
    ['E'] = 14,
33
    ['F'] = 15,
34
}
35
36
local function hex_to_rgb(hex)
37
    return HEX_DIGITS[string.sub(hex, 1, 1)] * 16 + HEX_DIGITS[string.sub(hex, 2, 2)],
38
        HEX_DIGITS[string.sub(hex, 3, 3)] * 16 + HEX_DIGITS[string.sub(hex, 4, 4)],
39
        HEX_DIGITS[string.sub(hex, 5, 5)] * 16 + HEX_DIGITS[string.sub(hex, 6, 6)]
40
end
41
42
local function rgb_to_hex(r, g, b)
43
    return bit.tohex(bit.bor(bit.lshift(r, 16), bit.lshift(g, 8), b), 6)
44
end
45
46
local function darken(hex, pct)
47
    pct = 1 - pct
48
    local r, g, b = hex_to_rgb(string.sub(hex, 2))
49
    r = math.floor(r * pct)
50
    g = math.floor(g * pct)
51
    b = math.floor(b * pct)
52
    return string.format("#%s", rgb_to_hex(r, g, b))
53
end
54
55
-- This is a bit of syntactic sugar for creating highlight groups.
56
--
57
-- local colorscheme = require('colorscheme')
58
-- local hi = colorscheme.highlight
59
-- hi.Comment = { guifg='#ffffff', guibg='#000000', gui='italic', guisp=nil }
60
-- hi.LspDiagnosticsDefaultError = 'DiagnosticError' -- Link to another group
61
--
62
-- This is equivalent to the following vimscript
63
--
64
-- hi Comment guifg=#ffffff guibg=#000000 gui=italic
65
-- hi! link LspDiagnosticsDefaultError DiagnosticError
66
M.highlight = setmetatable({}, {
67
    __newindex = function(_, hlgroup, args)
68
        if ('string' == type(args)) then
69
            vim.api.nvim_set_hl(0, hlgroup, { link = args })
70
            return
71
        end
72
73
        local guifg, guibg, gui, guisp = args.guifg or nil, args.guibg or nil, args.gui or nil, args.guisp or nil
74
        local ctermfg, ctermbg = args.ctermfg or nil, args.ctermbg or nil
75
        local val = {}
76
        if guifg then val.fg = guifg end
77
        if guibg then val.bg = guibg end
78
        if ctermfg then val.ctermfg = ctermfg end
79
        if ctermbg then val.ctermbg = ctermbg end
80
        if guisp then val.sp = guisp end
81
        if gui then
82
            for x in string.gmatch(gui, '([^,]+)') do
83
                if x ~= "none" then
84
                    val[x] = true
85
                end
86
            end
87
        end
88
        vim.api.nvim_set_hl(0, hlgroup, val)
89
    end
90
})
91
92
function M.with_config(config)
93
    M.config = vim.tbl_extend("force", {
94
        telescope = true,
95
        telescope_borders = false,
96
        indentblankline = true,
97
        notify = true,
98
        ts_rainbow = true,
99
        cmp = true,
100
        illuminate = true,
101
        lsp_semantic = true,
102
        mini_completion = true,
103
        dapui = true,
104
    }, config or M.config or {})
105
end
106
107
--- Creates a base16 colorscheme using the colors specified.
108
--
109
-- Builtin colorschemes can be found in the M.colorschemes table.
110
--
111
-- The default Vim highlight groups (including User[1-9]), highlight groups
112
-- pertaining to Neovim's builtin LSP, and highlight groups pertaining to
113
-- Treesitter will be defined.
114
--
115
-- It's worth noting that many colorschemes will specify language specific
116
-- highlight groups like rubyConstant or pythonInclude. However, I don't do
117
-- that here since these should instead be linked to an existing highlight
118
-- group.
119
--
120
-- @param colors (table) table with keys 'base00', 'base01', 'base02',
121
--   'base03', 'base04', 'base05', 'base06', 'base07', 'base08', 'base09',
122
--   'base0A', 'base0B', 'base0C', 'base0D', 'base0E', 'base0F'. Each key should
123
--   map to a valid 6 digit hex color. If a string is provided, the
124
--   corresponding table specifying the colorscheme will be used.
125
function M.setup(colors, config)
126
    M.with_config(config)
127
128
    if type(colors) == 'string' then
129
        colors = M.colorschemes[colors]
130
    end
131
132
    if vim.fn.exists('syntax_on') then
133
        vim.cmd('syntax reset')
134
    end
135
136
    -- BASE16_THEME in a tmux session cannot be trusted because of how envs in tmux panes work.
137
    local base16_colorscheme = nil
138
    if vim.env.TMUX == nil and vim.env.BASE16_THEME ~= nil then
139
        -- Only trust BASE16_THEME if not inside a tmux pane:
140
        base16_colorscheme = M.colorschemes[vim.env.BASE16_THEME]
141
    end
142
    M.colors                              = colors or base16_colorscheme or
143
        M.colorschemes['schemer-dark']
144
    local hi                              = M.highlight
145
146
    -- Vim editor colors
147
    hi.Normal                             = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
148
    hi.Bold                               = { guifg = nil, guibg = nil, gui = 'bold', guisp = nil, ctermfg = nil, ctermbg = nil }
149
    hi.Debug                              = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
150
    hi.Directory                          = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
151
    hi.Error                              = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
152
    hi.ErrorMsg                           = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
153
    hi.Exception                          = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
154
    hi.FoldColumn                         = { guifg = M.colors.base0C, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = M.colors.cterm00 }
155
    hi.Folded                             = { guifg = M.colors.base03, guibg = M.colors.base01, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = M.colors.cterm01 }
156
    hi.IncSearch                          = { guifg = M.colors.base01, guibg = M.colors.base09, gui = 'none', guisp = nil, ctermfg = M.colors.cterm01, ctermbg = M.colors.cterm09 }
157
    hi.Italic                             = { guifg = nil, guibg = nil, gui = 'italic', guisp = nil, ctermfg = nil, ctermbg = nil }
158
    hi.Macro                              = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
159
    hi.MatchParen                         = { guifg = nil, guibg = M.colors.base03, gui = nil, guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm03 }
160
    hi.ModeMsg                            = { guifg = M.colors.base0B, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
161
    hi.MoreMsg                            = { guifg = M.colors.base0B, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
162
    hi.Question                           = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
163
    hi.Search                             = { guifg = M.colors.base01, guibg = M.colors.base0A, gui = nil, guisp = nil, ctermfg = M.colors.cterm01, ctermbg = M.colors.cterm0A }
164
    hi.Substitute                         = { guifg = M.colors.base01, guibg = M.colors.base0A, gui = 'none', guisp = nil, ctermfg = M.colors.cterm01, ctermbg = M.colors.cterm0A }
165
    hi.SpecialKey                         = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
166
    hi.TooLong                            = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
167
    hi.Underlined                         = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
168
    hi.Visual                             = { guifg = nil, guibg = M.colors.base02, gui = nil, guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm02 }
169
    hi.VisualNOS                          = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
170
    hi.WarningMsg                         = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
171
    hi.WildMenu                           = { guifg = M.colors.base08, guibg = M.colors.base0A, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm0A }
172
    hi.Title                              = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
173
    hi.Conceal                            = { guifg = M.colors.base0D, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = M.colors.cterm00 }
174
    hi.Cursor                             = { guifg = M.colors.base00, guibg = M.colors.base05, gui = nil, guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm05 }
175
    hi.NonText                            = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
176
    hi.LineNr                             = { guifg = M.colors.base04, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = M.colors.cterm00 }
177
    hi.SignColumn                         = { guifg = M.colors.base04, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = M.colors.cterm00 }
178
    hi.StatusLine                         = { guifg = M.colors.base05, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm02 }
179
    hi.StatusLineNC                       = { guifg = M.colors.base04, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm04, ctermbg = M.colors.cterm01 }
180
    hi.WinBar                             = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
181
    hi.WinBarNC                           = { guifg = M.colors.base04, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm04, ctermbg = nil }
182
    hi.VertSplit                          = { guifg = M.colors.base05, guibg = M.colors.base00, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
183
    hi.ColorColumn                        = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
184
    hi.CursorColumn                       = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
185
    hi.CursorLine                         = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
186
    hi.CursorLineNr                       = { guifg = M.colors.base04, guibg = M.colors.base01, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = M.colors.cterm01 }
187
    hi.QuickFixLine                       = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
188
    hi.PMenu                              = { guifg = M.colors.base05, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm01 }
189
    hi.PMenuSel                           = { guifg = M.colors.base01, guibg = M.colors.base05, gui = nil, guisp = nil, ctermfg = M.colors.cterm01, ctermbg = M.colors.cterm05 }
190
    hi.TabLine                            = { guifg = M.colors.base03, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = M.colors.cterm01 }
191
    hi.TabLineFill                        = { guifg = M.colors.base03, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = M.colors.cterm01 }
192
    hi.TabLineSel                         = { guifg = M.colors.base0B, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm01 }
193
194
    -- Standard syntax highlighting
195
    hi.Boolean                            = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
196
    hi.Character                          = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
197
    hi.Comment                            = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
198
    hi.Conditional                        = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
199
    hi.Constant                           = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
200
    hi.Define                             = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
201
    hi.Delimiter                          = { guifg = M.colors.base0F, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
202
    hi.Float                              = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
203
    hi.Function                           = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
204
    hi.Identifier                         = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
205
    hi.Include                            = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
206
    hi.Keyword                            = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
207
    hi.Label                              = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
208
    hi.Number                             = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
209
    hi.Operator                           = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
210
    hi.PreProc                            = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
211
    hi.Repeat                             = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
212
    hi.Special                            = { guifg = M.colors.base0C, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
213
    hi.SpecialChar                        = { guifg = M.colors.base0F, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
214
    hi.Statement                          = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
215
    hi.StorageClass                       = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
216
    hi.String                             = { guifg = M.colors.base0B, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
217
    hi.Structure                          = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
218
    hi.Tag                                = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
219
    hi.Todo                               = { guifg = M.colors.base0A, guibg = M.colors.base01, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = M.colors.cterm01 }
220
    hi.Type                               = { guifg = M.colors.base0A, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
221
    hi.Typedef                            = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
222
223
    -- Diff highlighting
224
    hi.DiffAdd                            = { guifg = M.colors.base0B, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm00 }
225
    hi.DiffChange                         = { guifg = M.colors.base03, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = M.colors.cterm00 }
226
    hi.DiffDelete                         = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
227
    hi.DiffText                           = { guifg = M.colors.base0D, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = M.colors.cterm00 }
228
    hi.DiffAdded                          = { guifg = M.colors.base0B, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm00 }
229
    hi.DiffFile                           = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
230
    hi.DiffNewFile                        = { guifg = M.colors.base0B, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm00 }
231
    hi.DiffLine                           = { guifg = M.colors.base0D, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = M.colors.cterm00 }
232
    hi.DiffRemoved                        = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
233
234
    -- Git highlighting
235
    hi.gitcommitOverflow                  = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
236
    hi.gitcommitSummary                   = { guifg = M.colors.base0B, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
237
    hi.gitcommitComment                   = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
238
    hi.gitcommitUntracked                 = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
239
    hi.gitcommitDiscarded                 = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
240
    hi.gitcommitSelected                  = { guifg = M.colors.base03, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
241
    hi.gitcommitHeader                    = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
242
    hi.gitcommitSelectedType              = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
243
    hi.gitcommitUnmergedType              = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
244
    hi.gitcommitDiscardedType             = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
245
    hi.gitcommitBranch                    = { guifg = M.colors.base09, guibg = nil, gui = 'bold', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
246
    hi.gitcommitUntrackedFile             = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
247
    hi.gitcommitUnmergedFile              = { guifg = M.colors.base08, guibg = nil, gui = 'bold', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
248
    hi.gitcommitDiscardedFile             = { guifg = M.colors.base08, guibg = nil, gui = 'bold', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
249
    hi.gitcommitSelectedFile              = { guifg = M.colors.base0B, guibg = nil, gui = 'bold', guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
250
251
    -- GitGutter highlighting
252
    hi.GitGutterAdd                       = { guifg = M.colors.base0B, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = M.colors.cterm00 }
253
    hi.GitGutterChange                    = { guifg = M.colors.base0D, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = M.colors.cterm00 }
254
    hi.GitGutterDelete                    = { guifg = M.colors.base08, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm00 }
255
    hi.GitGutterChangeDelete              = { guifg = M.colors.base0E, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = M.colors.cterm00 }
256
257
    -- Spelling highlighting
258
    hi.SpellBad                           = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base08, ctermfg = nil, ctermbg = nil }
259
    hi.SpellLocal                         = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0C, ctermfg = nil, ctermbg = nil }
260
    hi.SpellCap                           = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0D, ctermfg = nil, ctermbg = nil }
261
    hi.SpellRare                          = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0E, ctermfg = nil, ctermbg = nil }
262
263
    hi.DiagnosticError                    = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
264
    hi.DiagnosticWarn                     = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
265
    hi.DiagnosticInfo                     = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
266
    hi.DiagnosticHint                     = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
267
    hi.DiagnosticUnderlineError           = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base08, ctermfg = nil, ctermbg = nil }
268
    hi.DiagnosticUnderlineWarning         = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0E, ctermfg = nil, ctermbg = nil }
269
    hi.DiagnosticUnderlineWarn            = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0E, ctermfg = nil, ctermbg = nil }
270
    hi.DiagnosticUnderlineInformation     = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0F, ctermfg = nil, ctermbg = nil }
271
    hi.DiagnosticUnderlineHint            = { guifg = nil, guibg = nil, gui = 'undercurl', guisp = M.colors.base0C, ctermfg = nil, ctermbg = nil }
272
273
    hi.LspReferenceText                   = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
274
    hi.LspReferenceRead                   = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
275
    hi.LspReferenceWrite                  = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
276
    hi.LspDiagnosticsDefaultError         = 'DiagnosticError'
277
    hi.LspDiagnosticsDefaultWarning       = 'DiagnosticWarn'
278
    hi.LspDiagnosticsDefaultInformation   = 'DiagnosticInfo'
279
    hi.LspDiagnosticsDefaultHint          = 'DiagnosticHint'
280
    hi.LspDiagnosticsUnderlineError       = 'DiagnosticUnderlineError'
281
    hi.LspDiagnosticsUnderlineWarning     = 'DiagnosticUnderlineWarning'
282
    hi.LspDiagnosticsUnderlineInformation = 'DiagnosticUnderlineInformation'
283
    hi.LspDiagnosticsUnderlineHint        = 'DiagnosticUnderlineHint'
284
285
    hi.TSAnnotation                       = { guifg = M.colors.base0F, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
286
    hi.TSAttribute                        = { guifg = M.colors.base0A, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
287
    hi.TSBoolean                          = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
288
    hi.TSCharacter                        = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
289
    hi.TSComment                          = { guifg = M.colors.base03, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
290
    hi.TSConstructor                      = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
291
    hi.TSConditional                      = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
292
    hi.TSConstant                         = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
293
    hi.TSConstBuiltin                     = { guifg = M.colors.base09, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
294
    hi.TSConstMacro                       = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
295
    hi.TSError                            = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
296
    hi.TSException                        = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
297
    hi.TSField                            = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
298
    hi.TSFloat                            = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
299
    hi.TSFunction                         = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
300
    hi.TSFuncBuiltin                      = { guifg = M.colors.base0D, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
301
    hi.TSFuncMacro                        = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
302
    hi.TSInclude                          = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
303
    hi.TSKeyword                          = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
304
    hi.TSKeywordFunction                  = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
305
    hi.TSKeywordOperator                  = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
306
    hi.TSLabel                            = { guifg = M.colors.base0A, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
307
    hi.TSMethod                           = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
308
    hi.TSNamespace                        = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
309
    hi.TSNone                             = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
310
    hi.TSNumber                           = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
311
    hi.TSOperator                         = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
312
    hi.TSParameter                        = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
313
    hi.TSParameterReference               = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
314
    hi.TSProperty                         = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
315
    hi.TSPunctDelimiter                   = { guifg = M.colors.base0F, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
316
    hi.TSPunctBracket                     = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
317
    hi.TSPunctSpecial                     = { guifg = M.colors.base0F, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
318
    hi.TSRepeat                           = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
319
    hi.TSString                           = { guifg = M.colors.base0B, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
320
    hi.TSStringRegex                      = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
321
    hi.TSStringEscape                     = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
322
    hi.TSSymbol                           = { guifg = M.colors.base0B, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0B, ctermbg = nil }
323
    hi.TSTag                              = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
324
    hi.TSTagDelimiter                     = { guifg = M.colors.base0F, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0F, ctermbg = nil }
325
    hi.TSText                             = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
326
    hi.TSStrong                           = { guifg = nil, guibg = nil, gui = 'bold', guisp = nil, ctermfg = nil, ctermbg = nil }
327
    hi.TSEmphasis                         = { guifg = M.colors.base09, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
328
    hi.TSUnderline                        = { guifg = M.colors.base00, guibg = nil, gui = 'underline', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = nil }
329
    hi.TSStrike                           = { guifg = M.colors.base00, guibg = nil, gui = 'strikethrough', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = nil }
330
    hi.TSTitle                            = { guifg = M.colors.base0D, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
331
    hi.TSLiteral                          = { guifg = M.colors.base09, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
332
    hi.TSURI                              = { guifg = M.colors.base09, guibg = nil, gui = 'underline', guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
333
    hi.TSType                             = { guifg = M.colors.base0A, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
334
    hi.TSTypeBuiltin                      = { guifg = M.colors.base0A, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
335
    hi.TSVariable                         = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
336
    hi.TSVariableBuiltin                  = { guifg = M.colors.base08, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
337
338
    hi.TSDefinition                       = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
339
    hi.TSDefinitionUsage                  = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
340
    hi.TSCurrentScope                     = { guifg = nil, guibg = nil, gui = 'bold', guisp = nil, ctermfg = nil, ctermbg = nil }
341
342
    hi.LspInlayHint                       = { guifg = M.colors.base03, guibg = nil, gui = 'italic', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
343
344
    if vim.fn.has('nvim-0.8.0') then
345
        hi['@comment']                  = 'TSComment'
346
        hi['@error']                    = 'TSError'
347
        hi['@none']                     = 'TSNone'
348
        hi['@preproc']                  = 'PreProc'
349
        hi['@define']                   = 'Define'
350
        hi['@operator']                 = 'TSOperator'
351
        hi['@punctuation.delimiter']    = 'TSPunctDelimiter'
352
        hi['@punctuation.bracket']      = 'TSPunctBracket'
353
        hi['@punctuation.special']      = 'TSPunctSpecial'
354
        hi['@string']                   = 'TSString'
355
        hi['@string.regex']             = 'TSStringRegex'
356
        hi['@string.escape']            = 'TSStringEscape'
357
        hi['@string.special']           = 'SpecialChar'
358
        hi['@character']                = 'TSCharacter'
359
        hi['@character.special']        = 'SpecialChar'
360
        hi['@boolean']                  = 'TSBoolean'
361
        hi['@number']                   = 'TSNumber'
362
        hi['@float']                    = 'TSFloat'
363
        hi['@function']                 = 'TSFunction'
364
        hi['@function.call']            = 'TSFunction'
365
        hi['@function.builtin']         = 'TSFuncBuiltin'
366
        hi['@function.macro']           = 'TSFuncMacro'
367
        hi['@method']                   = 'TSMethod'
368
        hi['@method.call']              = 'TSMethod'
369
        hi['@constructor']              = 'TSConstructor'
370
        hi['@parameter']                = 'TSParameter'
371
        hi['@keyword']                  = 'TSKeyword'
372
        hi['@keyword.function']         = 'TSKeywordFunction'
373
        hi['@keyword.operator']         = 'TSKeywordOperator'
374
        hi['@keyword.return']           = 'TSKeyword'
375
        hi['@conditional']              = 'TSConditional'
376
        hi['@repeat']                   = 'TSRepeat'
377
        hi['@debug']                    = 'Debug'
378
        hi['@label']                    = 'TSLabel'
379
        hi['@include']                  = 'TSInclude'
380
        hi['@exception']                = 'TSException'
381
        hi['@type']                     = 'TSType'
382
        hi['@type.builtin']             = 'TSTypeBuiltin'
383
        hi['@type.qualifier']           = 'TSKeyword'
384
        hi['@type.definition']          = 'TSType'
385
        hi['@storageclass']             = 'StorageClass'
386
        hi['@attribute']                = 'TSAttribute'
387
        hi['@field']                    = 'TSField'
388
        hi['@property']                 = 'TSProperty'
389
        hi['@variable']                 = 'TSVariable'
390
        hi['@variable.builtin']         = 'TSVariableBuiltin'
391
        hi['@constant']                 = 'TSConstant'
392
        hi['@constant.builtin']         = 'TSConstant'
393
        hi['@constant.macro']           = 'TSConstant'
394
        hi['@namespace']                = 'TSNamespace'
395
        hi['@symbol']                   = 'TSSymbol'
396
        hi['@text']                     = 'TSText'
397
        hi['@text.diff.add']            = 'DiffAdd'
398
        hi['@text.diff.delete']         = 'DiffDelete'
399
        hi['@text.strong']              = 'TSStrong'
400
        hi['@text.emphasis']            = 'TSEmphasis'
401
        hi['@text.underline']           = 'TSUnderline'
402
        hi['@text.strike']              = 'TSStrike'
403
        hi['@text.title']               = 'TSTitle'
404
        hi['@text.literal']             = 'TSLiteral'
405
        hi['@text.uri']                 = 'TSUri'
406
        hi['@text.math']                = 'Number'
407
        hi['@text.environment']         = 'Macro'
408
        hi['@text.environment.name']    = 'Type'
409
        hi['@text.reference']           = 'TSParameterReference'
410
        hi['@text.todo']                = 'Todo'
411
        hi['@text.note']                = 'Tag'
412
        hi['@text.warning']             = 'DiagnosticWarn'
413
        hi['@text.danger']              = 'DiagnosticError'
414
        hi['@tag']                      = 'TSTag'
415
        hi['@tag.attribute']            = 'TSAttribute'
416
        hi['@tag.delimiter']            = 'TSTagDelimiter'
417
418
        hi['@function.method']          = '@method'
419
        hi['@function.method.call']     = '@method.call'
420
        hi['@comment.error']            = '@text.danger'
421
        hi['@comment.warning']          = '@text.warning'
422
        hi['@comment.hint']             = 'DiagnosticHint'
423
        hi['@comment.info']             = 'DiagnosticInfo'
424
        hi['@comment.todo']             = '@text.todo'
425
        hi['@diff.plus']                = '@text.diff.add'
426
        hi['@diff.minus']               = '@text.diff.delete'
427
        hi['@diff.delta']               = 'DiffChange'
428
        hi['@string.special.url']       = '@text.uri'
429
        hi['@keyword.directive']        = '@preproc'
430
        hi['@keyword.directive.define'] = '@define'
431
        hi['@keyword.storage']          = '@storageclass'
432
        hi['@keyword.conditional']      = '@conditional'
433
        hi['@keyword.debug']            = '@debug'
434
        hi['@keyword.exception']        = '@exception'
435
        hi['@keyword.import']           = '@include'
436
        hi['@keyword.repeat']           = '@repeat'
437
        hi['@variable.parameter']       = '@parameter'
438
        hi['@variable.member']          = '@field'
439
        hi['@module']                   = '@namespace'
440
        hi['@number.float']             = '@float'
441
        hi['@string.special.symbol']    = '@symbol'
442
        hi['@string.regexp']            = '@string.regex'
443
        hi['@markup.strong']            = '@text.strong'
444
        hi['@markup.italic']            = 'Italic'
445
        hi['@markup.link']              = '@text.link'
446
        hi['@markup.strikethrough']     = '@text.strikethrough'
447
        hi['@markup.heading']           = '@text.title'
448
        hi['@markup.raw']               = '@text.literal'
449
        hi['@markup.link']              = '@text.reference'
450
        hi['@markup.link.url']          = '@text.uri'
451
        hi['@markup.link.label']        = '@string.special'
452
        hi['@markup.list']              = '@punctuation.special'
453
    end
454
455
    if M.config.ts_rainbow then
456
        hi.rainbowcol1 = { guifg = M.colors.base06, ctermfg = M.colors.cterm06 }
457
        hi.rainbowcol2 = { guifg = M.colors.base09, ctermfg = M.colors.cterm09  }
458
        hi.rainbowcol3 = { guifg = M.colors.base0A, ctermfg = M.colors.cterm0A }
459
        hi.rainbowcol4 = { guifg = M.colors.base07, ctermfg = M.colors.cterm07  }
460
        hi.rainbowcol5 = { guifg = M.colors.base0C, ctermfg = M.colors.cterm0C  }
461
        hi.rainbowcol6 = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D  }
462
        hi.rainbowcol7 = { guifg = M.colors.base0E, ctermfg = M.colors.cterm0E  }
463
    end
464
465
    hi.NvimInternalError = { guifg = M.colors.base00, guibg = M.colors.base08, gui = 'none', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm08 }
466
467
    hi.NormalFloat       = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
468
    hi.FloatBorder       = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
469
    hi.NormalNC          = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
470
    hi.TermCursor        = { guifg = M.colors.base00, guibg = M.colors.base05, gui = 'none', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm05 }
471
    hi.TermCursorNC      = { guifg = M.colors.base00, guibg = M.colors.base05, gui = nil, guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm05 }
472
473
    hi.User1             = { guifg = M.colors.base08, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = M.colors.cterm02 }
474
    hi.User2             = { guifg = M.colors.base0E, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = M.colors.cterm02 }
475
    hi.User3             = { guifg = M.colors.base05, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm02 }
476
    hi.User4             = { guifg = M.colors.base0C, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = M.colors.cterm02 }
477
    hi.User5             = { guifg = M.colors.base05, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm02 }
478
    hi.User6             = { guifg = M.colors.base05, guibg = M.colors.base01, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm01 }
479
    hi.User7             = { guifg = M.colors.base05, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm02 }
480
    hi.User8             = { guifg = M.colors.base00, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm02 }
481
    hi.User9             = { guifg = M.colors.base00, guibg = M.colors.base02, gui = 'none', guisp = nil, ctermfg = M.colors.cterm00, ctermbg = M.colors.cterm02 }
482
483
    hi.TreesitterContext = { guifg = nil, guibg = M.colors.base01, gui = 'italic', guisp = nil, ctermfg = nil, ctermbg = M.colors.cterm01 }
484
485
    if M.config.telescope then
486
        if not M.config.telescope_borders and hex_re:match_str(M.colors.base00) and hex_re:match_str(M.colors.base01) and
487
            hex_re:match_str(M.colors.base02) then
488
            local darkerbg           = darken(M.colors.base00, 0.1)
489
            local darkercursorline   = darken(M.colors.base01, 0.1)
490
            local darkerstatusline   = darken(M.colors.base02, 0.1)
491
            hi.TelescopeBorder       = { guifg = darkerbg, guibg = darkerbg, gui = nil, guisp = nil }
492
            hi.TelescopePromptBorder = { guifg = darkerstatusline, guibg = darkerstatusline, gui = nil, guisp = nil }
493
            hi.TelescopePromptNormal = { guifg = M.colors.base05, guibg = darkerstatusline, gui = nil, guisp = nil }
494
            hi.TelescopePromptPrefix = { guifg = M.colors.base08, guibg = darkerstatusline, gui = nil, guisp = nil }
495
            hi.TelescopeNormal       = { guifg = nil, guibg = darkerbg, gui = nil, guisp = nil }
496
            hi.TelescopePreviewTitle = { guifg = darkercursorline, guibg = M.colors.base0B, gui = nil, guisp = nil }
497
            hi.TelescopePromptTitle  = { guifg = darkercursorline, guibg = M.colors.base08, gui = nil, guisp = nil }
498
            hi.TelescopeResultsTitle = { guifg = darkerbg, guibg = darkerbg, gui = nil, guisp = nil }
499
            hi.TelescopeSelection    = { guifg = nil, guibg = darkerstatusline, gui = nil, guisp = nil }
500
            hi.TelescopePreviewLine  = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil }
501
        else
502
            hi.TelescopeBorder       = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
503
            hi.TelescopePromptBorder = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
504
            hi.TelescopePromptNormal = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
505
            hi.TelescopePromptPrefix = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
506
            hi.TelescopeNormal       = { guifg = nil, guibg = M.colors.base00, gui = nil, guisp = nil }
507
            hi.TelescopePreviewTitle = { guifg = M.colors.base01, guibg = M.colors.base0B, gui = nil, guisp = nil }
508
            hi.TelescopePromptTitle  = { guifg = M.colors.base01, guibg = M.colors.base08, gui = nil, guisp = nil }
509
            hi.TelescopeResultsTitle = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil }
510
            hi.TelescopeSelection    = { guifg = nil, guibg = M.colors.base01, gui = nil, guisp = nil }
511
            hi.TelescopePreviewLine  = { guifg = nil, guibg = M.colors.base01, gui = 'none', guisp = nil }
512
        end
513
    end
514
515
    if M.config.notify then
516
        hi.NotifyERRORBorder = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
517
        hi.NotifyWARNBorder  = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
518
        hi.NotifyINFOBorder  = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
519
        hi.NotifyDEBUGBorder = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
520
        hi.NotifyTRACEBorder = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
521
        hi.NotifyERRORIcon   = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
522
        hi.NotifyWARNIcon    = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
523
        hi.NotifyINFOIcon    = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
524
        hi.NotifyDEBUGIcon   = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
525
        hi.NotifyTRACEIcon   = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
526
        hi.NotifyERRORTitle  = { guifg = M.colors.base08, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
527
        hi.NotifyWARNTitle   = { guifg = M.colors.base0E, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
528
        hi.NotifyINFOTitle   = { guifg = M.colors.base05, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
529
        hi.NotifyDEBUGTitle  = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
530
        hi.NotifyTRACETitle  = { guifg = M.colors.base0C, guibg = nil, gui = 'none', guisp = nil, ctermfg = M.colors.cterm0C, ctermbg = nil }
531
        hi.NotifyERRORBody   = 'Normal'
532
        hi.NotifyWARNBody    = 'Normal'
533
        hi.NotifyINFOBody    = 'Normal'
534
        hi.NotifyDEBUGBody   = 'Normal'
535
        hi.NotifyTRACEBody   = 'Normal'
536
    end
537
538
    if M.config.indentblankline then
539
        hi.IndentBlanklineChar        = { guifg = M.colors.base02, gui = 'nocombine', ctermfg = M.colors.cterm02 }
540
        hi.IndentBlanklineContextChar = { guifg = M.colors.base04, gui = 'nocombine', ctermfg = M.colors.cterm04  }
541
        hi.IblIndent                  = { guifg = M.colors.base02, gui = 'nocombine', ctermfg = M.colors.cterm02  }
542
        hi.IblWhitespace              = 'Whitespace'
543
        hi.IblScope                   = { guifg = M.colors.base04, gui = 'nocombine', ctermfg = M.colors.cterm04  }
544
    end
545
546
    if M.config.cmp then
547
        hi.CmpDocumentationBorder   = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
548
        hi.CmpDocumentation         = { guifg = M.colors.base05, guibg = M.colors.base00, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm00 }
549
        hi.CmpItemAbbr              = { guifg = M.colors.base05, guibg = M.colors.base01, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = M.colors.cterm01 }
550
        hi.CmpItemAbbrDeprecated    = { guifg = M.colors.base03, guibg = nil, gui = 'strikethrough', guisp = nil, ctermfg = M.colors.cterm03, ctermbg = nil }
551
        hi.CmpItemAbbrMatch         = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
552
        hi.CmpItemAbbrMatchFuzzy    = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
553
        hi.CmpItemKindDefault       = { guifg = M.colors.base05, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
554
        hi.CmpItemMenu              = { guifg = M.colors.base04, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = nil }
555
        hi.CmpItemKindKeyword       = { guifg = M.colors.base0E, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0E, ctermbg = nil }
556
        hi.CmpItemKindVariable      = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
557
        hi.CmpItemKindConstant      = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
558
        hi.CmpItemKindReference     = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
559
        hi.CmpItemKindValue         = { guifg = M.colors.base09, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm09, ctermbg = nil }
560
        hi.CmpItemKindFunction      = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
561
        hi.CmpItemKindMethod        = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
562
        hi.CmpItemKindConstructor   = { guifg = M.colors.base0D, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0D, ctermbg = nil }
563
        hi.CmpItemKindClass         = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
564
        hi.CmpItemKindInterface     = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
565
        hi.CmpItemKindStruct        = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
566
        hi.CmpItemKindEvent         = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
567
        hi.CmpItemKindEnum          = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
568
        hi.CmpItemKindUnit          = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
569
        hi.CmpItemKindModule        = { guifg = M.colors.base05, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
570
        hi.CmpItemKindProperty      = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
571
        hi.CmpItemKindField         = { guifg = M.colors.base08, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm08, ctermbg = nil }
572
        hi.CmpItemKindTypeParameter = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
573
        hi.CmpItemKindEnumMember    = { guifg = M.colors.base0A, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm0A, ctermbg = nil }
574
        hi.CmpItemKindOperator      = { guifg = M.colors.base05, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm05, ctermbg = nil }
575
        hi.CmpItemKindSnippet       = { guifg = M.colors.base04, guibg = nil, gui = nil, guisp = nil, ctermfg = M.colors.cterm04, ctermbg = nil }
576
    end
577
578
    if M.config.illuminate then
579
        hi.IlluminatedWordText  = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
580
        hi.IlluminatedWordRead  = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
581
        hi.IlluminatedWordWrite = { guifg = nil, guibg = nil, gui = 'underline', guisp = M.colors.base04, ctermfg = nil, ctermbg = nil }
582
    end
583
584
    if M.config.lsp_semantic then
585
        hi['@class'] = 'TSType'
586
        hi['@struct'] = 'TSType'
587
        hi['@enum'] = 'TSType'
588
        hi['@enumMember'] = 'Constant'
589
        hi['@event'] = 'Identifier'
590
        hi['@interface'] = 'Structure'
591
        hi['@modifier'] = 'Identifier'
592
        hi['@regexp'] = 'TSStringRegex'
593
        hi['@typeParameter'] = 'Type'
594
        hi['@decorator'] = 'Identifier'
595
596
        hi['@lsp.type.namespace'] = '@namespace'
597
        hi['@lsp.type.type'] = '@type'
598
        hi['@lsp.type.class'] = '@type'
599
        hi['@lsp.type.enum'] = '@type'
600
        hi['@lsp.type.interface'] = '@type'
601
        hi['@lsp.type.struct'] = '@type'
602
        hi['@lsp.type.parameter'] = '@parameter'
603
        hi['@lsp.type.variable'] = '@variable'
604
        hi['@lsp.type.property'] = '@property'
605
        hi['@lsp.type.enumMember'] = '@constant'
606
        hi['@lsp.type.function'] = '@function'
607
        hi['@lsp.type.method'] = '@method'
608
        hi['@lsp.type.macro'] = '@function.macro'
609
        hi['@lsp.type.decorator'] = '@function'
610
    end
611
612
    if M.config.mini_completion then
613
        hi.MiniCompletionActiveParameter = 'CursorLine'
614
    end
615
616
    if M.config.dapui then
617
        hi.DapUINormal = 'Normal'
618
        hi.DapUINormal    = "Normal"
619
        hi.DapUIVariable  = "Normal"
620
        hi.DapUIScope     = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
621
        hi.DapUIType      = { guifg = M.colors.base0E, ctermfg = M.colors.cterm0E }
622
        hi.DapUIValue     = "Normal"
623
        hi.DapUIModifiedValue = { gui = "bold", guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
624
        hi.DapUIDecoration = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
625
        hi.DapUIThread    = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
626
        hi.DapUIStoppedThread = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
627
        hi.DapUIFrameName = "Normal"
628
        hi.DapUISource    = { guifg = M.colors.base0E, ctermfg = M.colors.cterm0E }
629
        hi.DapUILineNumber = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
630
        hi.DapUIFloatNormal = "NormalFloat"
631
        hi.DapUIFloatBorder = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
632
        hi.DapUIWatchesEmpty = { guifg = M.colors.base08, ctermfg = M.colors.cterm08 }
633
        hi.DapUIWatchesValue = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
634
        hi.DapUIWatchesError = { guifg = M.colors.base08, ctermfg = M.colors.cterm08 }
635
        hi.DapUIBreakpointsPath = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
636
        hi.DapUIBreakpointsInfo = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
637
        hi.DapUIBreakpointsCurrentLine = { gui = "bold", guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
638
        hi.DapUIBreakpointsLine = "DapUILineNumber"
639
        hi.DapUIBreakpointsDisabledLine = { guifg = M.colors.base02, ctermfg = M.colors.cterm02 }
640
        hi.DapUICurrentFrameName = "DapUIBreakpointsCurrentLine"
641
        hi.DapUIStepOver  = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
642
        hi.DapUIStepInto  = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
643
        hi.DapUIStepBack  = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
644
        hi.DapUIStepOut   = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
645
        hi.DapUIStop      = { guifg = M.colors.base08, ctermfg = M.colors.cterm08 }
646
        hi.DapUIPlayPause = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
647
        hi.DapUIRestart   = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
648
        hi.DapUIUnavailable = { guifg = M.colors.base02, ctermfg = M.colors.cterm02 }
649
        hi.DapUIWinSelect = { gui = "bold", guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
650
        hi.DapUIEndofBuffer = "EndOfBuffer"
651
        hi.DapUINormalNC  = "Normal"
652
        hi.DapUIPlayPauseNC = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
653
        hi.DapUIRestartNC = { guifg = M.colors.base0B, ctermfg = M.colors.cterm0B }
654
        hi.DapUIStopNC    = { guifg = M.colors.base08, ctermfg = M.colors.cterm08 }
655
        hi.DapUIUnavailableNC = { guifg = M.colors.base02, ctermfg = M.colors.cterm02 }
656
        hi.DapUIStepOverNC = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
657
        hi.DapUIStepIntoNC = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
658
        hi.DapUIStepBackNC = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
659
        hi.DapUIStepOutNC = { guifg = M.colors.base0D, ctermfg = M.colors.cterm0D }
660
    end
661
662
663
    vim.g.terminal_color_0  = M.colors.base00
664
    vim.g.terminal_color_1  = M.colors.base08
665
    vim.g.terminal_color_2  = M.colors.base0B
666
    vim.g.terminal_color_3  = M.colors.base0A
667
    vim.g.terminal_color_4  = M.colors.base0D
668
    vim.g.terminal_color_5  = M.colors.base0E
669
    vim.g.terminal_color_6  = M.colors.base0C
670
    vim.g.terminal_color_7  = M.colors.base05
671
    vim.g.terminal_color_8  = M.colors.base03
672
    vim.g.terminal_color_9  = M.colors.base08
673
    vim.g.terminal_color_10 = M.colors.base0B
674
    vim.g.terminal_color_11 = M.colors.base0A
675
    vim.g.terminal_color_12 = M.colors.base0D
676
    vim.g.terminal_color_13 = M.colors.base0E
677
    vim.g.terminal_color_14 = M.colors.base0C
678
    vim.g.terminal_color_15 = M.colors.base07
679
680
    vim.g.base16_gui00      = M.colors.base00
681
    vim.g.base16_gui01      = M.colors.base01
682
    vim.g.base16_gui02      = M.colors.base02
683
    vim.g.base16_gui03      = M.colors.base03
684
    vim.g.base16_gui04      = M.colors.base04
685
    vim.g.base16_gui05      = M.colors.base05
686
    vim.g.base16_gui06      = M.colors.base06
687
    vim.g.base16_gui07      = M.colors.base07
688
    vim.g.base16_gui08      = M.colors.base08
689
    vim.g.base16_gui09      = M.colors.base09
690
    vim.g.base16_gui0A      = M.colors.base0A
691
    vim.g.base16_gui0B      = M.colors.base0B
692
    vim.g.base16_gui0C      = M.colors.base0C
693
    vim.g.base16_gui0D      = M.colors.base0D
694
    vim.g.base16_gui0E      = M.colors.base0E
695
    vim.g.base16_gui0F      = M.colors.base0F
696
end
697
698
function M.available_colorschemes()
699
    return vim.tbl_keys(M.colorschemes)
700
end
701
702
M.colorschemes = {}
703
setmetatable(M.colorschemes, {
704
    __index = function(t, key)
705
        t[key] = require(string.format('colors.%s', key))
706
        return t[key]
707
    end,
708
})
709
710
-- #16161D is called eigengrau and is kinda-ish the color your see when you
711
-- close your eyes. It makes for a really good background.
712
M.colorschemes['schemer-dark'] = {
713
    base00 = '#16161D',
714
    base01 = '#3e4451',
715
    base02 = '#2c313c',
716
    base03 = '#565c64',
717
    base04 = '#6c7891',
718
    base05 = '#abb2bf',
719
    base06 = '#9a9bb3',
720
    base07 = '#c5c8e6',
721
    base08 = '#e06c75',
722
    base09 = '#d19a66',
723
    base0A = '#e5c07b',
724
    base0B = '#98c379',
725
    base0C = '#56b6c2',
726
    base0D = '#0184bc',
727
    base0E = '#c678dd',
728
    base0F = '#a06949',
729
}
730
M.colorschemes['schemer-medium'] = {
731
    base00 = '#212226',
732
    base01 = '#3e4451',
733
    base02 = '#2c313c',
734
    base03 = '#565c64',
735
    base04 = '#6c7891',
736
    base05 = '#abb2bf',
737
    base06 = '#9a9bb3',
738
    base07 = '#c5c8e6',
739
    base08 = '#e06c75',
740
    base09 = '#d19a66',
741
    base0A = '#e5c07b',
742
    base0B = '#98c379',
743
    base0C = '#56b6c2',
744
    base0D = '#0184bc',
745
    base0E = '#c678dd',
746
    base0F = '#a06949',
747
}
748
749
M.load_from_shell = function()
750
    -- tinted-theming/base16-shell uses XDG_CONFIG_PATH if present.
751
    local config_dir = vim.env.XDG_CONFIG_HOME
752
    if config_dir == nil or config_dir == '' then
753
        config_dir = '~/.config'
754
    end
755
756
    local shell_theme_paths = {
757
        -- tinted-theming/base16-shell writes this file
758
        config_dir .. "/tinted-theming/set_theme.lua",
759
        -- chriskempson/base16-shell writes this file
760
        "~/.vimrc_background",
761
    }
762
763
    for _, path in pairs(shell_theme_paths) do
764
        local is_readable = vim.fn.filereadable(vim.fn.expand(path)) == 1
765
        if is_readable then
766
            vim.cmd([[let base16colorspace=256]])
767
            vim.cmd("source " .. path)
768
            return path
769
        end
770
    end
771
    return false
772
end
773
774
return M