Files
tokyodark/lua/tokyodark/highlights.lua

265 lines
9.4 KiB
Lua

local p = require('tokyodark.palette')
local cfg = require('tokyodark.config')
local u = require('tokyodark.utils')
local M = {}
local hl = {langs = {}, plugins = {}}
local highlight = vim.api.nvim_set_hl
local set_hl_ns = vim.api.nvim__set_hl_ns or vim.api.nvim_set_hl_ns
local ns = vim.api.nvim_create_namespace("tokyodark")
local function load_highlights(highlights)
for group_name, group_settings in pairs(highlights) do
highlight(ns, group_name, group_settings)
end
end
hl.predef = {
Fg = {fg = p.fg},
Grey = {fg = p.grey},
Red = {fg = p.red},
Orange = {fg = p.orange},
Yellow = {fg = p.yellow},
Green = {fg = p.green},
Blue = {fg = p.blue},
Purple = {fg = p.purple},
BlueItalic = {fg = p.blue, italic = cfg.italic},
RedItalic = {fg = p.red, italic = cfg.italic},
GreenItalic = {fg = p.green, italic = cfg.italic},
OrangeItalic = {fg = p.orange, italic = cfg.italic}
}
hl.common = {
Normal = {fg = p.fg, bg = cfg.bg and p.none or p.bg0},
Terminal = {fg = p.fg, bg = cfg.bg and p.none or p.bg0},
EndOfBuffer = {fg = p.bg2, bg = cfg.bg and p.none or p.bg0},
FoldColumn = {fg = p.fg, bg = cfg.bg and p.none or p.bg1},
Folded = {fg = p.fg, bg = cfg.bg and p.none or p.bg1},
SignColumn = {fg = p.fg, bg = cfg.bg and p.none or p.bg0},
ToolbarLine = {fg = p.fg},
Cursor = {reverse = true},
vCursor = {reverse = true},
iCursor = {reverse = true},
lCursor = {reverse = true},
CursorIM = {reverse = true},
CursorColumn = {bg = p.bg1},
CursorLine = {bg = p.bg1},
ColorColumn = {bg = p.bg1},
CursorLineNr = {fg = p.fg},
LineNr = {fg = p.bg4},
Conceal = {fg = p.grey, bg = p.bg1},
DiffAdd = {fg = p.none, bg = p.diff_add},
DiffChange = {fg = p.none, bg = p.diff_change},
DiffDelete = {fg = p.none, bg = p.diff_delete},
DiffText = {fg = p.none, reverse = true},
Directory = {fg = p.green},
ErrorMsg = {fg = p.red, bold = true, underline = true},
WarningMsg = {fg = p.yellow, bold = true},
MoreMsg = {fg = p.blue, bold = true},
IncSearch = {fg = p.bg0, bg = p.bg_red},
Search = {fg = p.bg0, bg = p.bg_green},
MatchParen = {fg = p.none, bg = p.bg4},
NonText = {fg = p.bg4},
Whitespace = {fg = p.bg4},
SpecialKey = {fg = p.bg4},
Pmenu = {fg = p.fg, bg = p.bg2},
PmenuSbar = {fg = p.none, bg = p.bg2},
PmenuSel = {fg = p.bg0, bg = p.bg_green},
WildMenu = {fg = p.bg0, bg = p.blue},
PmenuThumb = {fg = p.none, bg = p.grey},
Question = {fg = p.yellow},
SpellBad = {fg = p.red, underline = true, sp = p.red},
SpellCap = {fg = p.yellow, underline = true, sp = p.yellow},
SpellLocal = {fg = p.blue, underline = true, sp = p.blue},
SpellRare = {fg = p.purple, underline = true, sp = p.purple},
StatusLine = {fg = p.fg, bg = p.bg2},
StatusLineTerm = {fg = p.fg, bg = p.bg2},
StatusLineNC = {fg = p.grey, bg = p.bg1},
StatusLineTermNC = {fg = p.grey, bg = p.bg1},
TabLine = {fg = p.fg, bg = p.bg4},
TabLineFill = {fg = p.grey, bg = p.bg1},
TabLineSel = {fg = p.bg0, bg = p.bg_red},
VertSplit = {fg = p.bg5},
Visual = {bg = p.bg1},
VisualNOS = {fg = p.none, bg = p.bg2, underline = true},
QuickFixLine = {fg = p.blue, underline = true},
Debug = {fg = p.yellow},
debugPC = {fg = p.bg0, bg = p.green},
debugBreakpoint = {fg = p.bg0, bg = p.red},
ToolbarButton = {fg = p.bg0, bg = p.bg_blue}
}
hl.syntax = {
Type = hl.predef.BlueItalic,
Structure = hl.predef.BlueItalic,
StorageClass = hl.predef.BlueItalic,
Identifier = hl.predef.OrangeItalic,
Constant = hl.predef.OrangeItalic,
PreProc = hl.predef.Red,
PreCondit = hl.predef.Red,
Include = hl.predef.Red,
Keyword = hl.predef.Red,
Define = hl.predef.Red,
Typedef = hl.predef.Red,
Exception = hl.predef.Red,
Conditional = hl.predef.Red,
Repeat = hl.predef.Red,
Statement = hl.predef.Red,
Macro = hl.predef.Purple,
Error = hl.predef.Red,
Label = hl.predef.Purple,
Special = hl.predef.Purple,
SpecialChar = hl.predef.Purple,
Boolean = hl.predef.Purple,
String = hl.predef.Yellow,
Character = hl.predef.Yellow,
Number = hl.predef.Purple,
Float = hl.predef.Purple,
Function = hl.predef.Green,
Operator = hl.predef.Red,
Title = hl.predef.Yellow,
Tag = hl.predef.Orange,
Delimiter = hl.predef.Fg,
Comment = {fg = p.bg4, italic = cfg.italic_comment},
SpecialComment = {fg = p.bg4, italic = cfg.italic_comment},
Todo = {fg = p.blue, italic = cfg.italic_comment}
}
hl.plugins.lsp = {
LspCxxHlGroupEnumConstant = hl.predef.Orange,
LspCxxHlGroupMemberVariable = hl.predef.Orange,
LspCxxHlGroupNamespace = hl.predef.Blue,
LspCxxHlSkippedRegion = hl.predef.Grey,
LspCxxHlSkippedRegionBeginEnd = hl.predef.Red,
LspDiagnosticsDefaultError = {fg = u.color_gamma(p.red, 0.5)},
LspDiagnosticsDefaultHint = {fg = u.color_gamma(p.purple, 0.5)},
LspDiagnosticsDefaultInformation = {fg = u.color_gamma(p.blue, 0.5)},
LspDiagnosticsDefaultWarning = {fg = u.color_gamma(p.yellow, 0.5)},
LspDiagnosticsUnderlineError = {underline = true, sp = u.color_gamma(p.red, 0.5)},
LspDiagnosticsUnderlineHint = {underline = true, sp = u.color_gamma(p.purple, 0.5)},
LspDiagnosticsUnderlineInformation = {underline = true, sp = u.color_gamma(p.blue, 0.5)},
LspDiagnosticsUnderlineWarning = {underline = true, sp = u.color_gamma(p.yellow, 0.5)}
}
hl.plugins.whichkey = {
WhichKey = hl.predef.Red,
WhichKeyDesc = hl.predef.Blue,
WhichKeyGroup = hl.predef.Orange,
WhichKeySeperator = hl.predef.Green
}
hl.plugins.gitgutter = {
GitGutterAdd = {fg = p.diff_green},
GitGutterChange = {fg = p.diff_blue},
GitGutterDelete = {fg = p.diff_red}
}
hl.plugins.diffview = {
DiffviewFilePanelTitle = {fg = p.blue, bold = true},
DiffviewFilePanelCounter = {fg = p.purple, bold = true},
DiffviewFilePanelFileName = hl.predef.Fg,
DiffviewNormal = hl.common.Normal,
DiffviewCursorLine = hl.common.CursorLine,
DiffviewVertSplit = hl.common.VertSplit,
DiffviewSignColumn = hl.common.SignColumn,
DiffviewStatusLine = hl.common.StatusLine,
DiffviewStatusLineNC = hl.common.StatusLineNC,
DiffviewEndOfBuffer = hl.common.EndOfBuffer,
DiffviewFilePanelRootPath = hl.predef.Grey,
DiffviewFilePanelPath = hl.predef.Grey,
DiffviewFilePanelInsertions = hl.predef.Green,
DiffviewFilePanelDeletions = hl.predef.Red,
DiffviewStatusAdded = hl.predef.Green,
DiffviewStatusUntracked = hl.predef.Blue,
DiffviewStatusModified = hl.predef.Blue,
DiffviewStatusRenamed = hl.predef.Blue,
DiffviewStatusCopied = hl.predef.Blue,
DiffviewStatusTypeChange = hl.predef.Blue,
DiffviewStatusUnmerged = hl.predef.Blue,
DiffviewStatusUnknown = hl.predef.Red,
DiffviewStatusDeleted = hl.predef.Red,
DiffviewStatusBroken = hl.predef.Red
}
hl.plugins.gitsigns = {
GitSignsAdd = hl.predef.Green,
GitSignsAddLn = hl.predef.Green,
GitSignsAddNr = hl.predef.Green,
GitSignsChange = hl.predef.Blue,
GitSignsChangeLn = hl.predef.Blue,
GitSignsChangeNr = hl.predef.Blue,
GitSignsDelete = hl.predef.Red,
GitSignsDeleteLn = hl.predef.Red,
GitSignsDeleteNr = hl.predef.Red
}
hl.langs.markdown = {
markdownBlockquote = hl.predef.Grey,
markdownBold = {fg = p.none, bold = true},
markdownBoldDelimiter = hl.predef.Grey,
markdownCode = hl.predef.Yellow,
markdownCodeBlock = hl.predef.Yellow,
markdownCodeDelimiter = hl.predef.Green,
markdownH1 = {fg = p.red, bold = true},
markdownH2 = {fg = p.red, bold = true},
markdownH3 = {fg = p.red, bold = true},
markdownH4 = {fg = p.red, bold = true},
markdownH5 = {fg = p.red, bold = true},
markdownH6 = {fg = p.red, bold = true},
markdownHeadingDelimiter = hl.predef.Grey,
markdownHeadingRule = hl.predef.Grey,
markdownId = hl.predef.Yellow,
markdownIdDeclaration = hl.predef.Red,
markdownItalic = {fg = p.none, italic = true},
markdownItalicDelimiter = {fg = p.grey, italic = true},
markdownLinkDelimiter = hl.predef.Grey,
markdownLinkText = hl.predef.Red,
markdownLinkTextDelimiter = hl.predef.Grey,
markdownListMarker = hl.predef.Red,
markdownOrderedListMarker = hl.predef.Red,
markdownRule = hl.predef.Purple,
markdownUrl = {fg = p.blue, underline = true},
markdownUrlDelimiter = hl.predef.Grey,
markdownUrlTitleDelimiter = hl.predef.Green
}
hl.langs.scala = {
scalaNameDefinition = hl.predef.Fg,
scalaInterpolationBoundary = hl.predef.Purple,
scalaInterpolation = hl.predef.Purple,
scalaTypeOperator = hl.predef.Red,
scalaOperator = hl.predef.Red,
scalaKeywordModifier = hl.predef.Red
}
function M.clear_namespace()
vim.api.nvim_buf_clear_namespace(0, ns, 0, -1)
set_hl_ns(0)
end
local function load_sync()
load_highlights(hl.predef)
load_highlights(hl.common)
load_highlights(hl.syntax)
for _, group in pairs(hl.langs) do load_highlights(group) end
for _, group in pairs(hl.plugins) do load_highlights(group) end
set_hl_ns(ns)
end
local load_async
load_async = vim.loop.new_async(vim.schedule_wrap(function()
for _, group in pairs(hl.langs) do load_highlights(group) end
for _, group in pairs(hl.plugins) do load_highlights(group) end
set_hl_ns(ns)
load_async:close()
end))
function M.setup()
load_sync()
-- load_async:send() TODO: find why it does not work with v0.5 anymore
end
return M