Fix theme hot-reload when old and new theme share the same colorscheme plugin

lazy.nvim caches a plugin's resolved opts in plugin._.cache and carries
that state over on a spec reload, and Loader.colorscheme() no-ops for
already-loaded plugins. So switching between two themes driven by the
same colorscheme plugin (e.g. generic themes on aether.nvim) never
pushed the new palette into setup(), leaving stale colors until nvim
was restarted. Fully reload the theme plugin instead, which clears the
cached opts and reruns config with the new theme's colors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
David Heinemeier HanssonandClaude Fable 5 committed 2026-07-19 20:34:27 -07:00
1 parent 2f0a498b43
commit 94ee311b25
2 files changed
+12 -3

No files matched your search

@@ -55,8 +55,17 @@ return {
if spec[1] == "LazyVim/LazyVim" and spec.opts and spec.opts.colorscheme then
local colorscheme = spec.opts.colorscheme
-- Load the colorscheme plugin
require("lazy.core.loader").colorscheme(colorscheme)
-- Load the colorscheme plugin. If it's already loaded (old and new
-- theme sharing the same plugin, e.g. generic themes on aether.nvim),
-- lazy won't rerun setup() on a spec reload and keeps the old
-- resolved opts in the plugin's property cache, so fully reload it
-- to reapply setup() with the new theme's opts.
local theme_plugin = theme_plugin_name and require("lazy.core.config").plugins[theme_plugin_name]
if theme_plugin and theme_plugin._.loaded then
require("lazy.core.loader").reload(theme_plugin)
else
require("lazy.core.loader").colorscheme(colorscheme)
end
vim.defer_fn(function()
-- Apply the colorscheme (it will set background itself)