-- ------------------------------------------------------------ -- TERMINAL SYSTEM -- ------------------------------------------------------------ local term_buf = nil local function open_term_split() vim.cmd("botright vsplit") local win = vim.api.nvim_get_current_win() if term_buf and vim.api.nvim_buf_is_valid(term_buf) then vim.api.nvim_win_set_buf(win, term_buf) else vim.cmd("terminal") term_buf = vim.api.nvim_get_current_buf() end vim.api.nvim_win_set_width(win, math.floor(vim.o.columns * 0.37)) vim.cmd("startinsert") end local function toggle_term() for _, win in ipairs(vim.api.nvim_list_wins()) do if vim.api.nvim_win_get_buf(win) == term_buf then vim.api.nvim_win_close(win, false) return end end open_term_split() end local function open_term_fullscreen() if term_buf and vim.api.nvim_buf_is_valid(term_buf) then vim.api.nvim_set_current_buf(term_buf) else vim.cmd("terminal") term_buf = vim.api.nvim_get_current_buf() end vim.cmd("startinsert") end local function prev_non_term_buf() local current = vim.api.nvim_get_current_buf() local buffers = vim.fn.getbufinfo({ buflisted = 1 }) local candidates = {} for _, buffer in ipairs(buffers) do if buffer.bufnr ~= current and vim.bo[buffer.bufnr].buftype ~= "terminal" then table.insert(candidates, buffer) end end if #candidates == 0 then print("No previous non-terminal buffer") return end table.sort(candidates, function(a, b) return a.lastused > b.lastused end) vim.api.nvim_set_current_buf(candidates[1].bufnr) end function send(command) local terminal_visible = false for _, win in ipairs(vim.api.nvim_list_wins()) do if term_buf and vim.api.nvim_win_get_buf(win) == term_buf then terminal_visible = true break end end if not terminal_visible then open_term_split() end local job = vim.b[term_buf].terminal_job_id if job then vim.api.nvim_chan_send(job, command .. "\n") end end map("n", "", toggle_term, { desc = "Toggle terminal split", }) map("n", "", open_term_fullscreen, { desc = "Open terminal fullscreen", }) map("t", "", toggle_term, { desc = "Toggle terminal split", }) map("t", "", prev_non_term_buf, { desc = "Return to previous buffer", })