diff --git a/doc/lspconfig.txt b/doc/lspconfig.txt index 5a1da207..4a5cce19 100644 --- a/doc/lspconfig.txt +++ b/doc/lspconfig.txt @@ -371,7 +371,8 @@ below returns a function that takes as its argument the current buffer path. - `util.root_pattern`: function which takes multiple arguments, each corresponding to a different root pattern against which the contents of the current directory are matched using |vim.fn.glob()| while traversing up the - filesystem. + filesystem. Parent directories are traversed once per pattern, in the order + the patterns are specified. > root_dir = util.root_pattern('pyproject.toml', 'requirements.txt') < diff --git a/lua/lspconfig/util.lua b/lua/lspconfig/util.lua index 364bf9a8..176365d1 100644 --- a/lua/lspconfig/util.lua +++ b/lua/lspconfig/util.lua @@ -250,18 +250,21 @@ end function M.root_pattern(...) local patterns = vim.tbl_flatten { ... } - local function matcher(path) - for _, pattern in ipairs(patterns) do - for _, p in ipairs(vim.fn.glob(M.path.join(M.path.escape_wildcards(path), pattern), true, true)) do - if M.path.exists(p) then - return path - end - end - end - end return function(startpath) startpath = M.strip_archive_subpath(startpath) - return M.search_ancestors(startpath, matcher) + for _, pattern in ipairs(patterns) do + local match = M.search_ancestors(startpath, function(path) + for _, p in ipairs(vim.fn.glob(M.path.join(M.path.escape_wildcards(path), pattern), true, true)) do + if M.path.exists(p) then + return path + end + end + end) + + if match ~= nil then + return match + end + end end end diff --git a/test/lspconfig_spec.lua b/test/lspconfig_spec.lua index aab4f4ba..36eca3bc 100644 --- a/test/lspconfig_spec.lua +++ b/test/lspconfig_spec.lua @@ -136,7 +136,7 @@ describe('lspconfig', function() -- change the working directory to test directory vim.api.nvim_command 'cd ./test/test_dir/a' local cwd = vim.fn.getcwd() - eq(true, cwd == lspconfig.util.root_pattern { 'root_marker.txt', 'a_marker.txt' }(cwd)) + eq(true, cwd == lspconfig.util.root_pattern { 'a_marker.txt', 'root_marker.txt' }(cwd)) end) it('resolves to root_marker.txt', function()