web-dev-qa-db-ja.com

言語サーバーのインクルードパスをcoc-settings.jsonファイルに追加する方法

C/C++用のIntelliSenseツールとして、neovimプラグイン "coc-nvim" を使用しています。私が知っているように、このプラグインは実際にはccls、clangd、cqueryなどの言語サーバーのクライアントです。これらの言語サーバーをすべてシステムにインストールし、coc-nvimで動作するように構成しました。だから私は自分のc/c ++ファイルでオートコンプリートと一般的なヘッダー(例:stdioと...)のリストを取得できます。しかし、私はrosプラットフォームで作業しているので、ros(/ opt/ros/kinetic/include/**)のヘッダーを言語サーバーのデフォルトのインクルードパスに追加します。このオプションを使用しない場合、各プロジェクトの最初にダミーのrosノードを追加し、catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=YESでコンパイルして、rosヘッダーにアクセスするためのcompile_commands.jsonファイルを生成する必要があります。

coc.nvimの設定は、「coc-settings.json」というファイル内のinit.vimファイルと一緒にあり、私の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 includeパスをこれらの設定に追加する方法です。 coc.nvimのwikiページ を確認しましたが、ユーザーインクルードパスのオプションが見つかりません。また、clangdのオプションをチェックして、対応するブロックに"args":["-I/opt/ros/kinetic/include/"]を追加しようとしましたが、機能しませんでした。また、 。cquery ファイルを追加しましたが、提案されたヘッダーのリストにはまだ影響がありません。

長い話でごめんなさい、そしてあなたの時間をありがとう。

編集:cclsよりもclangd LSPを使用する方が良いでしょう。より速く、より良いドキュメントがあるからです。ありがとう!

編集(2020年4月12日):私が見つけた最良の解決策は、cclsによって提供されるextraArgsを使用してccls言語サーバーを使用することです。したがって、"clang"フィールドをccls configsに追加すると、自動補完でrosヘッダーを使用できます。

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

しかし、前述したように、可能であれば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を1つだけ生成する必要があり、依存関係が変更されるたびに再生成するだけで済みます。

1
Zach Lambert

coc-nvimにはそれを設定するオプションがないようです。最良のオプションは、LSPオプションに依存することです。

カスタム.cclsファイルを定義してcclsを解決し、ブーストインクルードを指す-Iオプションを追加しました。その.cclsファイルは、プロジェクトのルートにある必要があります。例えば。:

clang
%c
-I/usr/local/include

clangdにも同じオプションが必要です。

0
Thomas Legris