как добавить путь включения для языковых серверов в файл coc-settings.json?
Я использую плагин neovim "coc-nvim" в качестве инструмента IntelliSense для C/C++. насколько я знаю, этот плагин на самом деле является клиентом языковых серверов, таких как ccls, clangd и cquery. В моей системе установлены все эти языковые серверы и настроены для работы с coc-nvim. поэтому я могу получить автозаполнение и список общих заголовков (например, stdio и...) в моих файлах c/ C++. но поскольку я работаю на платформе 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, но не нашел ни одной опции для пути включения пользователя. Кроме того, я проверил опцию clangd и попытался добавить,
"args":["-I/opt/ros/kinetic/include/"]
, в соответствующий блок, но это не сработало. также я добавил файл .cquery, но все еще не повлиял на список предлагаемых заголовков.
извините за долгий рассказ, и спасибо за ваше время.
Изменить: было бы лучше использовать clangd LSP, а не ccls. потому что он быстрее и имеет лучшую документацию. Спасибо!
Изменить (12 апреля 2020 г.): лучшее решение, которое я нашел, - это использование языкового сервера ccls с использованием extraArgs
который предоставляется ccls. так что если вы добавите"clang"
в конфигах ccls, мы можем иметь заголовки ros в автозаполнении.
"initializationOptions": {
"cache": {
"directory": "/tmp/ccls"
},
"clang": {
"extraArgs": [
"-I",
"/opt/ros/kinetic/include/"
]
}
}
но, как я уже упоминал, я хотел бы по возможности использовать clangd. Я везде проверял, но ответа не получил. Может кто-нибудь помочь мне? (пожалуйста!).
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
должен быть сгенерирован для всей рабочей области и должен быть повторно создан только при изменении зависимостей.
Похоже, в coc-nvim
для установки этого. Лучший вариант - полагаться на свои варианты LSP.
Я просто решил это для ccls
путем определения обычай .ccls
файл и добавил -I
вариант, указывающий на мою поддержку, включает. Который.ccls
файл должен находиться в корне моего проекта. например:
clang
%c
-I/usr/local/include
Должен быть такой же вариант для clangd
.