Files
dotfiles/nvim/.config/nvim/plugin/auto_select_compiler.lua
T

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,
})