em, fix rooter structure a bit :doge:

This commit is contained in:
Thomas Ruoff
2025-06-04 08:37:21 +02:00
parent 0b6a27fff7
commit db4f67303a
3 changed files with 15 additions and 6 deletions

View File

@@ -0,0 +1,99 @@
local log_level = vim.log.levels.WARN
local function log(msg, level)
if level == vim.log.levels.ERROR then
vim.notify(msg, level)
else
print(msg)
end
end
local function get_root()
local clients = vim.lsp.get_clients { bufnr = 0 }
if #clients == 0 then return vim.fs.root(0, { '.git' }) end
-- Define priority order (higher priority first)
local priority_order = {
'vtsls',
'eslint', -- formatting/linting servers last
}
-- Find highest priority client
for _, priority_name in ipairs(priority_order) do
for _, client in ipairs(clients) do
if client.name == priority_name then return client.config.root_dir end
end
end
-- Fallback to first client with a root_dir
for _, client in ipairs(clients) do
if client.config.root_dir then return client.config.root_dir end
end
local git_root = vim.fs.root(0, { '.git' })
if git_root then return git_root end
log 'No LSP client found with root_dir'
end
local function debounce(fn, ms)
local timer = nil
return function(...)
local args = { ... }
if timer then
timer:stop()
timer:close()
end
timer = vim.uv.new_timer()
timer:start(ms, 0, function()
vim.schedule(function() fn(unpack(args)) end)
timer:close()
timer = nil
end)
end
end
local function on_lsp_attach()
local root = get_root()
if root then
vim.notify('root_dir detected: ' .. root, log_level)
vim.cmd('lcd ' .. root)
else
vim.notify('No project root found', log_level)
end
end
local debounced_on_attacched = debounce(function()
on_lsp_attach()
vim.notify 'on_attach_done'
end, 1000)
local M = {}
-- Plugin configuration
M.config = {
greeting = 'Hello from rooter!',
some = 'option',
}
-- Main plugin function
function M.setup(opts)
M.config = vim.tbl_deep_extend('force', M.config, opts or {})
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('tomru/rooter', { clear = true }),
callback = debounced_on_attacched,
})
end
function M.run()
local root = get_root()
if root then
vim.cmd('lcd ' .. root)
log('Changed working directory to: ' .. root, log_level)
else
log('No project root found', log_level)
end
end
return M

View File

@@ -0,0 +1,3 @@
vim.api.nvim_create_user_command('Rooter', function() require('rooter').run() end, {
desc = 'Change working directory to the project root',
})