feat: initial implementation
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
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
|
||||
Reference in New Issue
Block a user