【问题标题】:how to add include path for language servers in coc-settings.json file?如何在 coc-settings.json 文件中添加语言服务器的包含路径?
【发布时间】:2020-04-11 00:40:56
【问题描述】:

我正在使用 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 包含路径添加到这些设置中。我检查了wiki page of coc.nvim,但找不到用户包含路径的任何选项。另外,我检查了clangd的选项并尝试添加, "args":["-I/opt/ros/kinetic/include/"], 到相应的块,但它没有工作。另外,我添加了.cquery 文件,但对建议的标题列表仍然没有影响。

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

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

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

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

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

【问题讨论】:

  • Edit(12 April 2020): 请将此作为答案发布。您能否发布一个完整的 coc-settings.json 示例?

标签: c++ c vim-plugin neovim clangd


【解决方案1】:

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

和你一样,我使用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,并且只需要在依赖关系发生变化时重新生成。

【讨论】:

  • 你好扎克。欢迎来到 StackOverflow。我喜欢你的回答,但是......你可以编辑你的代码并使用 {} 格式将 catkin_make 命令行放在一行上吗?用户 {} 比 text 更合适。谢谢
  • 感谢您告诉我,我已修正格式。
【解决方案2】:

coc-nvim 中似乎没有用于设置的选项。 最好的选择是依靠您的 LSP 选项。

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

clang
%c
-I/usr/local/include

clangd 必须有相同的选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2021-05-08
    • 2011-02-14
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多