return { "pablopunk/pi.nvim", opts = {}, config = function(_, opts) require("pi").setup(opts) local state = { buf = nil, win = nil, } local function pane_width() return math.max(50, math.floor(vim.o.columns * 0.35)) end local function style_pane(win) if not win or not vim.api.nvim_win_is_valid(win) then return end pcall(vim.api.nvim_win_set_width, win, pane_width()) vim.wo[win].number = false vim.wo[win].relativenumber = false vim.wo[win].signcolumn = "no" vim.wo[win].winfixwidth = true end local function open_pi_pane() if state.win and vim.api.nvim_win_is_valid(state.win) then vim.api.nvim_set_current_win(state.win) vim.cmd("startinsert") return end vim.cmd("botright vsplit") state.win = vim.api.nvim_get_current_win() style_pane(state.win) if state.buf and vim.api.nvim_buf_is_valid(state.buf) then vim.api.nvim_win_set_buf(state.win, state.buf) else vim.cmd("terminal pi") state.buf = vim.api.nvim_get_current_buf() vim.bo[state.buf].buflisted = false vim.bo[state.buf].bufhidden = "hide" vim.api.nvim_create_autocmd({ "BufWipeout", "TermClose" }, { buffer = state.buf, callback = function() state.buf = nil state.win = nil end, }) end style_pane(state.win) vim.cmd("startinsert") end local function toggle_pi_pane() if state.win and vim.api.nvim_win_is_valid(state.win) then vim.api.nvim_win_close(state.win, true) state.win = nil return end open_pi_pane() end vim.api.nvim_create_user_command("PiPane", open_pi_pane, { desc = "Open pi in a right side pane" }) vim.api.nvim_create_user_command("PiPaneToggle", toggle_pi_pane, { desc = "Toggle pi right side pane" }) end, keys = { { "p", "PiAsk", desc = "Pi Ask" }, { "pp", "PiPaneToggle", desc = "Pi Pane" }, { "ps", "PiAskSelection", mode = "v", desc = "Pi Ask Selection" }, }, }