Windows10上のSpacemacsでMetalsを使う

SpacemacsでScalaを使う際、合わせて `Ensime` or `Metals`を使うと良さそう。定義ジャンプや補完機能が充実している。

ただ、[Windows10でEnsimeを使った際に定義ジャンプが一手間必要](https://qiita.com/v2okimochi/items/bd5e8726599a45c70bcd)でしんどさを感じたので、本稿ではMetalsを使う。

Ensimeはドキュメントに従えば良いが、Metalsはところがぎっちょんなのでメモ。





# Metals Serverのインストール
[Spacemacs公式 developブランチ Scala Layerドキュメント Metalsの章](https://github.com/syl20bnr/spacemacs/tree/develop/layers/+lang/scala#metals)より、

> Currently, you must manually install the metals server. It is possible to do so via coursier; the latest version can be built using the following commands, where 0.7.6 can be replaced with the current version of Metals:

```
＿人人人人人人人人人人人＿
＞  manually install  ＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣
```

Ensimeと違い、手動インストールを迫られている :innocent: 


## Coursierのインストール
Spacemacs公式ドキュメントでは、 Coursier経由でのインストール方法が書かれている。

まずCoursierをインストールする。

[Coursier公式ドキュメント](https://get-coursier.io/docs/cli-overview.html#windows)より、Windowsでは以下の2コマンドからダウンロードしてくるようだ。

```powershell
bitsadmin /transfer downloadCoursierCli https://git.io/coursier-cli "%cd%\coursier"
bitsadmin /transfer downloadCoursierBat https://git.io/coursier-bat "%cd%\coursier.bat"
```

`bitsadmin`コマンドはPowerShellで使える。が、

```
BITSADMIN version 3.0
BITS administration utility.
(C) Copyright Microsoft Corp.

Unable to add file - 0x80070057
パラメーターが間違っています。
```

:innocent: :innocent: :innocent: 

同じような問題での質問があり、解決策が示されていた。
[BitsAdmin URI Query → Unable to add file to job - 0x80070057 The parameter is incorrect](https://superuser.com/questions/1422118/bitsadmin-uri-query-%E2%86%92-unable-to-add-file-to-job-0x80070057-the-parameter-is-in)

回答者は14年前の議論を発掘していて（すごい）、曰く「絶対パスで書け」っぽい。
つまり先ほどの2コマンドは、ファイルのダウンロード先を **以下のように絶対パスで**書く必要がある。


```powershell
bitsadmin /transfer downloadCoursierCli https://git.io/coursier-cli C:\coursier\coursier
bitsadmin /transfer downloadCoursierBat https://git.io/coursier-bat C:\coursier\coursier.bat
```

※ Cドライブ直下に `coursier`ディレクトリがある状態で実行すれば、そのディレクトリ内にダウンロードされる

最後に、ダウンロードした2ファイルがあるディレクトリを環境変数Pathに追加する。この後に起動したPowerShellで、 `coursier`コマンドが使えるはず。

なお、 `ERROR: JAVA_HOME is set to an invalid directory`エラーが発生した場合は、環境変数 `JAVA_HOME`の値が `～/bin`まで含まれている可能性がある。
`JAVA_HOME`の値はbinディレクトリの直上にとどめると解決する（代わりに環境変数 `Path`で `%JAVA_HOME%/bin`のように指定する）
参考 => https://qiita.com/toon258/items/6c85d6a7183f715482bd


## Metalsのインストール
Spacemacs公式で紹介されているコマンドはこれ（なおPowerShellでは動かない :innocent: ）

```shell
./coursier bootstrap \
  --java-opt -Xss4m \
  --java-opt -Xms100m \
  --java-opt -Dmetals.client=emacs \
  org.scalameta:metals_2.12:0.7.6 \
  -r bintray:scalacenter/releases \
  -r sonatype:snapshots \
  -o /usr/local/bin/metals-emacs -f
```

PowerShellではこう。
`C:\user_installs\metals-emacs\`に最新版をインストールした）

```powershell
coursier bootstrap `
--java-opt -Xss4m `
--java-opt -Xms100m `
--java-opt -Dmetals/client=emacs org.scalameta:metals_2.12:0.8.4 `
-r bintray:scalacenter/releases `
-r sonatype:snapshots `
-o C:\user_installs\metals-emacs\metals-emacs -f
```

- PowerShellでは、改行エスケープが ``` ` ```らしい。  
  参考 => https://qiita.com/yumura_s/items/2760de1ff5807695fbba
- PowerShellで素直に `.`を使うとコケる。 `/`を書くと `.`になるっぽい（ほんとでござるか？）  
  参考 => https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/java.html


最後に環境変数 `Path`にMetalsのあるディレクトリを追加する。




# .spacemacsの設定
[Spacemacs公式ドキュメント](https://github.com/syl20bnr/spacemacs/tree/develop/layers/+lang/scala#backends)に従い、設定ファイル `.spacemacs` ( `Space f e d`)に以下を追記する。

```emacs-lisp
(setq-default dotspacemacs-configuration-layers
  '(
      (scala :variables scala-backend 'scala-metals) ; この位置
  )
)
```

Language Serverは自動でLSPを使うが、別途に設定する場合は [LSP Layer](https://github.com/syl20bnr/spacemacs/tree/develop/layers/%2Btools/lsp)があるのでSpacemacsの設定に加えられそう。





# おまけ
- Metalsを最初に使うとき、projectどこにするか訊かれたのでちゃんとソースファイルが属するプロジェクトのディレクトリ名を選択した（その時点で `.metals`ディレクトリが作成されるので、以降は訊かれなくなる）
- Metalsを起動すると、しばらくの間CPUが100%に貼り付いてしんどい… :innocent: どうして