Raspberry Pi Picoのプロジェクトをneovim(coc.nvim)で編集する
やりたいこと
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
sleep_msの補完は表示されるので、一部は補完が効いているよう。
make
でビルドしてもエラーはでない。
sudo apt install bear
cd ~/pico/test/build
bear make
rm ../compile_commands.json
ln compile_commands.json build/compile_commands.json
compile_commands.json
が生成された。
行き詰まっているので、どなたかneovimのcoc.nvimで補完を効かせた状態でRaspberry Pi Picoのプロジェクトを編集する方法を知っている方がいらっしゃったら教えていただきたいです。
よろしくおねがいします。
❯ 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/"
}
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。
aleの無効化
以前aleをインストールしていて、その警告が表示されていたようなので、aleをアンインストールした。
clangdの無効化
nvim内で:CocConfig
で設定ファイルを開き、
"clangd.enabled": false
とする。
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.h
をpico/stdio.h
に変えたところ、エラーは消えたが、sleep_ms
の補完は効かない。
全く別のプロジェクト(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
と異なるが、avr
やgcc
で共通しているヘッダー(`<stdio.h>や<math.h>や読み込めている)。
それらを踏まえて考えると、clangdなどのLanguage Server側でコンパイラを識別できていないなどの問題を抱えているように考えられる。
解決
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
をコンパイラとして使っていたので、それをパスに指定した。ローカルの設定ファイルにすることで、このプロジェクト以外のときは通常のコンパイラが使える。