Closed11

Raspberry Pi Picoのプロジェクトをneovim(coc.nvim)で編集する

PotewoPotewo

やりたいこと

pico-project-generatorでプロジェクトを生成した。
最近coc.nvimをインストールしたので、Raspberry Pi Picoのプロジェクトをcoc.nvimの補完を使いつつ編集したい。

やったこと

~/picoディレクトリ内にpico-project-generatorを使ってtestという名前のプロジェクトを生成した。
Language Serverにはcoc-clangdを使用している。ClangdのGetting Startedページを参考に、生成したtestディレクトリ内で以下のコマンドを実行し、compile_commands.jsonが作られた。

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

問題

pico/stdlibに最初はエラーが出ていたのが、エラーが出なくなった代わりにstdio.hにエラーが出てしまった。

Before

After

PotewoPotewo


sleep_msの補完は表示されるので、一部は補完が効いているよう。

makeでビルドしてもエラーはでない。

PotewoPotewo

行き詰まっているので、どなたかneovimのcoc.nvimで補完を効かせた状態でRaspberry Pi Picoのプロジェクトを編集する方法を知っている方がいらっしゃったら教えていただきたいです。
よろしくおねがいします。

PotewoPotewo
❯ clangd --version                        
clangd version 10.0.0 (git@github.com:apple/llvm-project.git c39a810ec308dd4a8d93c5011fb73a5c987e8680)

以前Swiftをインストールしていたため、clangdがApple製(?)になっている。

:CocCommand clangd.update:CocCommand clangd.installでバージョン11をインストールしてみたけどダメ。

:CocLocalConfigでtestプロジェクト内に設定ファイルを作り、以下のようにしてみたが、解決せず。

{
  "clangd.compilationDatabasePath": "/home/potewo/pico/test/"
}
PotewoPotewo

https://www.reddit.com/r/cpp/comments/cafj21/comment/et8l9ie

I'vd tried ccls and clangd with neovim, clangd sometimes works abnormally. As for cquery, it seems dead now. So, I recommend ccls, it works perfectly for me. My current vim configuration is : neovim + Spacevim + coc.nvim + ccls.

clangd自体の不具合かも?

cclsに代えてみることも検討中。
clangdやcoc-clangdのGitHubスター数は200程度、cclsは2.2k。

PotewoPotewo

aleの無効化

以前aleをインストールしていて、その警告が表示されていたようなので、aleをアンインストールした。

clangdの無効化

nvim内で:CocConfigで設定ファイルを開き、

"clangd.enabled": false

とする。

cclsのインストール

https://snapcraft.io/ccls

sudo snap install ccls --classic

でcclsをインストール。

cclsの設定

https://github.com/neoclide/coc.nvim/wiki/Language-servers#ccobjective-cを参考に、coc.nvimの設定を行う。
上のサイト通りに、以下をcoc.nvimの設定ファイルに追記する。

"languageserver": {
  "ccls": {
    "command": "ccls",
    "filetypes": ["c", "cc", "cpp", "c++", "objc", "objcpp"],
    "rootPatterns": [".ccls", "compile_commands.json", ".git/", ".hg/"],
    "initializationOptions": {
        "cache": {
          "directory": "/tmp/ccls"
        }
      }
  }
}

確認

pico-project-generator~/pico/以下にプロジェクトを生成。オプションはvscodeのプロジェクトファイルを作るのみ。

cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
cd ..
ln -s build/compile_commands.json ./
nvim test.c

結果

エラーは消えず。sleep_msと打っても補完が出なくなってしまった。
compile_commands.jsonを消すと、stdio.hの部分ではエラーが出なくなる。
compile_commands.jsonを消したとき、test.cファイルをnvimで開き、stdio.hの上でgdと打つと、usr/include/stdio.hが開かれる。

ときどき、indexingが終わらないときがある。一度nvimを閉じてからまた開くとindexingは消える。

stdio.hpico/stdio.hに変えたところ、エラーは消えたが、sleep_msの補完は効かない。

PotewoPotewo

全く別のプロジェクト(Platformioを使ったArduino Unoのプロジェクト)でも、platformioでcompile_commands.jsonを生成してcoc.nvimを使ったnvimで編集しようとすると、同様の問題が発生する。
今の段階で、補完だけはうまく言っていて、ヘッダーファイルでエラーが出ている。
そしてそのヘッダーファイルのエラーは、コンパイラと一緒についているヘッダーファイルが読み込めていないために発生していると考えると納得がいく。
"Arduino.h""pico/stlib.h"""で囲まれており、その中で定義されている関数等は読み込めていて補完も効き、エラーがでないが、そのヘッダーファイルの中で読み込まれている<sys/cdef.h><avr/pgmspace.h>が読み込めていない。 Raspberry Pi PicoやArduino用のコンパイラは通常のg++gccと異なるが、avrgccで共通しているヘッダー(`<stdio.h>や<math.h>や読み込めている)。
それらを踏まえて考えると、clangdなどのLanguage Server側でコンパイラを識別できていないなどの問題を抱えているように考えられる。

PotewoPotewo

解決

https://clangd.llvm.org/troubleshooting.html#cant-find-standard-library-headers-map-stdioh-etc
上のサイトに書かれている、-query-driverオプションを設定したら使えるようになった。
nvimで:CocLocalConfigコマンドで補完を使いたいプロジェクト上でローカルの設定ファイルを作成し、以下のようにする。

{
  "clangd.arguments": ["-query-driver", "/usr/bin/arm-none-eabi-gcc"]
}

Raspberry Pi Picoのcompile_commands.jsonを見た所、/usr/bin/arm-none-eabi-gccをコンパイラとして使っていたので、それをパスに指定した。ローカルの設定ファイルにすることで、このプロジェクト以外のときは通常のコンパイラが使える。

PotewoPotewo

Arduinoでも同様の手順でエラーなく補完ができた。

このスクラップは2021/02/24にクローズされました