diff --git a/lua/opencode/ui/input_window.lua b/lua/opencode/ui/input_window.lua index 48f86a3c..d805ce2d 100644 --- a/lua/opencode/ui/input_window.lua +++ b/lua/opencode/ui/input_window.lua @@ -187,6 +187,10 @@ M._prompt_add_to_context = function(cmd, output, exit_code) end M._append_to_input = function(text) + if M._hidden then + M._show() + end + if not M.mounted() then return end @@ -378,12 +382,22 @@ end function M.set_content(text, windows) windows = windows or state.windows - if not M.mounted(windows) then + if not windows or not windows.input_buf then return end - ---@cast windows { input_win: integer, input_buf: integer } local lines = type(text) == 'table' and text or vim.split(tostring(text), '\n') + local has_content = #lines > 1 or (lines[1] and lines[1] ~= '') + + if has_content and M._hidden then + M._show() + windows = state.windows + end + + if not M.mounted(windows) then + return + end + ---@cast windows { input_win: integer, input_buf: integer } vim.api.nvim_buf_set_lines(windows.input_buf, 0, -1, false, lines) end diff --git a/tests/unit/input_window_spec.lua b/tests/unit/input_window_spec.lua index 17409689..4abb2e8b 100644 --- a/tests/unit/input_window_spec.lua +++ b/tests/unit/input_window_spec.lua @@ -84,8 +84,7 @@ describe('input_window', function() output_lines = lines end - output_window.clear = function() - end + output_window.clear = function() end vim.system = function(cmd, opts, callback) vim.schedule(function() @@ -358,4 +357,73 @@ describe('input_window', function() state.windows = nil end) end) + + describe('auto-show when hidden', function() + local input_buf, output_buf, input_win, output_win + + before_each(function() + input_buf = vim.api.nvim_create_buf(false, true) + output_buf = vim.api.nvim_create_buf(false, true) + input_win = vim.api.nvim_open_win(input_buf, true, { + relative = 'editor', + width = 80, + height = 10, + row = 0, + col = 0, + }) + output_win = vim.api.nvim_open_win(output_buf, false, { + relative = 'editor', + width = 80, + height = 10, + row = 11, + col = 0, + }) + + state.windows = { + input_buf = input_buf, + input_win = input_win, + output_buf = output_buf, + output_win = output_win, + } + end) + + after_each(function() + pcall(vim.api.nvim_win_close, input_win, true) + pcall(vim.api.nvim_win_close, output_win, true) + pcall(vim.api.nvim_buf_delete, input_buf, { force = true }) + pcall(vim.api.nvim_buf_delete, output_buf, { force = true }) + state.windows = nil + input_window._hidden = false + end) + + it('should auto-show when set_content is called with non-empty content while hidden', function() + input_window._hidden = true + pcall(vim.api.nvim_win_close, input_win, true) + state.windows.input_win = nil + + input_window.set_content('test content') + + assert.is_false(input_window._hidden) + end) + + it('should not auto-show when set_content is called with empty content while hidden', function() + input_window._hidden = true + pcall(vim.api.nvim_win_close, input_win, true) + state.windows.input_win = nil + + input_window.set_content('') + + assert.is_true(input_window._hidden) + end) + + it('should auto-show when _append_to_input is called while hidden', function() + input_window._hidden = true + pcall(vim.api.nvim_win_close, input_win, true) + state.windows.input_win = nil + + input_window._append_to_input('appended content') + + assert.is_false(input_window._hidden) + end) + end) end)