【EV3 Micropython】VSCodeでpybricksの入力補完（自動補完）ができるようにする

LEGO Mindstorms EV3は，公式でPython（EV3 MicroPython=[pybricks](https://pybricks.com/)）に対応しており，Microsoft社のフリーエディタであるVSCode（Visual Studio Code editor）の拡張機能とEV3のファームウェアが公開されています．

VSCodeに拡張機能[LEGO MINDSTORMS®︎ EV3 MicroPython](https://marketplace.visualstudio.com/items?itemName=lego-education.ev3-micropython)を追加するだけで簡単に使えるので，EV3を使ったテキストプログラミングの入門にオススメです．
しかしながら，コーディングするにあたって不満点が一つあります．それは，入力補完（自動補完）の機能がないということです．

ここでは，VSCodeでEV3MicropythonのAPIを自動補完するための手順を紹介します．

:::note info
インフォメーション
本記事は，<a href= "https://qiita.com/Sunrise98/items/1c9424cc7f21f07a1b02" >2020年に投稿した記事</a>を，より簡単な設定手順にまとめて再投稿したものです．
（pybricksがpip installできるようになったことで，より簡単に設定ができるようになりました）
:::

# EV3 MicroPythonの開発環境設定

1. [こちらの記事](https://qiita.com/Sunrise98/items/af866502b06165c3ae40)に従って，VSCodeのPython環境を設定します．
    - PCにPythonとpip（あるいはpip3）をインストールする．
    - VSCodeでPythonスニペットとPylanceによる入力補完を有効化する．
1. [LEGO Educationのサイト](https://education.lego.com/ja-jp/support/mindstorms-ev3/python-for-ev3)に従って，EV3 Micropythonの環境設定を行います．
    - VSCodeに拡張機能[LEGO MINDSTORMS®︎ EV3 MicroPython](https://marketplace.visualstudio.com/items?itemName=lego-education.ev3-micropython)をインストールする．
    - EV3Micorpythonのイメージファイルを書き込んだMicroSDカードをEV3インテリジェントブロックに挿入し，起動させる．

:::note warn
注意
Pythonの入力補完自体は，手順1がその機能のほとんどを担っています．
ですので，手順1の記事に書かれている設定方法がきちんとなされているかどうかをよく確認してください．
（特に，pipがインストールされていないとpybricksの入力補完ができないので注意してください）
:::

# pybricksパッケージのインストール

pip（あるいはpip3）でpybricksパッケージをインストールしていきます．

- インストール方法（コマンド）
    - Windowsの場合（コマンドプロンプトで実行）
        - `pip install pybricks`
    - Macの場合（ターミナルで実行）
        - `pip3 install pybricks`
- インストールされたかどうかを確認する方法（コマンド）
    - Windowsの場合（コマンドプロンプトで実行）
        - `pip show pybricks`
    - Macの場合（ターミナルで実行）
        - `pip3 show pybricks`

投稿者の環境（Mac）でpybricksパッケージをインストールし，`pip show pybricks`を実行した結果は次の通りです．
（インストールできていないと，エラーが出力されます）

```
$ pip3 show pybricks
Name: pybricks
Version: 3.0.0a3
Summary: Documentation and user-API stubs for Pybricks MicroPython
Home-page: https://pybricks.com
Author: The Pybricks Authors
Author-email: dev@pybricks.com
License: MIT
Location: /usr/local/lib/python3.8/site-packages
Requires: 
Required-by: 
```

:::note info
インフォメーション
ここまでは，一度設定すれば，後は何もする必要はありません．お疲れ様です．
:::


# プロジェクト内の設定
EV3では，まずプロジェクトと呼ばれるフォルダを作成したうえで，そのプロジェクト内でプログラム（主にmain.py）を実装し，実行します．
EV3MicorPythonのプロジェクト作成方法は，次の通りです．

1. VSCodeのアクティビティバー（画面左側）のEV3のアイコン（`LEGO MINDSTORMS®︎ EV3 MicroPython`）をクリック
1. `Create a new project`を選択し，プロジェクト名の入力および保存フォルダの選択を行う．
1. プロジェクトが作成される．

作成されるプロジェクトは，次のようなファイル構造になっています．
（VSCodeのアクティビティバーの「エクスプローラ」からファイル構造を確認することができます）

```
├── .gitignore
├── .vscode
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
└── main.py
```

ここで，`.vscode/setting.json`は，デフォルトでは次のように記述されています．

``` .vscode/setting.json
// Place your settings in this file to overwrite default and user settings.
{
	"files.eol": "\n",
	"debug.openDebug": "neverOpen",
	"python.linting.enabled": false,
	"python.languageServer": "None"
}
```
`.vscode/setting.json`の"python.languageServer": "None"の行をコメントアウト（行の先頭に//を追記）することで，プロジェクト内で入力補完が有効化されます．

``` .vscode/setting.json
// Place your settings in this file to overwrite default and user settings.
{
	"files.eol": "\n",
	"debug.openDebug": "neverOpen",
	"python.linting.enabled": false,
	// "python.languageServer": "None"
}
```

:::note warn
注意
.vscode/setting.jsonの"python.languageServer"のコメントアウトは，プロジェクトを新規作成する度に行う必要があります．これを行わないと，そのプロジェクト内のPythonファイルのみ入力補完が効かないという状況が発生します．
:::

# 入力補完の動作確認

下記プログラム（main.py）において，最後の2行（Motorクラスに関する命令）を追加した際に，入力補完が行われるかどうか確認していきます．
GIFより，`Mot`と入力すれば，`Motor`が候補として表示される，`Port.`と入力すると，ポートの候補（`A`や`S1`）が表示されるといったように，pybrickのモジュールに関する補完が行われていることが確認できます．

```main.py
#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
                                 InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile

# This program requires LEGO EV3 MicroPython v2.0 or higher.
# Click "Open user guide" on the EV3 extension tab for more information.

# Create your objects here.
ev3 = EV3Brick()

# Write your program here.
ev3.speaker.beep()

motor = Motor(Port.B)
motor.run_angle(360, 360)
```
![pybricks.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207507/a737cfb2-ca7f-6ec2-47f4-324a7b1bfdbc.gif)
以上で，入力補完設定は終了です．
EV3MicroPythonによるテキストプログラミングを楽しんでください:wink: