73 lines
1.8 KiB
Lua
73 lines
1.8 KiB
Lua
local compiler_mapping = {
|
|
dotnet={'*.csproj', '*.sln'},
|
|
go={'go.mod'},
|
|
gcc={'*.c'},
|
|
['g++']={'*.cpp'},
|
|
cargo={'Cargo.toml'},
|
|
zig={'*.zig'},
|
|
basedpyright={'requirements.txt', 'pyproject.toml', '.venv', '*.py'},
|
|
}
|
|
|
|
---@param dir string?
|
|
---@param glob_pattern string
|
|
---@return boolean
|
|
local function file_or_folder_exists(dir, glob_pattern)
|
|
if dir == nil then return false end
|
|
return vim.fn.globpath(dir, glob_pattern, false, false, false) ~= ''
|
|
end
|
|
|
|
local all_folders_till_root = function()
|
|
local cwd = vim.fn.getcwd()
|
|
local folders = {cwd} -- array of all folders from cwd to root
|
|
for dir in vim.fs.parents(cwd) do
|
|
table.insert(folders, dir)
|
|
end
|
|
|
|
---@param _ any
|
|
---@param i integer
|
|
---@return integer?
|
|
---@return string?
|
|
local function iter(_, i)
|
|
if file_or_folder_exists(folders[i], '.git') then
|
|
return nil
|
|
end
|
|
i = i + 1
|
|
local f = folders[i]
|
|
if f == nil then
|
|
return nil
|
|
end
|
|
return i, f
|
|
end
|
|
|
|
return iter, nil, 0
|
|
end
|
|
|
|
---@param glob_pattern string
|
|
---@return boolean
|
|
local function look_for_file(glob_pattern)
|
|
for _, dir in all_folders_till_root() do
|
|
if file_or_folder_exists(dir, glob_pattern) then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function auto_select_compiler()
|
|
for compiler, glob_patterns in pairs(compiler_mapping) do
|
|
for _, glob_pattern in ipairs(glob_patterns) do
|
|
if look_for_file(glob_pattern) then
|
|
vim.cmd('compiler! '..compiler)
|
|
end
|
|
end
|
|
end
|
|
if look_for_file('justfile') then
|
|
vim.go.makeprg = 'just'
|
|
end
|
|
end
|
|
|
|
auto_select_compiler()
|
|
vim.api.nvim_create_autocmd('DirChanged', {
|
|
callback = auto_select_compiler,
|
|
})
|