shuntaka.dev
shuntaka.dev
NeovimでM5Stack Core2ファームウェア開発を快適に行う環境を作った

09/18 23:10 2021

01/03 14:22 2026

#はじめに

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で判定があるので無効化しなくても問題ないかもです..(未調査)

~/.config/coc/extensions/package.json
 {
   "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設定

~/.config/nvim/coc-settings.json
   "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

#サンプルファイルを作成

src/main.cpp
#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() {

}

#補完/定義ジャンプの確認

補完 img

定義ジャンプ img

#platformio.iniに設定を追記

upload_portとmonitor_speedの設定を追記

monitor_speedを適切に設定しないとシリアル通信監視時に文字化けします

platformio.ini
  ; 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
Makefile
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を編集

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

出力が確認出来ました。

img

#最後に

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が実行できたら完了です

~/.zshrc
export PATH="/usr/local/opt/llvm/bin:$PATH"

#coc-clangdを導入

LSPにはcoc.nvimを利用しているため、coc-clangdを導入します

プラグインをインストールします

Neovim上で実行
:CocInstall coc-clangd

設定ファイルにも記載されていることを確認します

~/.config/coc/extensions/package.json
 {
   "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"
   }
 }