-- nvim/.config/nvim/lua/util/root.lua
-- Detect project root by LSP workspace, then root markers, then cwd.
local M = {}
local MARKERS = {
".git", "Cargo.toml", "go.mod", "pyproject.toml",
"package.json", "Makefile", "flake.nix", ".hg",
}
---@param bufnr integer|nil
function M.get(bufnr)
bufnr = bufnr or 0
local path = vim.api.nvim_buf_get_name(bufnr)
if path == "" then return vim.uv.cwd() end
path = vim.fs.normalize(path)
-- 1) LSP workspace folders
for _, c in ipairs(vim.lsp.get_clients({ bufnr = bufnr })) do
local wfs = c.workspace_folders or {}
for _, w in ipairs(wfs) do
local wpath = vim.uri_to_fname(w.uri)
if path:sub(1, #wpath) == wpath then return wpath end
end
end
-- 2) Walk up for a known marker
local found = vim.fs.find(MARKERS, { upward = true, path = vim.fs.dirname(path) })[1]
if found then return vim.fs.dirname(found) end
-- 3) Fallback: cwd
return vim.uv.cwd()
end
function M.cd()
local r = M.get()
vim.cmd.lcd(r)
vim.notify("lcd " .. r, vim.log.levels.INFO)
end
return M