local config = require('skift.config') local cache = require("skift.utils.cache") local M = {} local function apply_highlights(highlights) for name, val in pairs(highlights) do if type(val) == 'string' then val = { link = val } end vim.api.nvim_set_hl(0, name, val) end end local function apply_terminal_colors(c) vim.g.terminal_color_0 = c.terminal_black vim.g.terminal_color_1 = c.terminal_red vim.g.terminal_color_2 = c.terminal_green vim.g.terminal_color_3 = c.terminal_yellow vim.g.terminal_color_4 = c.terminal_blue vim.g.terminal_color_5 = c.terminal_magenta vim.g.terminal_color_6 = c.terminal_cyan vim.g.terminal_color_7 = c.terminal_white vim.g.terminal_color_8 = c.terminal_bright_black vim.g.terminal_color_9 = c.terminal_bright_red vim.g.terminal_color_10 = c.terminal_bright_green vim.g.terminal_color_11 = c.terminal_bright_yellow vim.g.terminal_color_12 = c.terminal_bright_blue vim.g.terminal_color_13 = c.terminal_bright_magenta vim.g.terminal_color_14 = c.terminal_bright_cyan vim.g.terminal_color_15 = c.terminal_bright_white end function M.setup(opts) config:merge(opts) end function M.load() if vim.g.colors_name then vim.cmd("hi clear") end vim.g.colors_name = "skift" vim.o.termguicolors = true vim.o.background = "dark" local cache_key = cache.key(config) local cached = cache.read(cache_key) if cached and cached.highlights and cached.colors then apply_highlights(cached.highlights) apply_terminal_colors(cached.colors) return end local c = vim.deepcopy(require("skift.colors")) config.on_colors(c) local highlights = {} local groups = { require("skift.groups.editor").get(c), require("skift.groups.syntax").get(c), require("skift.groups.treesitter").get(c), require("skift.groups.lsp").get(c), require("skift.groups.integrations").get(c), } for _, group in ipairs(groups) do highlights = vim.tbl_extend("force", highlights, group) end if config.transparent then local transparent_groups = { "Normal", "NormalNC", "NormalFloat", "SignColumn", "FoldColumn", "TabLineFill", "StatusLine", "StatusLineNC", "NvimTreeNormal", "NeoTreeNormal", "NeoTreeNormalNC", "TreesitterContext", } for _, name in ipairs(transparent_groups) do if highlights[name] then highlights[name].bg = "NONE" end end highlights.WinSeparator = { fg = "NONE" } highlights.VertSplit = { fg = "NONE" } highlights.FloatBorder = { fg = "NONE", bg = "NONE" } end if not config.bold then for _, hl in pairs(highlights) do hl.bold = false end end if not config.italic then for _, hl in pairs(highlights) do hl.italic = false end elseif not config.italic_comments then for _, name in ipairs({ "Comment", "@comment", "@comment.documentation" }) do if highlights[name] then highlights[name].italic = false end end end config.on_highlights(highlights, c) apply_highlights(highlights) apply_terminal_colors(c) cache.write(cache_key, { highlights = highlights, colors = { terminal_black = c.terminal_black, terminal_red = c.terminal_red, terminal_green = c.terminal_green, terminal_yellow = c.terminal_yellow, terminal_blue = c.terminal_blue, terminal_magenta = c.terminal_magenta, terminal_cyan = c.terminal_cyan, terminal_white = c.terminal_white, terminal_bright_black = c.terminal_bright_black, terminal_bright_red = c.terminal_bright_red, terminal_bright_green = c.terminal_bright_green, terminal_bright_yellow = c.terminal_bright_yellow, terminal_bright_blue = c.terminal_bright_blue, terminal_bright_magenta = c.terminal_bright_magenta, terminal_bright_cyan = c.terminal_bright_cyan, terminal_bright_white = c.terminal_bright_white, }, }) end function M.clear_cache() cache.clear() end return M