Clangd服务无法搜索Neovim当前工作目录符号,仅检索已打开缓冲区
解决clangd仅检索Neovim已打开缓冲区符号的问题
clangd无法索引整个工作目录符号,核心原因有两个:缺少编译数据库,以及root_dir配置错误。以下是具体修复步骤:
1. 生成项目编译数据库
clangd依赖compile_commands.json来获取项目的编译信息,从而索引所有源码文件。不同构建工具的生成方式:
- CMake:在cmake配置时添加参数:
构建完成后,把build目录里的cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ONcompile_commands.json软链到项目根目录:ln -s build/compile_commands.json . - Makefile:使用
bear工具生成(需先安装bear):bear make
2. 修正clangd的root_dir配置
你当前的root_dir写法会强制以当前工作目录为根,无法正确识别项目结构。改成让lspconfig自动识别项目根目录(通过编译数据库、.git仓库、CMakeLists.txt等标识):
完整修正后的配置
local opts = { noremap=true, silent=true } local on_attach = function(client, bufnr) vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>gD', '<cmd>lua vim.lsp.buf.declaration()<CR>', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', '<leader>gd', '<cmd>lua vim.lsp.buf.definition()<CR>', opts) end require('lspconfig').clangd.setup{ on_attach = on_attach, filetypes = {"c", "cpp"}, root_dir = require("lspconfig").util.root_pattern("compile_commands.json", ".git", "CMakeLists.txt"), }
完成以上两步后,重启Neovim,clangd就能索引整个项目的符号,而不只是已打开的缓冲区。
内容的提问来源于stack exchange,提问作者BabyRooJr
相关产品推荐
相关产品推荐

