how to add include path for language servers in coc-settings.json file?

AMIR REZA SADEQI picture AMIR REZA SADEQI · Apr 11, 2020 · Viewed 10.9k times · Source

I am using neovim plugin "coc-nvim", as the IntelliSense tool for C/C++. as I know this plugin is actually a client of language servers like ccls, clangd and cquery. I have all of these language servers installed on my system and configured them to work with coc-nvim. so I can get autocompletion and list of general headers(e.g. stdio and ...) in my c/c++ files. but since I work in ros platform I want to add the headers of the ros(/opt/ros/kinetic/include/**) to my default include path of language servers. with out this option, at the beginning of each project I must add a dummy ros node and compile with catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=YES to generate the compile_commands.json file to get access to ros headers.

the settings of coc.nvim is alongside the init.vim file, in a file called "coc-settings.json" and the contents of my coc setting file is as below:

{

"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
}

So my major question is how to add ros include path to these settings. I checked the wiki page of coc.nvim but can't find any option for user include path. also, I checked the option of clangd and tried to add, "args":["-I/opt/ros/kinetic/include/"], to the corresponding block but it did not work. also, I added .cquery file, but still no effect on the list of the proposed headers.

sorry for long story, and thanks for your time.

Edit: it would be better to use the clangd LSP rather than ccls. because it is faster and has better documentation. thanks!

Edit(12 April 2020): the best solution which I found is using ccls language server by using the extraArgs which is provided by ccls. so if you add "clang" field to ccls configs we can have ros headers in autocompletion.

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

but as I mentioned I would like to use clangd if possible. I checked everywhere but no answer. can anyone help me? (please!).

Answer

Zach Lambert picture Zach Lambert · May 16, 2020

This doesn't fix the problem in the way you asked, but I found it to be a useful solution.

Like you, I used catkin_make to generate the compile_commands.json using:

catkin_make --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=1

However, I created a symlink between <catkin_ws>/build/compile_commands.json and <catkin_ws>/compile_commands.json. Since clangd searches parent directories for compile_commands.json, this is accessible by any package/node within the workspace.

Therefore, only one compile_commands.json needs to be generated for the whole workspace, and only needs to be re-generated whenever dependencies change.