как добавить путь включения для языковых серверов в файл 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.

Другие вопросы по тегам