Skip to content

Commit a40b8af

Browse files
committed
fix(winfixbuf): remove winfixbuf when nvim reuse window.
1 parent af4e1a8 commit a40b8af

2 files changed

Lines changed: 37 additions & 10 deletions

File tree

lua/opencode/ui/output_window.lua

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,18 @@ function M.focus_output(should_stop_insert)
642642
vim.api.nvim_set_current_win(state.windows.output_win)
643643
end
644644

645+
---Restore winfix options on a window so they don't linger if the window
646+
---survives (e.g. after buffer deletion or when Neovim reuses the window).
647+
---@param win integer
648+
function M.restore_winfix_options(win)
649+
if not win or not vim.api.nvim_win_is_valid(win) then
650+
return
651+
end
652+
pcall(vim.api.nvim_set_option_value, 'winfixbuf', false, { win = win })
653+
pcall(vim.api.nvim_set_option_value, 'winfixheight', false, { win = win })
654+
pcall(vim.api.nvim_set_option_value, 'winfixwidth', false, { win = win })
655+
end
656+
645657
---Close and delete the output window and buffer.
646658
function M.close()
647659
if not M.mounted() then
@@ -650,6 +662,7 @@ function M.close()
650662
---@cast state.windows { output_win: integer, output_buf: integer }
651663

652664
M.reset_scroll_tracking(state.windows.output_win)
665+
M.restore_winfix_options(state.windows.output_win)
653666
pcall(vim.api.nvim_win_close, state.windows.output_win, true)
654667
pcall(vim.api.nvim_buf_delete, state.windows.output_buf, { force = true })
655668
end
@@ -770,6 +783,17 @@ function M.setup_autocmds(windows, group)
770783
end
771784
end,
772785
})
786+
787+
-- Restore winfixbuf etc. when the output buffer is removed from the window,
788+
vim.api.nvim_create_autocmd('BufDelete', {
789+
group = group,
790+
buffer = windows.output_buf,
791+
callback = function()
792+
if windows.output_win and vim.api.nvim_win_is_valid(windows.output_win) then
793+
M.restore_winfix_options(windows.output_win)
794+
end
795+
end,
796+
})
773797
end
774798

775799
---Clear the output buffer and all namespaces.

lua/opencode/ui/ui.lua

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,21 @@ end
109109

110110
---@param windows OpencodeWindowState
111111
local function close_or_restore_output_window(windows)
112+
if not windows.output_win or not vim.api.nvim_win_is_valid(windows.output_win) then
113+
return
114+
end
115+
116+
output_window.restore_winfix_options(windows.output_win)
117+
112118
if config.ui.position == 'current' then
113-
if windows.output_win and vim.api.nvim_win_is_valid(windows.output_win) then
114-
pcall(vim.api.nvim_set_option_value, 'winfixbuf', false, { win = windows.output_win })
115-
if state.current_code_buf and vim.api.nvim_buf_is_valid(state.current_code_buf) then
116-
pcall(vim.api.nvim_win_set_buf, windows.output_win, state.current_code_buf)
117-
end
118-
if state.saved_window_options then
119-
for opt, value in pairs(state.saved_window_options) do
120-
pcall(vim.api.nvim_set_option_value, opt, value, { win = windows.output_win })
121-
end
122-
state.ui.set_saved_window_options(nil)
119+
if state.current_code_buf and vim.api.nvim_buf_is_valid(state.current_code_buf) then
120+
pcall(vim.api.nvim_win_set_buf, windows.output_win, state.current_code_buf)
121+
end
122+
if state.saved_window_options then
123+
for opt, value in pairs(state.saved_window_options) do
124+
pcall(vim.api.nvim_set_option_value, opt, value, { win = windows.output_win })
123125
end
126+
state.ui.set_saved_window_options(nil)
124127
end
125128
return
126129
end

0 commit comments

Comments
 (0)