mirror of https://github.com/folke/neoconf.nvim
59 lines
1.5 KiB
Lua
59 lines
1.5 KiB
Lua
local Settings = require("neoconf.settings")
|
|
local Util = require("neoconf.util")
|
|
|
|
local M = {}
|
|
|
|
---@class WorkspaceFindOptions
|
|
---@field file? string
|
|
---@field buffer? buffer
|
|
---@field lsp? boolean
|
|
|
|
---@param opts WorkspaceFindOptions
|
|
function M.find_root(opts)
|
|
opts = opts or {}
|
|
|
|
local buf = opts.buffer ~= 0 and opts.buffer or vim.api.nvim_get_current_buf()
|
|
local fname = Util.fqn(opts.file or vim.api.nvim_buf_get_name(buf))
|
|
|
|
-- find the root dir that contains a local settings file
|
|
local root_dir = Util.root_pattern(unpack(Util.file_patterns({ global = false })))(fname)
|
|
|
|
-- fallback to lsp root_dir detection if in options
|
|
if not root_dir and opts.lsp then
|
|
for _, client in ipairs(vim.lsp.get_clients({ bufnr = buf })) do
|
|
root_dir = client.config.root_dir
|
|
break
|
|
end
|
|
end
|
|
|
|
-- fallback to git ancestor or cwd
|
|
return root_dir or Util.find_git_ancestor(fname) or vim.fn.getcwd()
|
|
end
|
|
|
|
---@class WorkspaceOptions: WorkspaceFindOptions
|
|
---@field local? boolean defaults to true
|
|
---@field global? boolean defaults to true
|
|
|
|
---@param opts WorkspaceOptions|nil
|
|
---@return { root_dir: string, settings: Settings }
|
|
function M.get(opts)
|
|
opts = Util.merge({
|
|
["local"] = true,
|
|
global = true,
|
|
}, opts)
|
|
|
|
local ret = Settings.new()
|
|
if opts.global then
|
|
ret:merge(Settings.get_global())
|
|
end
|
|
|
|
local root_dir = M.find_root(opts)
|
|
if root_dir and opts["local"] then
|
|
ret:merge(Settings.get_local(root_dir))
|
|
end
|
|
|
|
return { root_dir = root_dir, settings = ret }
|
|
end
|
|
|
|
return M
|