aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/lsp.txt9
-rw-r--r--runtime/lua/vim/lsp.lua11
-rw-r--r--test/functional/plugin/lsp_spec.lua3
3 files changed, 13 insertions, 10 deletions
diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt
index 4c3fdcee6a..fd0df42fe4 100644
--- a/runtime/doc/lsp.txt
+++ b/runtime/doc/lsp.txt
@@ -678,10 +678,11 @@ Lua module: vim.lsp *lsp-core*
the LSP server will base its workspaceFolders,
rootUri, and rootPath on initialization. Unused if
`root_dir` is provided.
- • {root_dir}? (`string|fun(cb:fun(string))`) Directory where the
- LSP server will base its workspaceFolders, rootUri,
- and rootPath on initialization. If a function, it
- accepts a single callback argument which must be
+ • {root_dir}? (`string|fun(bufnr: integer, cb:fun(root_dir?:string))`)
+ Directory where the LSP server will base its
+ workspaceFolders, rootUri, and rootPath on
+ initialization. If a function, it is passed the
+ buffer number and a callback argument which must be
called with the value of root_dir to use. The LSP
server will not be started until the callback is
called.
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua
index 83624234bc..91f2895f04 100644
--- a/runtime/lua/vim/lsp.lua
+++ b/runtime/lua/vim/lsp.lua
@@ -285,10 +285,11 @@ end
--- rootUri, and rootPath on initialization. Unused if `root_dir` is provided.
--- @field root_markers? string[]
---
---- Directory where the LSP server will base its workspaceFolders, rootUri, and rootPath on
---- initialization. If a function, it accepts a single callback argument which must be called with
---- the value of root_dir to use. The LSP server will not be started until the callback is called.
---- @field root_dir? string|fun(cb:fun(string))
+--- Directory where the LSP server will base its workspaceFolders, rootUri, and
+--- rootPath on initialization. If a function, it is passed the buffer number
+--- and a callback argument which must be called with the value of root_dir to
+--- use. The LSP server will not be started until the callback is called.
+--- @field root_dir? string|fun(bufnr: integer, cb:fun(root_dir?:string))
---
--- Predicate used to decide if a client should be re-used. Used on all
--- running clients. The default implementation re-uses a client if name and
@@ -462,7 +463,7 @@ local function lsp_enable_callback(bufnr)
if type(config.root_dir) == 'function' then
---@param root_dir string
- config.root_dir(function(root_dir)
+ config.root_dir(bufnr, function(root_dir)
config.root_dir = root_dir
vim.schedule(function()
start(config)
diff --git a/test/functional/plugin/lsp_spec.lua b/test/functional/plugin/lsp_spec.lua
index 22c9e4658f..f402ac7e8c 100644
--- a/test/functional/plugin/lsp_spec.lua
+++ b/test/functional/plugin/lsp_spec.lua
@@ -6348,7 +6348,8 @@ describe('LSP', function()
vim.lsp.config('foo', {
cmd = server.cmd,
filetypes = { 'foo' },
- root_dir = function(cb)
+ root_dir = function(bufnr, cb)
+ assert(tmp1 == vim.api.nvim_buf_get_name(bufnr))
vim.system({ 'sleep', '0' }, {}, function()
cb('some_dir')
end)