
## What is this PR for? fix(util.terminal) recorrect the shellredir and shellpip options for powershell. <!-- Describe the big picture of your changes to communicate to the maintainers why we should accept this pull request. --> ## Does this PR fix an existing issue? <!-- If this PR fixes any issues, please link to the issue here. Fixes #<issue_number> --> ## Checklist - [ ] I've read the [CONTRIBUTING](https://github.com/LazyVim/LazyVim/blob/main/CONTRIBUTING.md) guidelines. --------- Co-authored-by: Folke Lemaitre <folke.lemaitre@gmail.com>
96 lines
3.0 KiB
Lua
96 lines
3.0 KiB
Lua
---@class lazyvim.util.terminal
|
|
---@overload fun(cmd: string|string[], opts: LazyTermOpts): LazyFloat
|
|
local M = setmetatable({}, {
|
|
__call = function(m, ...)
|
|
return m.open(...)
|
|
end,
|
|
})
|
|
|
|
---@type table<string,LazyFloat>
|
|
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", "<esc>", "<esc>", { buffer = buf, nowait = true })
|
|
end
|
|
if opts.ctrl_hjkl == false then
|
|
vim.keymap.set("t", "<c-h>", "<c-h>", { buffer = buf, nowait = true })
|
|
vim.keymap.set("t", "<c-j>", "<c-j>", { buffer = buf, nowait = true })
|
|
vim.keymap.set("t", "<c-k>", "<c-k>", { buffer = buf, nowait = true })
|
|
vim.keymap.set("t", "<c-l>", "<c-l>", { buffer = buf, nowait = true })
|
|
end
|
|
|
|
vim.keymap.set("n", "gf", function()
|
|
local f = vim.fn.findfile(vim.fn.expand("<cfile>"))
|
|
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
|