neoconf.nvim/lua/neoconf/workspace.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