local M = {} local state = { buf = nil, win = nil, job = nil, } 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 open_side_window() vim.cmd("botright vertical 80new") 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() vim.api.nvim_create_user_command("OpenCodeToggle", function() M.toggle() end, {}) end return M