---@class lazyvim.util.terminal ---@overload fun(cmd: string|string[], opts: LazyTermOpts): LazyFloat local M = setmetatable({}, { __call = function(m, ...) return m.open(...) end, }) ---@type table local terminals = {} ---@class LazyTermOpts: LazyCmdOptions ---@field interactive? boolean ---@field esc_esc? boolean ---@field ctrl_hjkl? boolean -- Opens a floating terminal (interactive by default) ---@param cmd? string[]|string ---@param opts? LazyTermOpts function M.open(cmd, opts) opts = vim.tbl_deep_extend("force", { ft = "lazyterm", size = { width = 0.9, height = 0.9 }, }, opts or {}, { persistent = true }) --[[@as LazyTermOpts]] local termkey = vim.inspect({ cmd = cmd or "shell", cwd = opts.cwd, env = opts.env, count = vim.v.count1 }) if terminals[termkey] and terminals[termkey]:buf_valid() then terminals[termkey]:toggle() else terminals[termkey] = require("lazy.util").float_term(cmd, opts) local buf = terminals[termkey].buf vim.b[buf].lazyterm_cmd = cmd if opts.esc_esc == false then vim.keymap.set("t", "", "", { buffer = buf, nowait = true }) end if opts.ctrl_hjkl == false then vim.keymap.set("t", "", "", { buffer = buf, nowait = true }) vim.keymap.set("t", "", "", { buffer = buf, nowait = true }) vim.keymap.set("t", "", "", { buffer = buf, nowait = true }) vim.keymap.set("t", "", "", { buffer = buf, nowait = true }) end vim.api.nvim_create_autocmd("BufEnter", { buffer = buf, callback = function() vim.cmd.startinsert() end, }) end return terminals[termkey] end return M