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!).
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.