diff --git a/lua/plugins/config/lsp/servers.lua b/lua/plugins/config/lsp/servers.lua index a38951e5..66158188 100644 --- a/lua/plugins/config/lsp/servers.lua +++ b/lua/plugins/config/lsp/servers.lua @@ -3,21 +3,44 @@ local M = {} local util = require 'lspconfig.util' +-- Get clang-wrapper resource-root for Nix environments +local function get_clang_resource_dir() + -- Try to find clang-wrapper's resource-root + local handle = io.popen('ls -d /nix/store/*clang-wrapper*/resource-root 2>/dev/null | head -1') + if handle then + local resource_root = handle:read('*l') + handle:close() + if resource_root and resource_root ~= '' then + return resource_root + end + end + return nil -- Let clangd use its default +end + function M.get_servers() + -- Build clangd command + local clangd_cmd = { + 'clangd', + '--query-driver=/nix/store/*/bin/clang*', + '--background-index', + '--clang-tidy', + '--enable-config', + '--fallback-style=llvm', + '--function-arg-placeholders', + '--header-insertion-decorators', + '--header-insertion=iwyu', + } + + -- Add resource-dir if in Nix environment + local resource_dir = get_clang_resource_dir() + if resource_dir then + table.insert(clangd_cmd, '--resource-dir=' .. resource_dir) + end + return { -- C/C++ Language Server clangd = { - cmd = { - 'clangd', - '--query-driver=/nix/store/*/bin/clang*', - '--background-index', - '--clang-tidy', - '--enable-config', - '--fallback-style=llvm', - '--function-arg-placeholders', - '--header-insertion-decorators', - '--header-insertion=iwyu', - }, + cmd = clangd_cmd, filetypes = { 'c', 'cpp', 'objc', 'objcpp', 'cuda' }, -- Look for project markers - clangd will find compile_commands.json itself root_dir = util.root_pattern(