feat: automatically set root directory based on heuristics

This commit is contained in:
Youwen Wu 2024-09-18 18:38:27 -07:00
parent 6ab1d3adfb
commit cb70a0c30a
Signed by: youwen5
GPG key ID: 865658ED1FE61EC3

View file

@ -62,5 +62,37 @@
pattern = "LspProgressStatusUpdated",
callback = require("lualine").refresh,
})
-- Array of file names indicating root directory. Modify to your liking.
local root_names = { '.git', 'Makefile', '.svn', '.hg' }
-- Cache to use for speed up (at cost of possibly outdated results)
local root_cache = {}
local set_root = function()
-- Get directory path to start search from
local path = vim.api.nvim_buf_get_name(0)
if path == "" then return end
path = vim.fs.dirname(path)
-- Try cache and resort to searching upward for root directory
local root = root_cache[path]
if root == nil then
local root_file = vim.fs.find(root_names, { path = path, upward = true })[1]
if root_file == nil then return end
root = vim.fs.dirname(root_file)
root_cache[path] = root
end
-- Set current directory
vim.fn.chdir(root)
-- Run direnv
vim.cmd "DirenvExport"
vim.cmd "LspRestart"
end
local root_augroup = vim.api.nvim_create_augroup('MyAutoRoot', {})
vim.api.nvim_create_autocmd('BufEnter', { group = root_augroup, callback = set_root })
'';
}