diff --git a/lua/opencode/state.lua b/lua/opencode/state.lua index 2aaed930..9f13e970 100644 --- a/lua/opencode/state.lua +++ b/lua/opencode/state.lua @@ -16,6 +16,7 @@ ---@field last_output_window_position integer[]|nil ---@field last_code_win_before_opencode integer|nil ---@field current_code_buf number|nil +---@field saved_window_options table|nil ---@field display_route any|nil ---@field current_mode string ---@field last_output number @@ -61,6 +62,7 @@ local _state = { last_output_window_position = nil, last_code_win_before_opencode = nil, current_code_buf = nil, + saved_window_options = nil, display_route = nil, current_mode = nil, last_output = 0, diff --git a/lua/opencode/ui/output_window.lua b/lua/opencode/ui/output_window.lua index 3f4b2bfa..9b824487 100644 --- a/lua/opencode/ui/output_window.lua +++ b/lua/opencode/ui/output_window.lua @@ -58,22 +58,52 @@ function M.is_at_bottom(win) return botline >= line_count - 1 end +---Helper to set window option and save original value for position='current' +---@param opt_name string The option name +---@param value any The value to set +---@param win integer The window ID +local function set_win_option(opt_name, value, win) + -- Save original value if using position = 'current' + if config.ui.position == 'current' then + if not state.saved_window_options then + state.saved_window_options = {} + end + -- Only save if not already saved (in case this function is called multiple times) + if state.saved_window_options[opt_name] == nil then + local ok, original = pcall(vim.api.nvim_get_option_value, opt_name, { win = win }) + if ok then + state.saved_window_options[opt_name] = original + end + end + end + + vim.api.nvim_set_option_value(opt_name, value, { win = win }) +end + +---Helper to set buffer option (no saving needed) +---@param opt_name string The option name +---@param value any The value to set +---@param buf integer The buffer ID +local function set_buf_option(opt_name, value, buf) + vim.api.nvim_set_option_value(opt_name, value, { buf = buf }) +end + function M.setup(windows) - vim.api.nvim_set_option_value('winhighlight', config.ui.window_highlight, { win = windows.output_win }) - vim.api.nvim_set_option_value('wrap', true, { win = windows.output_win }) - vim.api.nvim_set_option_value('number', false, { win = windows.output_win }) - vim.api.nvim_set_option_value('relativenumber', false, { win = windows.output_win }) - vim.api.nvim_set_option_value('modifiable', false, { buf = windows.output_buf }) - vim.api.nvim_set_option_value('buftype', 'nofile', { buf = windows.output_buf }) - vim.api.nvim_set_option_value('swapfile', false, { buf = windows.output_buf }) + set_win_option('winhighlight', config.ui.window_highlight, windows.output_win) + set_win_option('wrap', true, windows.output_win) + set_win_option('number', false, windows.output_win) + set_win_option('relativenumber', false, windows.output_win) + set_buf_option('modifiable', false, windows.output_buf) + set_buf_option('buftype', 'nofile', windows.output_buf) + set_buf_option('swapfile', false, windows.output_buf) if config.ui.position ~= 'current' then - vim.api.nvim_set_option_value('winfixbuf', true, { win = windows.output_win }) + set_win_option('winfixbuf', true, windows.output_win) end - vim.api.nvim_set_option_value('winfixheight', true, { win = windows.output_win }) - vim.api.nvim_set_option_value('winfixwidth', true, { win = windows.output_win }) - vim.api.nvim_set_option_value('signcolumn', 'yes', { scope = 'local', win = windows.output_win }) - vim.api.nvim_set_option_value('list', false, { scope = 'local', win = windows.output_win }) - vim.api.nvim_set_option_value('statuscolumn', '', { win = windows.output_win }) + set_win_option('winfixheight', true, windows.output_win) + set_win_option('winfixwidth', true, windows.output_win) + set_win_option('signcolumn', 'yes', windows.output_win) + set_win_option('list', false, windows.output_win) + set_win_option('statuscolumn', '', windows.output_win) M.update_dimensions(windows) M.setup_keymaps(windows) diff --git a/lua/opencode/ui/ui.lua b/lua/opencode/ui/ui.lua index c160840c..b028a5b3 100644 --- a/lua/opencode/ui/ui.lua +++ b/lua/opencode/ui/ui.lua @@ -31,6 +31,13 @@ function M.close_windows(windows) if state.current_code_buf and vim.api.nvim_buf_is_valid(state.current_code_buf) then pcall(vim.api.nvim_win_set_buf, windows.output_win, state.current_code_buf) end + -- Restore original window options + if state.saved_window_options and vim.api.nvim_win_is_valid(windows.output_win) then + for opt, value in pairs(state.saved_window_options) do + pcall(vim.api.nvim_set_option_value, opt, value, { win = windows.output_win }) + end + state.saved_window_options = nil + end else pcall(vim.api.nvim_win_close, windows.output_win, true) end