canola.nvim/lua/oil/shell.lua
2024-11-25 09:10:33 -08:00

48 lines
1.2 KiB
Lua

local M = {}
M.run = function(cmd, opts, callback)
if not callback then
callback = opts
opts = {}
end
local stdout
local stderr = {}
local jid = vim.fn.jobstart(
cmd,
vim.tbl_deep_extend("keep", opts, {
stdout_buffered = true,
stderr_buffered = true,
on_stdout = function(j, output)
stdout = output
end,
on_stderr = function(j, output)
stderr = output
end,
on_exit = vim.schedule_wrap(function(j, code)
if code == 0 then
callback(nil, stdout)
else
local err = table.concat(stderr, "\n")
if err == "" then
err = "Unknown error"
end
local cmd_str = type(cmd) == "string" and cmd or table.concat(cmd, " ")
callback(string.format("Error running command '%s'\n%s", cmd_str, err))
end
end),
})
)
local exe
if type(cmd) == "string" then
exe = vim.split(cmd, "%s+")[1]
else
exe = cmd[1]
end
if jid == 0 then
callback(string.format("Passed invalid arguments to '%s'", exe))
elseif jid == -1 then
callback(string.format("'%s' is not executable", exe))
end
end
return M