diff options
author | Gregory Anders <8965202+gpanders@users.noreply.github.com> | 2022-05-08 13:00:30 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-08 13:00:30 -0600 |
commit | 6cfb1d4c280a90bcce4e793f56d791b68c66c264 (patch) | |
tree | 6f7c6a611e8ee6cdedc5bdbad6aae202fb5e96d1 /runtime/lua/vim | |
parent | 0d3f17a6c317b26cdc319b48e25e1574f3a0e9fd (diff) | |
download | rneovim-6cfb1d4c280a90bcce4e793f56d791b68c66c264.tar.gz rneovim-6cfb1d4c280a90bcce4e793f56d791b68c66c264.tar.bz2 rneovim-6cfb1d4c280a90bcce4e793f56d791b68c66c264.zip |
fix(lsp): detach spawned LSP server processes (#18477)
LSP servers should be daemonized (detached) so that they run in a
separate process group from Neovim's. Among other things, this ensures
the process does not inherit Neovim's TTY (#18475).
Make this configurable so that clients can explicitly opt-out of
detaching from Nvim.
Diffstat (limited to 'runtime/lua/vim')
-rw-r--r-- | runtime/lua/vim/lsp.lua | 6 | ||||
-rw-r--r-- | runtime/lua/vim/lsp/rpc.lua | 4 |
2 files changed, 10 insertions, 0 deletions
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua index 00f1c26692..a541b63ee9 100644 --- a/runtime/lua/vim/lsp.lua +++ b/runtime/lua/vim/lsp.lua @@ -241,6 +241,7 @@ local function validate_client_config(config) capabilities = { config.capabilities, "t", true }; cmd_cwd = { config.cmd_cwd, optional_validator(is_dir), "directory" }; cmd_env = { config.cmd_env, "t", true }; + detached = { config.detached, "b", true }; name = { config.name, 's', true }; on_error = { config.on_error, "f", true }; on_exit = { config.on_exit, "f", true }; @@ -663,6 +664,10 @@ end --- { "PRODUCTION=true"; "TEST=123"; PORT = 8080; HOST = "0.0.0.0"; } --- </pre> --- +---@param detached: (boolean, default true) Daemonize the server process so that it runs in a +--- separate process group from Nvim. Nvim will shutdown the process on exit, but if Nvim fails to +--- exit cleanly this could leave behind orphaned server processes. +--- ---@param workspace_folders (table) List of workspace folders passed to the --- language server. For backwards compatibility rootUri and rootPath will be --- derived from the first workspace folder in this list. See `workspaceFolders` in @@ -859,6 +864,7 @@ function lsp.start_client(config) local rpc = lsp_rpc.start(cmd, cmd_args, dispatch, { cwd = config.cmd_cwd; env = config.cmd_env; + detached = config.detached; }) -- Return nil if client fails to start diff --git a/runtime/lua/vim/lsp/rpc.lua b/runtime/lua/vim/lsp/rpc.lua index 6d0a78fba8..be2cc58f07 100644 --- a/runtime/lua/vim/lsp/rpc.lua +++ b/runtime/lua/vim/lsp/rpc.lua @@ -319,10 +319,14 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params) local spawn_params = { args = cmd_args; stdio = {stdin, stdout, stderr}; + detached = true; } if extra_spawn_params then spawn_params.cwd = extra_spawn_params.cwd spawn_params.env = env_merge(extra_spawn_params.env) + if extra_spawn_params.detached ~= nil then + spawn_params.detached = extra_spawn_params.detached + end end handle, pid = uv.spawn(cmd, spawn_params, onexit) if handle == nil then |