diff options
| author | Lewis Russell <lewis6991@gmail.com> | 2023-08-22 14:21:06 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-22 14:21:06 +0100 |
| commit | 93c6826b16217eaef568ca5c224ea5d0c12bbb82 (patch) | |
| tree | a07ad86c520b63ab7843a28bb48a6b786fe1c1f7 /lua/lspconfig/async.lua | |
| parent | fix(rust_analyzer): use attached buffer client send request (#2738) (diff) | |
| parent | refactor: move async_run_command() (diff) | |
| download | nvim-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.lua | 58 |
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 |
