135 lines
4.3 KiB
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,
|
|
},
|
|
}
|