From 8428fae65959e7bf1aa39d469878af95030a1b75 Mon Sep 17 00:00:00 2001 From: Sai Nimal Date: Tue, 3 Nov 2026 18:14:44 +0530 Subject: [PATCH] fix(ui): restore highlights after colorscheme changes --- lua/opencode/ui/highlight.lua | 16 ++++++++++++- tests/unit/highlight_spec.lua | 44 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/unit/highlight_spec.lua diff --git a/lua/opencode/ui/highlight.lua b/lua/opencode/ui/highlight.lua index 0a81c8c7..0fcaedf0 100644 --- a/lua/opencode/ui/highlight.lua +++ b/lua/opencode/ui/highlight.lua @@ -1,7 +1,7 @@ local M = {} ---Define the plugin highlight groups for the current background. -function M.setup() +local function apply_highlights() local is_light = vim.o.background == 'light' if is_light then @@ -153,4 +153,18 @@ function M.setup() vim.api.nvim_set_hl(0, 'OpencodeCompactionFailed', { link = 'DiagnosticError', default = true }) end +function M.setup() + apply_highlights() + + local group = vim.api.nvim_create_augroup('OpencodePluginHighlights', { + clear = true, + }) + + vim.api.nvim_create_autocmd('ColorScheme', { + group = group, + callback = apply_highlights, + desc = 'Restore opencode.nvim highlights after colorscheme changes', + }) +end + return M diff --git a/tests/unit/highlight_spec.lua b/tests/unit/highlight_spec.lua new file mode 100644 index 00000000..11f74a38 --- /dev/null +++ b/tests/unit/highlight_spec.lua @@ -0,0 +1,44 @@ +local highlight = require('opencode.ui.highlight') + +describe('opencode highlight groups', function() + local name = 'OpencodeDialogOptionHover' + + after_each(function() + pcall(vim.api.nvim_del_augroup_by_name, 'OpencodePluginHighlights') + vim.cmd.colorscheme('default') + vim.api.nvim_set_hl(0, name, {}) + end) + + it('restores highlights after a colorscheme change', function() + highlight.setup() + + assert.is_not_nil(next(vim.api.nvim_get_hl(0, { name = name }))) + + vim.cmd.colorscheme('habamax') + + assert.is_not_nil(next(vim.api.nvim_get_hl(0, { name = name }))) + end) + + it('preserves custom highlights', function() + highlight.setup() + vim.api.nvim_set_hl(0, name, { fg = '#123456' }) + + vim.api.nvim_exec_autocmds('ColorScheme', { + pattern = 'custom-theme', + }) + + assert.are.equal(0x123456, vim.api.nvim_get_hl(0, { name = name }).fg) + end) + + it('registers only one ColorScheme handler', function() + highlight.setup() + highlight.setup() + + local autocmds = vim.api.nvim_get_autocmds({ + event = 'ColorScheme', + group = 'OpencodePluginHighlights', + }) + + assert.are.equal(1, #autocmds) + end) +end)