Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions lua/opencode/ui/input_window.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
72 changes: 70 additions & 2 deletions tests/unit/input_window_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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)