aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2025-03-08 09:30:36 +0000
committerLewis Russell <me@lewisr.dev>2025-03-10 18:54:03 +0000
commitdebabaf884fc26e9dc257aa5b62581d3846f80f1 (patch)
treef2c31107a9615fa4167a0d2b806dda847286ff6a
parent3b0fe2659e74276e995655d1f8954b48005292e6 (diff)
downloadrneovim-debabaf884fc26e9dc257aa5b62581d3846f80f1.tar.gz
rneovim-debabaf884fc26e9dc257aa5b62581d3846f80f1.tar.bz2
rneovim-debabaf884fc26e9dc257aa5b62581d3846f80f1.zip
fix(lsp)!: pass buffer number to root_dir function
Problem: The root dir function is not passed any context and can only assume the current buffer is the one being attached. The main use case is for getting the path of the buffer using `nvim_buf_get_name`. Solution: Pass the buffer number as the first argument.
-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)