Dotfiles/vim/theme/cyberqueer.nvim/.lazy.lua

135 lines
4.3 KiB
Lua

-- Ported from TokyoNight's "Dev Mode" feature
-- Shows colors and highlights while editing the theme, hot-reloads on save.
-- All credits to the original author: @folke 💚
-- https://github.com/folke/tokyonight.nvim
--# selene: allow(global_usage)
local colors
local cache = {}
local hl_groups = {}
local function resolve(groups)
for _, hl in pairs(groups) do
if type(hl.style) == "table" then
for k, v in pairs(hl.style) do
hl[k] = v
end
hl.style = nil
end
end
return groups
end
local function get_hl_group(hl)
local group = "CyberdreamDev" .. vim.inspect(hl):gsub("%W+", "_")
if not hl_groups[group] then
hl = type(hl) == "string" and { link = hl } or hl
hl = vim.deepcopy(hl, true)
resolve({ foo = hl })
hl.fg = hl.fg or colors.fg
vim.api.nvim_set_hl(0, group, hl)
hl_groups[group] = true
end
return group
end
local function get_group(buf)
local fname = vim.api.nvim_buf_get_name(buf or 0)
fname = vim.fs.normalize(fname)
if not fname:find("lua/cyberdream/extensions/") then
return
end
return vim.fn.fnamemodify(fname, ":t:r")
end
local function load(group)
if cache[group] then
return
end
cache[group] = {}
local opts
colors = require("cyberdream.colors").default
colors.bg_solid = colors.bg ~= "NONE" and colors.bg or colors.bgAlt
opts = require("cyberdream.config").options
local highlights = require("cyberdream.extensions." .. group).get(opts, colors)
for k, v in pairs(highlights) do
cache[group][k] = get_hl_group(v)
end
end
vim.api.nvim_create_autocmd("BufWritePost", {
group = vim.api.nvim_create_augroup("cyberdream_dev", { clear = true }),
pattern = "*/lua/cyberdream/**.lua",
callback = vim.schedule_wrap(function(ev)
local opts = require("cyberdream.config").options
for k in pairs(package.loaded) do
if k:find("^cyberdream") then
package.loaded[k] = nil
end
end
require("cyberdream").setup(opts)
vim.cmd.colorscheme(vim.g.colors_name)
hl_groups = {}
local hi = require("mini.hipatterns")
local group = get_group(ev.buf)
if group then
cache[group] = nil
end
for _, buf in ipairs(hi.get_enabled_buffers()) do
hi.update(buf)
end
end),
})
return {
{
"echasnovski/mini.hipatterns",
opts = function(_, opts)
opts.highlighters = opts.highlighters or {}
opts.highlighters.cyberdream = {
pattern = function(buf)
local group = get_group(buf)
if not group or group == "init" then
return
end
load(group)
return group and '^%s*%[?"?()[%w%.@]+()"?%]?%s*='
end,
group = function(buf, match, _)
local name = get_group(buf)
if name == "kinds" then
match = "LspKind" .. match
end
return name and cache[name][match]
end,
extmark_opts = { priority = 2000 },
}
opts.highlighters.cyberdream_colors = {
pattern = {
"%f[%w]()t%.[%w_%.]+()%f[%W]",
},
group = function(_, match)
local parts = vim.split(match, ".", { plain = true })
local t = _G --[[@as table]]
if parts[1]:sub(1, 1) == "t" then
table.remove(parts, 1)
colors = require("cyberdream.colors").default
t = colors
end
local color = vim.tbl_get(t, unpack(parts))
return type(color) == "string" and get_hl_group({ fg = color })
end,
extmark_opts = function(_, _, data)
return {
virt_text = { { "", data.hl_group } },
virt_text_pos = "inline",
priority = 2000,
}
end,
}
end,
},
}