auto dark/light theme (from darkman)
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(NVIM_APPNAME=nvchad-test nvim:*)",
|
||||
"Bash(darkman get:*)"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
WRN 2026-02-16T16:29:54.587 ?.8 server_start:199: Failed to start server: read-only file system: /run/user/1000/nvim.8.0
|
||||
@@ -35,3 +35,9 @@ require "nvchad.autocmds"
|
||||
vim.schedule(function()
|
||||
require "mappings"
|
||||
end)
|
||||
|
||||
-- Start theme sync with system (darkman)
|
||||
vim.schedule(function()
|
||||
local theme_sync = require "theme-sync"
|
||||
theme_sync.watch()
|
||||
end)
|
||||
|
||||
+14
-1
@@ -2,6 +2,19 @@
|
||||
-- https://github.com/NvChad/ui/blob/v2.5/lua/nvconfig.lua
|
||||
-- Please read that file to know all available options :(
|
||||
|
||||
-- Get system theme from darkman
|
||||
local function get_system_theme()
|
||||
local handle = io.popen("darkman get 2>/dev/null")
|
||||
if handle then
|
||||
local result = handle:read("*a")
|
||||
handle:close()
|
||||
if result and result:match("light") then
|
||||
return "onenord_light"
|
||||
end
|
||||
end
|
||||
return "onenord" -- default dark theme
|
||||
end
|
||||
|
||||
---@type ChadrcConfig
|
||||
local M = {
|
||||
ui = {
|
||||
@@ -10,7 +23,7 @@ local M = {
|
||||
},
|
||||
},
|
||||
base46 = {
|
||||
theme = "onenord",
|
||||
theme = get_system_theme(),
|
||||
},
|
||||
|
||||
nvdash = {
|
||||
|
||||
@@ -21,3 +21,9 @@ vim.g.neovide_scroll_animation_length = 0.15
|
||||
vim.g.neovide_cursor_animation_length = 0.11
|
||||
|
||||
vim.o.swapfile = false
|
||||
|
||||
-- Command to manually sync theme with system
|
||||
vim.api.nvim_create_user_command("ThemeSync", function()
|
||||
require("theme-sync").sync()
|
||||
vim.notify("Theme synced with system", vim.log.levels.INFO)
|
||||
end, { desc = "Sync theme with system (darkman)" })
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
-- Sync Neovim theme with system (darkman)
|
||||
|
||||
local M = {}
|
||||
|
||||
-- Theme mappings
|
||||
M.themes = {
|
||||
light = "onenord_light",
|
||||
dark = "onenord", -- Change to your preferred dark theme
|
||||
}
|
||||
|
||||
-- Get current system theme from darkman
|
||||
function M.get_system_mode()
|
||||
local handle = io.popen("darkman get 2>/dev/null")
|
||||
if handle then
|
||||
local result = handle:read("*a")
|
||||
handle:close()
|
||||
result = result and result:gsub("%s+$", "") or nil
|
||||
if result == "light" then
|
||||
return "light"
|
||||
end
|
||||
end
|
||||
return "dark"
|
||||
end
|
||||
|
||||
-- Apply theme based on mode (mirrors NvChad's toggle_theme logic)
|
||||
function M.apply_theme(mode)
|
||||
local theme = M.themes[mode] or M.themes.dark
|
||||
local opts = require("nvconfig").base46
|
||||
|
||||
-- Update in-memory config so base46.compile() picks up the new theme
|
||||
opts.theme = theme
|
||||
|
||||
-- Bust chadrc cache, read old theme from file, then replace it
|
||||
package.loaded.chadrc = nil
|
||||
local old_theme = require("chadrc").base46.theme
|
||||
require("nvchad.utils").replace_word('theme = "' .. old_theme, 'theme = "' .. theme)
|
||||
|
||||
require("base46").load_all_highlights()
|
||||
end
|
||||
|
||||
-- Sync with system theme
|
||||
function M.sync()
|
||||
local mode = M.get_system_mode()
|
||||
M.apply_theme(mode)
|
||||
end
|
||||
|
||||
-- Watch for theme changes (checks periodically)
|
||||
function M.watch()
|
||||
local timer = vim.loop.new_timer()
|
||||
local last_mode = M.get_system_mode()
|
||||
|
||||
timer:start(0, 5000, vim.schedule_wrap(function()
|
||||
local current_mode = M.get_system_mode()
|
||||
if current_mode ~= last_mode then
|
||||
M.apply_theme(current_mode)
|
||||
last_mode = current_mode
|
||||
end
|
||||
end))
|
||||
end
|
||||
|
||||
return M
|
||||
Reference in New Issue
Block a user