mirror of
https://github.com/gabehf/base46.git
synced 2026-03-09 23:48:16 -07:00
Lua copies tables by reference, which leads to permanent replacements of named colors to their absolute values in user highlight table. Thus, when theme is toggled or changed, user highlights are not updated, cause they are stuck with absolute values. This commit does two thigs: * Copy user highlight tables by value * Add missing hl_add update in chadlights.lua
186 lines
4.5 KiB
Lua
186 lines
4.5 KiB
Lua
local M = {}
|
|
local g = vim.g
|
|
local config = require("core.utils").load_config()
|
|
|
|
M.get_theme_tb = function(type)
|
|
local default_path = "base46.themes." .. g.nvchad_theme
|
|
local user_path = "custom.themes." .. g.nvchad_theme
|
|
|
|
local present1, default_theme = pcall(require, default_path)
|
|
local present2, user_theme = pcall(require, user_path)
|
|
|
|
if present1 then
|
|
return default_theme[type]
|
|
elseif present2 then
|
|
return user_theme[type]
|
|
else
|
|
error "No such theme bruh >_< "
|
|
end
|
|
end
|
|
|
|
M.merge_tb = function(table1, table2)
|
|
return vim.tbl_deep_extend("force", table1, table2)
|
|
end
|
|
|
|
-- credits to https://github.com/max397574 for this function
|
|
M.clear_highlights = function(hl_group)
|
|
local highlights_raw = vim.split(vim.api.nvim_exec("filter " .. hl_group .. " hi", true), "\n")
|
|
local highlight_groups = {}
|
|
|
|
for _, raw_hi in ipairs(highlights_raw) do
|
|
table.insert(highlight_groups, string.match(raw_hi, hl_group .. "%a+"))
|
|
end
|
|
|
|
for _, highlight in ipairs(highlight_groups) do
|
|
vim.cmd([[hi clear ]] .. highlight)
|
|
end
|
|
end
|
|
|
|
M.load_all_highlights = function()
|
|
vim.opt.bg = require("base46").get_theme_tb "type" -- dark/light
|
|
|
|
-- reload highlights for theme switcher
|
|
local reload = require("plenary.reload").reload_module
|
|
local clear_hl = require("base46").clear_highlights
|
|
|
|
clear_hl "BufferLine"
|
|
clear_hl "TS"
|
|
|
|
reload "base46.integrations"
|
|
reload "base46.chadlights"
|
|
|
|
local hl_groups = require "base46.chadlights"
|
|
|
|
for hl, col in pairs(hl_groups) do
|
|
vim.api.nvim_set_hl(0, hl, col)
|
|
end
|
|
end
|
|
|
|
M.turn_str_to_color = function(tb_in)
|
|
local tb = vim.deepcopy(tb_in)
|
|
local colors = M.get_theme_tb "base_30"
|
|
|
|
for _, groups in pairs(tb) do
|
|
for k, v in pairs(groups) do
|
|
if k == "fg" or k == "bg" then
|
|
if v:sub(1, 1) == "#" or v == "none" or v == "NONE" then
|
|
else
|
|
groups[k] = colors[v]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return tb
|
|
end
|
|
|
|
M.extend_default_hl = function(highlights)
|
|
local glassy = require "base46.glassy"
|
|
local polish_hl = M.get_theme_tb "polish_hl"
|
|
|
|
-- polish themes
|
|
if polish_hl then
|
|
for key, value in pairs(polish_hl) do
|
|
if highlights[key] then
|
|
highlights[key] = M.merge_tb(highlights[key], value)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- transparency
|
|
if vim.g.transparency then
|
|
for key, value in pairs(glassy) do
|
|
if highlights[key] then
|
|
highlights[key] = M.merge_tb(highlights[key], value)
|
|
end
|
|
end
|
|
end
|
|
|
|
local overriden_hl = M.turn_str_to_color(config.ui.hl_override)
|
|
|
|
for key, value in pairs(overriden_hl) do
|
|
if highlights[key] then
|
|
highlights[key] = M.merge_tb(highlights[key], value)
|
|
end
|
|
end
|
|
end
|
|
|
|
M.load_highlight = function(group)
|
|
if type(group) == "string" then
|
|
group = require("base46.integrations." .. group)
|
|
M.extend_default_hl(group)
|
|
end
|
|
|
|
for hl, col in pairs(group) do
|
|
vim.api.nvim_set_hl(0, hl, col)
|
|
end
|
|
end
|
|
|
|
M.load_theme = function()
|
|
M.load_highlight "defaults"
|
|
M.load_highlight "statusline"
|
|
M.load_highlight(M.turn_str_to_color(config.ui.hl_add))
|
|
end
|
|
|
|
M.override_theme = function(default_theme, theme_name)
|
|
local changed_themes = config.ui.changed_themes
|
|
|
|
if changed_themes[theme_name] then
|
|
return M.merge_tb(default_theme, changed_themes[theme_name])
|
|
else
|
|
return default_theme
|
|
end
|
|
end
|
|
|
|
M.toggle_theme = function()
|
|
local themes = config.ui.theme_toggle
|
|
|
|
local theme1 = themes[1]
|
|
local theme2 = themes[2]
|
|
|
|
if g.nvchad_theme == theme1 or g.nvchad_theme == theme2 then
|
|
if g.toggle_theme_icon == " " then
|
|
g.toggle_theme_icon = " "
|
|
else
|
|
g.toggle_theme_icon = " "
|
|
end
|
|
end
|
|
|
|
if g.nvchad_theme == theme1 then
|
|
g.nvchad_theme = theme2
|
|
|
|
require("nvchad").reload_theme()
|
|
require("nvchad").change_theme(theme1, theme2)
|
|
elseif g.nvchad_theme == theme2 then
|
|
g.nvchad_theme = theme1
|
|
|
|
require("nvchad").reload_theme()
|
|
require("nvchad").change_theme(theme2, theme1)
|
|
else
|
|
vim.notify "Set your current theme to one of those mentioned in the theme_toggle table (chadrc)"
|
|
end
|
|
end
|
|
|
|
M.toggle_transparency = function()
|
|
local transparency_status = config.ui.transparency
|
|
local write_data = require("nvchad").write_data
|
|
|
|
local function save_chadrc_data()
|
|
local old_data = "transparency = " .. tostring(transparency_status)
|
|
local new_data = "transparency = " .. tostring(g.transparency)
|
|
|
|
write_data(old_data, new_data)
|
|
end
|
|
|
|
if g.transparency then
|
|
g.transparency = false
|
|
M.load_all_highlights()
|
|
save_chadrc_data()
|
|
else
|
|
g.transparency = true
|
|
M.load_all_highlights()
|
|
save_chadrc_data()
|
|
end
|
|
end
|
|
|
|
return M
|