はじめに
M5Stack Core2 for AWSを購入し、C++の素振りを始めました。VSCodeのPlatformIOプラグインであれば、そのまま補完や定義ジャンプが効くっぽかったのですが、俺はNeovimでやりたいんだ!ということで今回調査し、設定した内容をまとめます。
NeovimのC++言語補完設定
方針は以下の通り
- coc.nvim(※1)を利用
- LSPにはccls(※2)を利用
※1 coc.nvim以外でもcclsに対応していれば、どのLSPクライアントを利用しても問題ないと思います
※2 後述するPlatformIO Core (CLI)に補完の定義ファイルを吐き出すオプションがあったため
clangdが有効の場合無効化
coc.nvimの場合、rootPatternsで判定があるので無効化しなくても問題ないかもです..(未調査)
{
"dependencies": {
- "coc-clangd": ">=0.15.1",
"coc-css": ">=1.2.6",
"coc-deno": ">=3.4.0",
"coc-eslint": ">=1.4.5",
"coc-flutter": ">=1.9.2",
"coc-go": ">=0.13.3",
"coc-html": ">=1.4.1",
"coc-json": ">=1.3.4",
"coc-pyright": ">=1.1.144",
"coc-rls": ">=1.1.6",
"coc-tsserver": ">=1.7.0",
"coc-vimlsp": ">=0.12.2"
}
}
cclsのインストール
LSPのccls
をインストールします
brew install ccls
coc.nvimのccls設定
"languageserver": {
"golang": {
"command": "gopls",
"rootPatterns": ["go.mod"],
"filetypes": ["go"]
},
+ "ccls": {
+ "command": "ccls",
+ "filetypes": ["c", "cc", "cpp", "c++", "objc", "objcpp"],
+ "rootPatterns": [".ccls", "compile_commands.json", ".git/", ".hg/"],
+ "initializationOptions": {
+ "cache": {
+ "directory": "/tmp/ccls"
+ }
+ }
+ }
+ },
PlatformIO Core (CLI)の導入
VSCodeのPlatformIOプラグインは、内部的にPlatformIO Core (CLI)を呼び出しています。故に、内部で呼び出しているコマンドさえ把握してしまえば、zsh上で再現が可能です。
brew install platformio
$ which platformio
/usr/local/bin/platformio
$ pio --version
PlatformIO Core, version 5.2.0
実行するとオプション一覧が出力されます
$ pio
Usage: pio [OPTIONS] COMMAND [ARGS]...
Options:
--version Show the version and exit.
-f, --force DEPRECATE
-c, --caller TEXT Caller ID (service)
--no-ansi Do not print ANSI control characters
-h, --help Show this message and exit.
Commands:
access Manage resource access
account Manage PlatformIO account
boards Embedded board explorer
check Static code analysis
ci Continuous integration
debug Unified debugger
device Device manager & serial/socket monitor
home GUI to manage PlatformIO
lib Library manager
org Manage organizations
package Package manager
platform Platform manager
project Project manager
remote Remote development
run Run project targets (build, upload, clean, etc.)
settings Manage system settings
system Miscellaneous system commands
team Manage organization teams
test Unit testing
update Update installed platforms, packages and libraries
upgrade Upgrade PlatformIO to the latest version
プロジェクト作成方法(arduino)
プロジェクト設定
作成するプロジェクトの構成は下記となります。(frameworkがespidf版は別章で行います)
設定 | 値 |
---|---|
製品名 | M5Stack Core2 for AWS |
開発ボード | m5stack-core2 |
PlatformIO Core (CLI)のバージョン | 5.2.0 |
framework | arduino |
プロジェクト初期化
プロジェクト名は、m5stack-sample
をとします。下記のコマンドで、プロジェクトファイルが一式生成されます。
mkdir m5stack-sample
cd m5stack-sample
pio project init \
--board m5stack-core2 \
--ide vim
$ tree
.
├── include
│ └── README
├── lib
│ └── README
├── platformio.ini
├── src
└── test
└── README
補足
--ide vim
オプションをつけることで、リポジトリルートLSP(ccls)の設定ファイル.ccls
ファイルが生成- 細かくファイルの変更をトレースしたい場合は、この時点でgitの初期化設定推奨
ライブラリの追加
M5Stack Core2を最低限動かすのに必要な2つのライブラリを導入します
pio lib install M5Core2
pio lib install LovyanGFX
サンプルファイルを作成
#include <M5Core2.h>
// the setup routine runs once when M5Stack starts up
void setup(){
// Initialize the M5Stack object
M5.begin();
// LCD display
M5.Lcd.print("Hello M5Stack");
}
// the loop routine runs over and over again forever
void loop() {
}
補完/定義ジャンプの確認
補完
定義ジャンプ
platformio.iniに設定を追記
upload_port
とmonitor_speed
の設定を追記
monitor_speedを適切に設定しないとシリアル通信監視時に文字化けします
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:m5stack-core2]
platform = espressif32
board = m5stack-core2
framework = arduino
lib_deps =
m5stack/M5Core2@^0.0.6
lovyan03/LovyanGFX@^0.4.2
+ upload_port = /dev/cu.SLAB_USBtoUART
+ monitor_speed = 115200
Makefileの作成
PlatformIO Core (CLI)
の各種コマンドをMakefileにまとめます。対応表は下記の通り。
コマンド | 説明 | Makefile |
---|---|---|
pio lib install | ライブラリの初期化 | make install |
pio run | ファームのビルド | make build |
pio run --target upload | ビルド+M5Stack Core2へファームを書き込み | make uplaod |
pio device monitor -p /dev/cu.SLAB_USBtoUART | ビルド+書き込み+ポート監視 デバックする際に利用 | make watch |
pio device list | ポート一覧出力 | make device-list |
install:
pio lib install
build:
pio run
upload:
pio run --target upload
watch:
pio device monitor -p /dev/cu.SLAB_USBtoUART
device-list:
pio device list
make upload
もしくはmake watch
を実行し、M5Stack Core2のディスプレイに、Hello M5Stack
と表示されたら成功です!
プロジェクト作成方法(espidf)
プロジェクト設定
作成するプロジェクトの構成は下記です。前回の構成との差異のみ記載
設定 | 値 |
---|---|
framework | espidf |
ardiuno版の手順では、LCDにHello Worldが出力されるサンプルでしたが、こちらはシリアル通信でHello Worldが出力されることを確認するサンプルです。(espidfでLCDに表示する方法は、わかり次第追加します)
プロジェクト初期化
プロジェクト名は、m5stack-espidf-sample
をとします。下記のコマンドで、プロジェクトファイルが一式生成されます。
mkdir m5stack-espidf-sample
cd m5stack-espidf-sample
pio init \
--board=m5stack-core2 \
--project-option="framework=espidf" \
--ide vim
platformio.ini
ファイルを確認すると、frameworkがespidf
になっていることが確認できます。
$ tree
.
├── CMakeLists.txt
├── include
│ └── README
├── lib
│ └── README
├── platformio.ini
├── sdkconfig
├── src
│ ├── CMakeLists.txt
│ └── main.c
└── test
└── README
初期化直前のプロジェクト構成は、framework設定がarduino
際と比較すると、下記のファイルが追加されています
CMakeLists.txt
src/CMakeLists.txt
src/main.c
platformio.iniに設定を追記
platformio.iniに設定を追記と同様の設定を行います
src/main.cを編集
#include "esp_log.h"
static const char *TAG = "Main";
void app_main() {
ESP_LOGI(TAG, "Hello World.");
}
pio device monitor -p /dev/cu.SLAB_USBtoUART
出力が確認出来ました。
最後に
PlatformIO Core (CLI)
が非常によく出来ており、Neovimで快適に開発が進められそうで良かったです。これから色々嵌る可能性はありますが、とりあえずHello WorldまでNeovim開発出来て一安心です。
参考
コマンドラインでArduino開発 : vim + platformio
Visual Studio Code + PlatformIO 環境で M5Stack Core2 for AWS でHello Worldしてみました
付録
platformioがccls定義を吐くことを知らずにclangdの設定を入れたメモ
llvmの設定
C++のLSPは、clangd
というツールです。clangd
をインストールするため、brewでllvm
をインストールします。
brew install llvm
llvmのインストールは、15分程度時間がかかりました
※ ネットワーク品質やMacの状態にもかなり左右されますので参考程度です
llvmのパスを通し、clangd
が実行できたら完了です
export PATH="/usr/local/opt/llvm/bin:$PATH"
coc-clangdを導入
LSPにはcoc.nvimを利用しているため、coc-clangdを導入します
プラグインをインストールします
:CocInstall coc-clangd
設定ファイルにも記載されていることを確認します
{
"dependencies": {
+ "coc-clangd": ">=0.15.1",
"coc-css": ">=1.2.6",
"coc-deno": ">=3.4.0",
"coc-eslint": ">=1.4.5",
"coc-flutter": ">=1.9.2",
"coc-go": ">=0.13.3",
"coc-html": ">=1.4.1",
"coc-json": ">=1.3.4",
"coc-pyright": ">=1.1.144",
"coc-rls": ">=1.1.6",
"coc-tsserver": ">=1.7.0",
"coc-vimlsp": ">=0.12.2"
}
}