Visual Studio Codeをつかって楽しくScalaとペアプログラミング

## はじめに
みなさんScalaのコーディングに何使ってますか？
おそらくデファクトである[Intellij IDEA](https://www.jetbrains.com/ja-jp/idea/)を使っている方が多いんじゃないかと思いますが、わたしもその一人でした。
最近テレワークが多くなって、ペアプロも気軽に席に行って...ということが難しくなってきました。
画面共有という手もありますが、IDEと同時に起動するとPCが熱くなってきますし、やっぱりペアプロするには見ているところをあたかも隣にいる感覚でやりたいですよね。
以前からVisual Studio CodeでScalaを書くという試みはやっていたのですが、最近[Metals](https://scalameta.org/metals/)に出会ったので共有しようと思います。

## Metalsとは
[Metals](https://scalameta.org/metals/)は、Scala用のLanguage Serverです。
Visual Studio Codeや、VimなどのテキストエディタでIntellijのようなIDEの機能を提供します。
コードジャンプはもちろん、型の定義を表示したり、参照されている箇所をすべて検索することができます。
わたしは[v0.8.4](https://scalameta.org/metals/blog/2020/04/10/cobalt.html)から使用しているのですが、2020/05/04にリリースされた[v0.9.0](https://scalameta.org/metals/blog/2020/05/04/lithium.html)ではScala 3もサポートされ、動作がかなり軽くなった印象があります。
詳細の使い方は[Metalsの公式ドキュメント](https://scalameta.org/metals/docs/editors/vscode.html)を参照ください。

## Visual Studio Live Shareとは
[Visual Studio](https://visualstudio.microsoft.com/ja/)に含まれている、共同開発ができるツールです。Visual Studio Code用にも拡張機能が提供されています。
とにかくすごくて便利なので、動いている模様は[こちらの公式サイト](https://marketplace.visualstudio.com/items?itemName=mtxr.sqltools)をご覧ください。
ざっと共同編集の他に、以下の機能があります。

- チャット
- 通話機能
- ローカルのポートを参加者と共有する
- ターミナル共有

## サクッとやる
まず、[Visual Studio Codeをインストール](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)しましょう。

### Metalsの設定
#### 拡張機能をインストールする
Scalaを使用するには、以下のリンクから拡張機能をインストールしてください。
[Scala(Metals)をインストール](https://marketplace.visualstudio.com/items?itemName=scalameta.metals)
ペアプロするには、VSCode用の拡張であるLive Share Extension Packが必要です。
[Live Share Extension Packをインストール](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare-pack)

インストールが終わったらリロードしておきましょう。

#### build.sbtがあるディレクトリをVSCodeで開く
準備はたったこれだけです！
右下に`Import build`というボタンが現れるのでクリックします。(スクショは[こちら](https://scalameta.org/metals/docs/editors/vscode.html)から引用)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122672/e07e7ef1-02c4-a848-88c4-7de9183412de.png)

#### .gitignoreを編集
Import buildが始まると、Metalsがファイルを生成しだすので無視してやります。
`.gitignore`に以下を追加します。

```
.metals/
.bloop/
project/metals.sbt
```

以上でScalaを書く準備は完了です！

### ペアプロの設定
以下、新しく共同編集のセッションを作る手順です。

#### 画面左下のLive Shareをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122672/4636c638-4a7d-f5be-22e5-e22d96ce5380.png)

#### MicrosoftかGitHubアカウントでログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122672/f55a1735-d3f8-b02a-db7f-26c5ccb35c70.png)
認証のためにブラウザで新しいタブが開くので、AuthorizeしてVSCodeに戻りましょう。

#### 招待リンクをコピーして参加者に共有する
画面右下から、`Copy again`をクリックするとクリップボードに招待リンクがコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122672/b1531d1d-12cc-8a6f-f3f1-0f74f221784d.png)
参加者はこのリンクを使って、作成した共同編集のセッションに参加できます。

ペアプロの準備ができましたね！

## 使ってみて分かったことなど
- PlayFrameworkの`views`ディレクトリ以下や`routes`ファイルでは、コードジャンプと補完が効かない
- 動作がおかしくなったら、`.bloop`ディレクトリを削除すると正常に戻った
- importの挙動がイケてない(Intellijだと`Alt+Enter`のやつ)

## Intellijの使用感に近づけるプラグインたち
- Intellijのダークテーマに似せる[Dracula Intellij Theme](https://marketplace.visualstudio.com/items?itemName=trinm1709.dracula-theme-from-intellij)
- エディタ内でデータベースを扱える[SQLTools](https://marketplace.visualstudio.com/items?itemName=mtxr.sqltools)

## おわりに
前からIntellijから乗り換えたかったんですが、Metalsのおかげでだいぶ普段使いができるようになったと思います。
動作が軽くなって、しかも無料でペアプロできるのですが、Scalaに関する機能はまだまだ発展途上です。
Intellijも進化していてときどき浮気したくなりますが、これからもMetalsの動向をウォッチしておきます。