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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ require('opencode').setup({
}
},
ui = {
position = 'right', -- 'right' (default) or 'left'. Position of the UI split
position = 'right', -- 'right' (default), 'left' or 'current'. Position of the UI split. 'current' uses the current window for the output.
input_position = 'bottom', -- 'bottom' (default) or 'top'. Position of the input window
window_width = 0.40, -- Width as percentage of editor width
zoom_width = 0.8, -- Zoom width as percentage of editor width
Expand Down
2 changes: 1 addition & 1 deletion lua/opencode/health.lua
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ local function check_configuration()

---@cast config OpencodeConfig

local valid_positions = { 'left', 'right', 'top', 'bottom' }
local valid_positions = { 'left', 'right', 'top', 'bottom', 'current' }
if not vim.tbl_contains(valid_positions, config.ui.position) then
health.warn(
string.format('Invalid UI position: %s', config.ui.position),
Expand Down
2 changes: 1 addition & 1 deletion lua/opencode/types.lua
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@
---@field frames string[]

---@class OpencodeUIConfig
---@field position 'right'|'left' # Position of the UI (default: 'right')
---@field position 'right'|'left'|'current' # Position of the UI (default: 'right')
---@field input_position 'bottom'|'top' # Position of the input window (default: 'bottom')
---@field window_width number
---@field zoom_width number
Expand Down
26 changes: 26 additions & 0 deletions lua/opencode/ui/autocmds.lua
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,32 @@ function M.setup_autocmds(windows)
require('opencode.state').is_opencode_focused = require('opencode.ui.ui').is_opencode_focused()
end,
})

if require('opencode.config').ui.position == 'current' then
vim.api.nvim_create_autocmd('BufEnter', {
group = group,
callback = function()
local current_win = vim.api.nvim_get_current_win()
local current_buf = vim.api.nvim_get_current_buf()

if current_win ~= windows.output_win and current_win ~= windows.input_win then
return
end

local is_opencode_buf = (
current_buf == windows.output_buf
or current_buf == windows.input_buf
or (windows.footer_buf and current_buf == windows.footer_buf)
)

if not is_opencode_buf then
vim.schedule(function()
require('opencode.ui.ui').close_windows(windows)
end)
end
end,
})
end
end

function M.setup_resize_handler(windows)
Expand Down
14 changes: 11 additions & 3 deletions lua/opencode/ui/input_window.lua
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,9 @@ function M.setup(windows)
vim.api.nvim_set_option_value('buftype', 'nofile', { buf = windows.input_buf })
vim.api.nvim_set_option_value('swapfile', false, { buf = windows.input_buf })
-- vim.b[windows.input_buf].completion = false
vim.api.nvim_set_option_value('winfixbuf', true, { win = windows.input_win })
if config.ui.position ~= 'current' then
vim.api.nvim_set_option_value('winfixbuf', true, { win = windows.input_win })
end
vim.api.nvim_set_option_value('winfixheight', true, { win = windows.input_win })
vim.api.nvim_set_option_value('winfixwidth', true, { win = windows.input_win })

Expand All @@ -124,11 +126,17 @@ function M.update_dimensions(windows)
return
end

local total_width = vim.api.nvim_get_option_value('columns', {})
local total_height = vim.api.nvim_get_option_value('lines', {})
local width = math.floor(total_width * config.ui.window_width)
local height = math.floor(total_height * config.ui.input_height)

if config.ui.position == 'current' then
pcall(vim.api.nvim_win_set_height, windows.input_win, height)
return
end

local total_width = vim.api.nvim_get_option_value('columns', {})
local width = math.floor(total_width * config.ui.window_width)

vim.api.nvim_win_set_config(windows.input_win, { width = width, height = height })
end

Expand Down
7 changes: 6 additions & 1 deletion lua/opencode/ui/output_window.lua
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ function M.setup(windows)
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 })
vim.api.nvim_set_option_value('winfixbuf', true, { win = windows.output_win })
if config.ui.position ~= 'current' then
vim.api.nvim_set_option_value('winfixbuf', true, { win = 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 })
Expand All @@ -78,6 +80,9 @@ function M.setup(windows)
end

function M.update_dimensions(windows)
if config.ui.position == 'current' then
return
end
local total_width = vim.api.nvim_get_option_value('columns', {})
local width = math.floor(total_width * config.ui.window_width)

Expand Down
16 changes: 14 additions & 2 deletions lua/opencode/ui/ui.lua
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,14 @@ function M.close_windows(windows)

---@cast windows { input_win: integer, output_win: integer, input_buf: integer, output_buf: integer }
pcall(vim.api.nvim_win_close, windows.input_win, true)
pcall(vim.api.nvim_win_close, windows.output_win, true)
if config.ui.position == 'current' then
pcall(vim.api.nvim_set_option_value, 'winfixbuf', false, { win = windows.output_win })
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
else
pcall(vim.api.nvim_win_close, windows.output_win, true)
end
pcall(vim.api.nvim_buf_delete, windows.input_buf, { force = true })
pcall(vim.api.nvim_buf_delete, windows.output_buf, { force = true })
footer.close()
Expand Down Expand Up @@ -67,7 +74,12 @@ function M.create_split_windows(input_buf, output_buf)
end
local ui_conf = config.ui

local main_win = open_split(ui_conf.position, 'vertical')
local main_win
if ui_conf.position == 'current' then
main_win = vim.api.nvim_get_current_win()
else
main_win = open_split(ui_conf.position, 'vertical')
end
vim.api.nvim_set_current_win(main_win)

local input_win = open_split(ui_conf.input_position, 'horizontal')
Expand Down