Skip to content
Open
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
2 changes: 2 additions & 0 deletions lua/opencode/state.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
56 changes: 43 additions & 13 deletions lua/opencode/ui/output_window.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions lua/opencode/ui/ui.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down