---@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 = {} ---@param shell? string function M.setup(shell) vim.o.shell = shell or vim.o.shell -- Special handling for pwsh if shell == "pwsh" or shell == "powershell" then -- Check if 'pwsh' is executable and set the shell accordingly if vim.fn.executable("pwsh") == 1 then vim.o.shell = "pwsh" elseif vim.fn.executable("powershell") == 1 then vim.o.shell = "powershell" else return LazyVim.error("No powershell executable found") end -- Setting shell command flags vim.o.shellcmdflag = "-NoLogo -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.UTF8Encoding]::new();$PSDefaultParameterValues['Out-File:Encoding']='utf8';" -- Setting shell redirection vim.o.shellredir = '2>&1 | %{ "$_" } | Out-File %s; exit $LastExitCode' -- Setting shell pipe vim.o.shellpipe = '2>&1 | %{ "$_" } | Tee-Object %s; exit $LastExitCode' -- Setting shell quote options vim.o.shellquote = "" vim.o.shellxquote = "" end end ---@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 }, backdrop = LazyVim.has("edgy.nvim") and not cmd and 100 or nil, }, 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.keymap.set("n", "gf", function() local f = vim.fn.findfile(vim.fn.expand("")) if f ~= "" then vim.cmd("close") vim.cmd("e " .. f) end end, { buffer = buf }) vim.api.nvim_create_autocmd("BufEnter", { buffer = buf, callback = function() vim.cmd.startinsert() end, }) end return terminals[termkey] end return M