Files
opencode.nvim/lua/opencode.lua
T
agj 1445303411 feat: limit the terminal width
Also add the possibility of configuring it.
2026-06-11 22:18:13 +02:00

92 lines
2.0 KiB
Lua

local M = {}
local state = {
buf = nil,
win = nil,
job = nil,
}
local config = {
width = 0.4,
}
local function is_valid_window(win)
return win and vim.api.nvim_win_is_valid(win)
end
local function is_valid_buffer(buf)
return buf and vim.api.nvim_buf_is_valid(buf)
end
local function terminal_width()
return math.max(1, math.floor(vim.o.columns * config.width))
end
local function resize_side_window()
if is_valid_window(state.win) then
vim.api.nvim_win_set_width(state.win, terminal_width())
end
end
local function open_side_window()
vim.cmd("botright vertical " .. terminal_width() .. "new")
state.win = vim.api.nvim_get_current_win()
end
local function start_terminal()
state.buf = vim.api.nvim_create_buf(false, true)
vim.api.nvim_set_option_value("bufhidden", "hide", { buf = state.buf })
vim.api.nvim_set_option_value("filetype", "opencode", { buf = state.buf })
vim.api.nvim_buf_set_name(state.buf, "opencode")
vim.api.nvim_win_set_buf(state.win, state.buf)
state.job = vim.fn.termopen("opencode", {
on_exit = function()
state.job = nil
end,
})
end
function M.toggle()
if is_valid_window(state.win) then
vim.api.nvim_win_close(state.win, false)
state.win = nil
return
end
open_side_window()
if is_valid_buffer(state.buf) then
vim.api.nvim_win_set_buf(state.win, state.buf)
else
start_terminal()
end
vim.cmd("startinsert")
end
function M.setup(opts)
opts = opts or {}
if opts.width ~= nil then
assert(
type(opts.width) == "number" and opts.width > 0 and opts.width <= 1,
"opencode.nvim: width must be a number between 0 and 1"
)
config.width = opts.width
resize_side_window()
end
vim.api.nvim_create_user_command("OpenCodeToggle", function()
M.toggle()
end, { force = true })
vim.api.nvim_create_autocmd("VimResized", {
group = vim.api.nvim_create_augroup("opencode_terminal_width", { clear = true }),
callback = resize_side_window,
})
end
return M