diff --git a/lua/jamjar/terminal.lua b/lua/jamjar/terminal.lua index 573658c..aa66970 100644 --- a/lua/jamjar/terminal.lua +++ b/lua/jamjar/terminal.lua @@ -47,6 +47,16 @@ function Terminal:new(opts) return setmetatable(vim.tbl_extend("force", get_defaultopts(), opts or {}), self) end +function Terminal:isbufvalid() + return self.buf and vim.api.nvim_buf_is_valid(self.buf) +end + +function Terminal:ensurebuf() + if not self:isbufvalid() then + self:init() + end +end + function Terminal:init() self.buf = vim.api.nvim_create_buf(true, true) vim.api.nvim_set_option_value("buftype", "nofile", { buf = self.buf }) @@ -62,8 +72,14 @@ function Terminal:init() end) end +function Terminal:iswinvalid() + return self.win and vim.api.nvim_win_is_valid(self.win) +end + function Terminal:toggle() - if not self.win then + self:ensurebuf() + + if not self:iswinvalid() then self:open() return end @@ -79,11 +95,9 @@ function Terminal:toggle() end function Terminal:open() - if not self.win then - if not self.buf then - self:init() - end - self.win = vim.api.nvim_open_win(self.buf, true, self.winoptsfn and self.winoptsfn() or get_winopts()) + if not self:iswinvalid() then + self:ensurebuf() + self.win = vim.api.nvim_open_win(self.buf, true, vim.F.if_nil(self.winoptsfn, get_winopts)()) vim.api.nvim_set_option_value("signcolumn", "no", { win = self.win }) vim.api.nvim_set_option_value("foldcolumn", "0", { win = self.win }) self.on_open(self) @@ -96,27 +110,32 @@ function Terminal:open() end function Terminal:close() - if self.win then - vim.api.nvim_win_set_config(self.win, { - hide = true, - }) - if vim.api.nvim_get_current_win() == self.win then - vim.cmd.wincmd("p") - end + if not self:iswinvalid() then + return + end + + vim.api.nvim_win_set_config(self.win, { + hide = true, + }) + + if vim.api.nvim_get_current_win() == self.win then + vim.cmd.wincmd("p") end end function Terminal:quit() - if self.win then - vim.api.nvim_win_close(self.win, true) - self.win = nil + if not self:iswinvalid() then + return end + + vim.api.nvim_win_close(self.win, true) + self.win = nil end function Terminal:delete() self:quit() - if self.buf and vim.api.nvim_buf_is_valid(self.buf) then + if self:isbufvalid() then vim.bo[self.buf].buflisted = false vim.api.nvim_buf_delete(self.buf, { unload = true }) self.buf = nil