From 86c080d19c318dfaa1d96d9fa8c5f3b041e0eb25 Mon Sep 17 00:00:00 2001 From: Francis Belanger Date: Fri, 12 Jun 2026 08:57:45 -0400 Subject: [PATCH 1/2] fix: preserve user's existing fillchars in output window This should fix #415 --- lua/opencode/ui/output_window.lua | 17 ++++++++++++++++- tests/unit/output_window_spec.lua | 26 ++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/lua/opencode/ui/output_window.lua b/lua/opencode/ui/output_window.lua index 0806b5a7..a7f4d166 100644 --- a/lua/opencode/ui/output_window.lua +++ b/lua/opencode/ui/output_window.lua @@ -11,6 +11,13 @@ M._last_visible_bottom_by_win = {} M._was_at_bottom_by_win = {} M._prev_line_count_by_win = {} +local OUTPUT_FOLD_FILLCHARS = { + fold = '-', + foldclose = '+', + foldopen = '-', + foldsep = '│', +} + local function build_fold_state(folds) local fold_state = { ranges = {}, @@ -258,7 +265,15 @@ function M.setup(windows) window_options.set_window_option('foldenable', true, windows.output_win) window_options.set_window_option('foldlevel', 0, windows.output_win) window_options.set_window_option('foldcolumn', '1', windows.output_win) - window_options.set_window_option('fillchars', 'fold:-,foldopen:-,foldclose:+,foldsep:│', windows.output_win) + window_options.set_window_option( + 'fillchars', + vim.api.nvim_get_option_value('fillchars', { win = windows.output_win }), + windows.output_win, + { save_original = true } + ) + vim.api.nvim_win_call(windows.output_win, function() + vim.opt_local.fillchars:append(OUTPUT_FOLD_FILLCHARS) + end) window_options.set_window_option('foldtext', 'v:lua.opencode_fold_text()', windows.output_win) if config.ui.position ~= 'current' then diff --git a/tests/unit/output_window_spec.lua b/tests/unit/output_window_spec.lua index 120d1deb..61515fb0 100644 --- a/tests/unit/output_window_spec.lua +++ b/tests/unit/output_window_spec.lua @@ -4,6 +4,19 @@ local output_window = require('opencode.ui.output_window') local flush = require('opencode.ui.renderer.flush') local stub = require('luassert.stub') +---@param value string +---@return table +local function parse_fillchars(value) + local result = {} + for _, part in ipairs(vim.split(value, ',', { plain = true, trimempty = true })) do + local key, item = part:match('^([^:]+):(.*)$') + if key and item then + result[key] = item + end + end + return result +end + describe('output_window.create_buf', function() local original_config @@ -154,12 +167,21 @@ describe('output_window.setup', function() assert.equals(0, foldlevel) end) - it('sets fold fillchars to avoid numeric fold column markers', function() + it('preserves existing fillchars while setting fold fillchars', function() + vim.api.nvim_set_option_value('fillchars', 'eob:~,lastline:@', { win = win, scope = 'local' }) + output_window.setup({ output_buf = buf, output_win = win }) local fillchars = vim.api.nvim_get_option_value('fillchars', { win = win }) - assert.equals('fold:-,foldopen:-,foldclose:+,foldsep:│', fillchars) + assert.same({ + eob = '~', + lastline = '@', + fold = '-', + foldopen = '-', + foldclose = '+', + foldsep = '│', + }, parse_fillchars(fillchars)) end) it('applies closed folds immediately when fold ranges change', function() From f5b98a21402fed0144b3159cbfa3ebce130c4ca1 Mon Sep 17 00:00:00 2001 From: Francis Belanger Date: Fri, 12 Jun 2026 10:09:33 -0400 Subject: [PATCH 2/2] refactor(question): remove config-driven fold/output from question tool Never fold or hide the questions This fixes #416 --- lua/opencode/ui/formatter/tools/question.lua | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lua/opencode/ui/formatter/tools/question.lua b/lua/opencode/ui/formatter/tools/question.lua index c46d5531..fa88e538 100644 --- a/lua/opencode/ui/formatter/tools/question.lua +++ b/lua/opencode/ui/formatter/tools/question.lua @@ -11,15 +11,13 @@ function M.format(output, part) local metadata = part.state and part.state.metadata or {} local utils = require('opencode.ui.formatter.utils') - local config = require('opencode.config') -- question tool never shows duration local icons = require('opencode.ui.icons') utils.format_action(output, icons.get('question'), 'question', '', nil) output:add_empty_line() - local start_line = output:get_line_count() + 1 - if not (config.ui.output.tools.show_output or config.ui.output.tools.use_folds) or (part.state and part.state.status) ~= 'completed' then + if (part.state and part.state.status) ~= 'completed' then return end @@ -48,8 +46,6 @@ function M.format(output, part) output:add_line('') end end - - output:add_fold_with_threshold(start_line, config.ui.output.tools.show_output, config.ui.output.tools.use_folds) end return M