aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/lspconfig.txt3
-rw-r--r--lua/lspconfig/util.lua19
-rw-r--r--test/lspconfig_spec.lua2
3 files changed, 14 insertions, 10 deletions
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,19 +250,22 @@ end
function M.root_pattern(...)
local patterns = vim.tbl_flatten { ... }
- local function matcher(path)
+ return function(startpath)
+ startpath = M.strip_archive_subpath(startpath)
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
+ 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
- return function(startpath)
- startpath = M.strip_archive_subpath(startpath)
- return M.search_ancestors(startpath, matcher)
- end
end
function M.find_git_ancestor(startpath)
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()