C++ 如何在coc-settings.json文件中添加语言服务器的包含路径?

C++ 如何在coc-settings.json文件中添加语言服务器的包含路径?,c++,c,vim-plugin,neovim,clangd,C++,C,Vim Plugin,Neovim,Clangd,我使用neovim插件作为C/C++的智能感知工具。据我所知,这个插件实际上是ccls、clangd和cquery等语言服务器的客户端。我在我的系统上安装了所有这些语言服务器,并将它们配置为与coc nvim一起工作。因此,我可以在我的c/c++文件中获得自动完成和常规标题列表(例如stdio和…)。但由于我在ros平台中工作,我想将ros的头(/opt/ros/kinetic/include/**)添加到语言服务器的默认include路径中。如果没有这个选项,在每个项目开始时,我必须添加一个虚

我使用neovim插件作为C/C++的智能感知工具。据我所知,这个插件实际上是ccls、clangd和cquery等语言服务器的客户端。我在我的系统上安装了所有这些语言服务器,并将它们配置为与coc nvim一起工作。因此,我可以在我的c/c++文件中获得自动完成和常规标题列表(例如stdio和…)。但由于我在ros平台中工作,我想将ros的头(/opt/ros/kinetic/include/**)添加到语言服务器的默认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包含路径添加到这些设置中。我检查了,但找不到用户包含路径的任何选项。另外,我选中了clangd选项并尝试添加,
“args”:[“-I/opt/ros/kinetic/include/”]
, 到相应的块,但它不起作用。此外,我还添加了文件,但对建议的标题列表仍然没有影响

很抱歉说了这么长的话,谢谢你们抽出时间

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

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

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

但正如我提到的,如果可能的话,我想使用clangd。我到处查看,但没有回答。有人能帮我吗?(请!)。 最好的选择是依靠你的LSP选项

我刚刚为
ccls
解决了这个问题,定义了一个自定义的
.ccls
文件,并添加了一个指向我的boost includes的
-I
选项。该
.ccls
文件必须位于我的项目的根目录下。e、 g:

clang
%c
-I/usr/local/include

对于
clangd

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

与您一样,我使用
catkin\u make
生成
compile\u命令.json
使用:

catkin_make --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=1
但是,我在
/build/compile\u commands.json
/compile\u commands.json
之间创建了一个符号链接。由于clangd在父目录中搜索
compile_commands.json
,因此工作区内的任何包/节点都可以访问该文件


因此,只需要为整个工作区生成一个
compile\u命令.json
,并且只需要在依赖项更改时重新生成。

Hello Zach。欢迎来到StackOverflow。我喜欢你的回答,但是。。。您可以编辑您的代码,并使用{}格式将catkin_make命令行放在一行上;用户{}比
文本
更合适。谢谢你让我知道,我修正了格式。
Edit(2020年4月12日):
请将此作为答案发布。你能发布一个完整的coc-settings.json示例吗?