diff --git a/lua/lazyvim/config/options.lua b/lua/lazyvim/config/options.lua index 630fce42..5a071a15 100644 --- a/lua/lazyvim/config/options.lua +++ b/lua/lazyvim/config/options.lua @@ -6,7 +6,10 @@ vim.g.maplocalleader = "\\" vim.g.autoformat = true -- LazyVim root dir detection --- Each entry can be a detector function like `lsp` or `cwd`, or a pattern like `.git` or `lua`. +-- Each entry can be: +-- * the name of a detector function like `lsp` or `cwd` +-- * a pattern or array of patterns like `.git` or `lua`. +-- * a function with signature `function(buf) -> string|string[]` vim.g.root_spec = { "lsp", { ".git", "lua" }, "cwd" } local opt = vim.opt diff --git a/lua/lazyvim/util/root.lua b/lua/lazyvim/util/root.lua index c97ecf88..fe263a7c 100644 --- a/lua/lazyvim/util/root.lua +++ b/lua/lazyvim/util/root.lua @@ -12,7 +12,9 @@ local M = setmetatable({}, { ---@field paths string[] ---@field spec LazyRootSpec ----@alias LazyRootSpec string|string[] +---@alias LazyRootFn fun(buf: number): (string|string[]) + +---@alias LazyRootSpec string|string[]|LazyRootFn ---@type LazyRootSpec[] M.spec = { "lsp", { ".git", "lua" }, "cwd" } @@ -60,6 +62,19 @@ function M.realpath(path) return Util.norm(path) end +---@param spec LazyRootSpec +---@return LazyRootFn +function M.resolve(spec) + if M.detectors[spec] then + return M.detectors[spec] + elseif type(spec) == "function" then + return spec + end + return function(buf) + return M.detectors.pattern(buf, spec) + end +end + ---@param opts? { buf?: number, spec?: LazyRootSpec[], all?: boolean } function M.detect(opts) opts = opts or {} @@ -68,7 +83,9 @@ function M.detect(opts) local ret = {} ---@type LazyRoot[] for _, spec in ipairs(opts.spec) do - local paths = M.detectors[spec] and M.detectors[spec](opts.buf) or M.detectors.pattern(opts.buf, spec) + local paths = M.resolve(spec)(opts.buf) + paths = paths or {} + paths = type(paths) == "table" and paths or { paths } local roots = {} ---@type string[] for _, p in ipairs(paths) do local pp = M.realpath(p)