3

我正在使用 neovim 插件"coc-nvim"作为 C/C++ 的 IntelliSense 工具。据我所知,这个插件实际上是 ccls、clangd 和 cquery 等语言服务器的客户端。我在我的系统上安装了所有这些语言服务器,并将它们配置为与 coc-nvim 一起使用。所以我可以在我的 c/c++ 文件中获得自动完成和通用头文件列表(例如 stdio 和 ...)。但是由于我在 ros 平台上工作,所以我想将 ros(/opt/ros/kinetic/include/**) 的标头添加到我的语言服务器的默认包含路径中。如果没有这个选项,我必须在每个项目的开头添加一个虚拟 ros 节点并进行编译catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=YES以生成 compile_commands.json 文件以访问 ros 头文件。

coc.nvim 的设置在 init.vim 文件旁边,在一个名为“coc-settings.json”的文件中,我的 coc 设置文件的内容如下:

{

"languageserver": {
    "clangd": {
      "command": "clangd",
      "rootPatterns": ["compile_flags.txt", "compile_commands.json"],
      "filetypes": ["c", "cpp", "objc", "objcpp"]
    },
    "cquery": {
      "command": "/home/amirrezasadeghi/ManBuildLibs/cquery/build/cquery",
      "args": ["--log-file=/tmp/cq.log"],
      "filetypes": ["c", "cpp"],
      "rootPatterns": ["compile_flags.txt", "compile_commands.json", ".git/", ".hg/"],
      "initializationOptions": {
        "cacheDirectory": "/tmp/cquery"
      }
    },
    "ccls": {
      "command": "ccls",
      "filetypes": ["c", "cpp", "objc", "objcpp"],
      "rootPatterns": [".ccls", "compile_commands.json", ".git/", ".hg/"],
      "initializationOptions": {
         "cache": {
           "directory": "/tmp/ccls"
         }
       }
    }
  },
  "clangd.semanticHighlighting": true
}

所以我的主要问题是如何将 ros 包含路径添加到这些设置中。我检查了coc.nvim 的 wiki 页面,但找不到用户包含路径的任何选项。另外,我检查了 clangd 的选项并尝试将 , 添加 "args":["-I/opt/ros/kinetic/include/"]到相应的块中,但它不起作用。另外,我添加了.cquery文件,但对建议的标题列表仍然没有影响。

对不起,长篇大论,感谢您的时间。

编辑:最好使用 clangd LSP 而不是 ccls。因为它更快并且有更好的文档。谢谢!

编辑(2020 年 4 月 12 日):我发现的最佳解决方案是使用 cclsextraArgs提供的 ccls 语言服务器。因此,如果您将"clang"字段添加到 ccls 配置中,我们可以在自动完成中使用 ros 标头。

"initializationOptions": {                                                                                        
                                    "cache": {                                                                                                
                                            "directory": "/tmp/ccls"                
                                    },                                              
                                    "clang": {                                      
                                            "extraArgs": [                          
                                                    "-I",                           
                                                    "/opt/ros/kinetic/include/"     
                                            ]                                       
                                    }                                               
                            }

但正如我提到的,如果可能的话,我想使用clangd。我到处检查,但没有答案。谁能帮我?(请!)。

4

2 回答 2

2

这并不能按照您的要求解决问题,但我发现它是一个有用的解决方案。

像你一样,我曾经catkin_make生成compile_commands.json使用:

catkin_make --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=1

<catkin_ws>/build/compile_commands.json但是,我在和之间创建了一个符号链接<catkin_ws>/compile_commands.json。由于 clangd 在父目录中搜索compile_commands.json,因此工作空间中的任何包/节点都可以访问它。

因此,compile_commands.json整个工作空间只需要生成一个,并且只需要在依赖关系发生变化时重新生成。

于 2020-05-15T23:36:39.817 回答
0

看起来没有coc-nvim用于设置的选项。最好的选择是依靠您的 LSP 选项。

我刚刚ccls通过定义一个自定义.ccls文件解决了这个问题,并添加了一个-I指向我的 boost 包含的选项。该.ccls文件必须位于我的项目的根目录中。例如:

clang
%c
-I/usr/local/include

必须有相同的选项clangd

于 2020-04-29T22:06:08.533 回答