aboutsummaryrefslogtreecommitdiffstats
path: root/lua/lspconfig/async.lua
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2023-08-22 14:21:06 +0100
committerGitHub <noreply@github.com>2023-08-22 14:21:06 +0100
commit93c6826b16217eaef568ca5c224ea5d0c12bbb82 (patch)
treea07ad86c520b63ab7843a28bb48a6b786fe1c1f7 /lua/lspconfig/async.lua
parentfix(rust_analyzer): use attached buffer client send request (#2738) (diff)
parentrefactor: move async_run_command() (diff)
downloadnvim-lspconfig-93c6826b16217eaef568ca5c224ea5d0c12bbb82.tar
nvim-lspconfig-93c6826b16217eaef568ca5c224ea5d0c12bbb82.tar.gz
nvim-lspconfig-93c6826b16217eaef568ca5c224ea5d0c12bbb82.tar.bz2
nvim-lspconfig-93c6826b16217eaef568ca5c224ea5d0c12bbb82.tar.lz
nvim-lspconfig-93c6826b16217eaef568ca5c224ea5d0c12bbb82.tar.xz
nvim-lspconfig-93c6826b16217eaef568ca5c224ea5d0c12bbb82.tar.zst
nvim-lspconfig-93c6826b16217eaef568ca5c224ea5d0c12bbb82.zip
Merge pull request #2775 from lewis6991/refactor/manager
refactor: move manager to separate module
Diffstat (limited to 'lua/lspconfig/async.lua')
-rw-r--r--lua/lspconfig/async.lua58
1 files changed, 58 insertions, 0 deletions
diff --git a/lua/lspconfig/async.lua b/lua/lspconfig/async.lua
new file mode 100644
index 00000000..3421ccc5
--- /dev/null
+++ b/lua/lspconfig/async.lua
@@ -0,0 +1,58 @@
+local M = {}
+
+function M.run(func)
+ coroutine.resume(coroutine.create(function()
+ local status, err = pcall(func)
+ if not status then
+ vim.notify(('[lspconfig] unhandled error: %s'):format(tostring(err)), vim.log.levels.WARN)
+ end
+ end))
+end
+
+--- @param cmd string|string[]
+--- @return string[]?
+function M.run_command(cmd)
+ local co = assert(coroutine.running())
+
+ local stdout = {}
+ local stderr = {}
+ local jobid = vim.fn.jobstart(cmd, {
+ on_stdout = function(_, data, _)
+ data = table.concat(data, '\n')
+ if #data > 0 then
+ stdout[#stdout + 1] = data
+ end
+ end,
+ on_stderr = function(_, data, _)
+ stderr[#stderr + 1] = table.concat(data, '\n')
+ end,
+ on_exit = function()
+ coroutine.resume(co)
+ end,
+ stdout_buffered = true,
+ stderr_buffered = true,
+ })
+
+ if jobid <= 0 then
+ vim.notify(('[lspconfig] cmd go failed:\n%s'):format(table.concat(stderr, '')), vim.log.levels.WARN)
+ return
+ end
+
+ coroutine.yield()
+ if next(stdout) == nil then
+ return nil
+ end
+ return stdout and stdout or nil
+end
+
+function M.reenter()
+ if vim.in_fast_event() then
+ local co = assert(coroutine.running())
+ vim.schedule(function()
+ coroutine.resume(co)
+ end)
+ coroutine.yield()
+ end
+end
+
+return M