213 lines
4.8 KiB
Lua
213 lines
4.8 KiB
Lua
CHAD = CHAD or {}
|
|
chad = chad or {}
|
|
|
|
local linesep = "\n"
|
|
local POLLING_RATE = 10
|
|
local is_win = vim.api.nvim_call_function("has", {"win32"}) == 1
|
|
|
|
local cwd = (function()
|
|
local source = debug.getinfo(2, "S").source
|
|
local file = string.match(source, "^@(.*)")
|
|
return vim.api.nvim_call_function("fnamemodify", {file, ":p:h:h"})
|
|
end)()
|
|
|
|
local function defer(timeout, callback)
|
|
local timer = vim.loop.new_timer()
|
|
timer:start(
|
|
timeout,
|
|
0,
|
|
function()
|
|
timer:stop()
|
|
timer:close()
|
|
vim.schedule(callback)
|
|
end
|
|
)
|
|
return timer
|
|
end
|
|
|
|
local settings = function()
|
|
local go, _settings = pcall(vim.api.nvim_get_var, "chadtree_settings")
|
|
local settings = go and _settings or {}
|
|
return settings
|
|
end
|
|
|
|
local job_id = nil
|
|
local err_exit = false
|
|
|
|
chad.on_exit = function(args)
|
|
local code = unpack(args)
|
|
if not (code == 0 or code == 143) then
|
|
err_exit = true
|
|
vim.api.nvim_err_writeln("CHADTree EXITED - " .. code)
|
|
else
|
|
err_exit = false
|
|
end
|
|
job_id = nil
|
|
end
|
|
|
|
chad.on_stdout = function(args)
|
|
local msg = unpack(args)
|
|
vim.api.nvim_out_write(table.concat(msg, linesep))
|
|
end
|
|
|
|
chad.on_stderr = function(args)
|
|
local msg = unpack(args)
|
|
if vim.api.nvim_call_function("has", {"nvim-0.5"}) == 1 then
|
|
vim.api.nvim_echo({{table.concat(msg, linesep), "ErrorMsg"}}, true, {})
|
|
else
|
|
vim.api.nvim_err_write(table.concat(msg, linesep))
|
|
end
|
|
end
|
|
|
|
local go, _py3 = pcall(vim.api.nvim_get_var, "python3_host_prog")
|
|
local py3 = go and _py3 or (is_win and "python.exe" or "python3")
|
|
local xdg_dir = vim.api.nvim_call_function("stdpath", {"data"})
|
|
|
|
local main = function(is_xdg)
|
|
local v_py =
|
|
cwd ..
|
|
(is_win and [[/.vars/runtime/Scripts/python.exe]] or
|
|
"/.vars/runtime/bin/python3")
|
|
|
|
if is_win then
|
|
local v_py_xdg = xdg_dir .. "/chadrt/Scripts/python"
|
|
local v_py = is_xdg and v_py_xdg or v_py
|
|
if vim.api.nvim_call_function("filereadable", {v_py}) == 1 then
|
|
return {v_py}
|
|
else
|
|
-- local win_proxy = cwd .. [[/win.cmd]]
|
|
return {py3}
|
|
end
|
|
else
|
|
local v_py_xdg = xdg_dir .. "/chadrt/bin/python3"
|
|
local v_py = is_xdg and v_py_xdg or v_py
|
|
if vim.api.nvim_call_function("filereadable", {v_py}) == 1 then
|
|
return {v_py}
|
|
else
|
|
return {py3}
|
|
end
|
|
end
|
|
end
|
|
|
|
local start = function(deps, ...)
|
|
local is_xdg = settings().xdg
|
|
local args =
|
|
vim.tbl_flatten {
|
|
deps and py3 or main(is_xdg),
|
|
{"-s", "-u", "-m", "chadtree"},
|
|
{...},
|
|
(is_xdg and {"--xdg", xdg_dir} or {})
|
|
}
|
|
local params = {
|
|
cwd = cwd,
|
|
env = {PYTHONSAFEPATH = "1", PYTHONPATH = cwd},
|
|
on_exit = "CHADon_exit",
|
|
on_stdout = (function()
|
|
if deps then
|
|
return nil
|
|
else
|
|
return "CHADon_stdout"
|
|
end
|
|
end)(),
|
|
on_stderr = (function()
|
|
if deps then
|
|
return nil
|
|
else
|
|
return "CHADon_stderr"
|
|
end
|
|
end)()
|
|
}
|
|
if deps then
|
|
vim.api.nvim_command [[new]]
|
|
vim.api.nvim_call_function("termopen", {args, params})
|
|
else
|
|
job_id = vim.api.nvim_call_function("jobstart", {args, params})
|
|
return job_id
|
|
end
|
|
end
|
|
|
|
chad.Deps = function()
|
|
start(true, "deps")
|
|
end
|
|
|
|
vim.api.nvim_command [[command! -nargs=0 CHADdeps lua chad.Deps()]]
|
|
|
|
local set_chad_call = function(cmd)
|
|
local t1 = 0
|
|
chad[cmd] = function(...)
|
|
local args = {...}
|
|
if t1 == 0 then
|
|
t1 = vim.loop.now()
|
|
end
|
|
|
|
if not job_id then
|
|
local srv = is_win and {"localhost:0"} or {}
|
|
local server = vim.api.nvim_call_function("serverstart", srv)
|
|
job_id =
|
|
start(
|
|
false,
|
|
"run",
|
|
"--ppid",
|
|
vim.api.nvim_call_function("getpid", {}),
|
|
"--socket",
|
|
server
|
|
)
|
|
end
|
|
|
|
if not err_exit and CHAD[cmd] then
|
|
CHAD[cmd](args)
|
|
local t2 = vim.loop.now()
|
|
if settings().profiling and t1 >= 0 then
|
|
print("Init " .. (t2 - t1) .. "ms")
|
|
end
|
|
t1 = -1
|
|
else
|
|
defer(
|
|
POLLING_RATE,
|
|
function()
|
|
if err_exit then
|
|
return
|
|
else
|
|
chad[cmd](unpack(args))
|
|
end
|
|
end
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
set_chad_call("Noop")
|
|
|
|
set_chad_call("Open")
|
|
vim.api.nvim_command [[command! -nargs=* CHADopen lua chad.Open(<f-args>)]]
|
|
|
|
set_chad_call("Help")
|
|
vim.api.nvim_command [[command! -nargs=* CHADhelp lua chad.Help(<f-args>)]]
|
|
|
|
set_chad_call("Restore")
|
|
vim.api.nvim_command [[command! -nargs=0 CHADrestore lua chad.Restore(<f-args>)]]
|
|
|
|
chad.lsp_ensure_capabilities = function(cfg)
|
|
local spec1 = {
|
|
capabilities = vim.lsp.protocol.make_client_capabilities()
|
|
}
|
|
local spec2 = {
|
|
capabilities = {
|
|
workspace = {
|
|
fileOperations = {
|
|
didCreate = true,
|
|
didRename = true,
|
|
didDelete = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
local maps = cfg.capabilities and {spec2} or {spec1, spec2}
|
|
local new =
|
|
vim.tbl_deep_extend("force", cfg or vim.empty_dict(), unpack(maps))
|
|
return new
|
|
end
|
|
|
|
chad.Noop()
|
|
return chad
|