VSCodeで最強のElixir開発環境を構築する

# VSCodeで最強のElixir開発環境を構築する

## 対象読者
- _VSCode_を使用したい
- いいIDEを知らないから教えて
- _VSCode_を使っているけど、_ElixirLS_の拡張が上手く動かない

※筆者の環境はmacOSです。

## なぜこの記事を書いたか
_VSCode_を使いたいと思って、Elixirの色々なプラグインを試しましたが、なかなか上手く使いこなすことが出来ませんでした。
Elixirのプラグインが動かない!!と思っている方は[こちら](#ここでハマった)を読んで試してみてください。

## _VSCode_

まずは[_VSCode_](https://code.visualstudio.com/docs?dv=osx)をインストールしてください。

_VSCode_にお好みのプラグインをインストールします。
プラグインの追加は、画面の左ペインのブロックの塊みたいなやつから設定できます。
![Screen Shot 2020-05-27 at 14.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/c74dc0b7-2029-2467-ca42-7305d5f27726.png)

_VSCode_に設定するプラグインについては色々な記事があります。
- [VSCode に必ず入れておきたい拡張機能](https://qiita.com/ucan-lab/items/e85931bf8276da43cc97)
- [これがなくては生きていけないVS Codeエクステンション10選](https://qiita.com/rana_kualu/items/9f6919311f1407a71c5f?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=61f4015394-Qiita_newsletter_412_05_27_2020&utm_medium=email&utm_term=0_e44feaa081-61f4015394-32962285)

参考までに私がインストールしているプラグインの中で、特に重要度の高いものを3つピックアップしました。

- Vim
  - Vim キーバインディングを実現する。これがなければ_VSCode_は使わない。
- Project Manager
  - 各プロジェクトの切り替えを簡単に行う。
- GitLens
  - Gitを使うならば欲しい。
  - _change_ファイルや_unstage_ のファイルの閲覧が簡単に出来る。
  - エディター画面で行単位で直近のコミット履歴が見れる。

他にもPythonやJavaScript等の各言語向けのプラグインを追加します。

# Elixirを利用する上で最強のプラグイン
[_ElixirLS_](https://github.com/JakeBecker/vscode-elixir-ls/blob/master/README.md)のプラグインをインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/5813b466-4e0d-9e39-42b6-674707acfff3.png)
※[少し前](https://github.com/elixir-lsp/elixir-ls/issues/170)までは_ElixirLS Fork_のレポのものが最新でしたが、Forkされていたものがオリジナルのレポにマージされました。

## 何が出来るのか?
- オンマウスで関数のコメントを表示する
  - ![Screen Recording 2020-05-27 at 15.31.14.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/d75a03ab-7262-ad06-7692-812501f2f475.gif)
- メソッドの定義へ飛ぶ(Go to definition)(
  - ![Screen Recording 2020-05-27 at 15.49.07.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/fad956d3-72fc-d8c0-0268-25efcb65b05d.gif)
- メソッド補完
  - ![Screen Recording 2020-05-27 at 15.53.05.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/b64a4187-6e49-bc1f-30ad-b1822b7b778d.gif)
- エラーの警告
  - <img width="911" alt="Screen Shot 2020-05-27 at 15.54.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/bb3cfb0e-b3cf-654e-060d-6e7daf22606a.png">
 
### 他にも以下の様な機能が揃っています。
- syntax highlighting
  - メソッドや変数、文字列をわかりやすく表示してくれます。
- カッコの補完
  - 閉じるカッコを自動で保管してくれます
- コードのフォーマット修正(Alt + Shift + F)

## ここでハマった

### メソッドの定義に飛ばない

オンマウスで関数のコメントを表示することは出来るが、メソッドの定義に飛んでくれない。
正直、これはメチャクチャハマりました。
メソッドの定義に飛ぶことが出来ないなんて、エンジニア一年生でも許容できないでしょう。

これに該当している人は以下を試してください。

- Elixir関係の複数のプラグインを入れている。
  - _vscode-elixir_等のプラグインを設定している方は無効化(要再起動)してください。
- Elixirをsourceからインストールする
  - ElixirLSのGithubに[Issue](https://github.com/JakeBecker/vscode-elixir-ls/issues/123)として登録されていますが、これに該当している可能性があります
  - 解決策としては、Elixirをsourceからインストールすることですが、[asdf](#asdf)というプラグインを入れることで簡単に出来ます。
- 上記を試してもサジェストされない場合、一度VSCodeを落として.elixir_lsディレクトリーを削除して再度起動して下さい。dialyzerが再度ビルドされて正常に動くようになる可能性があります。

### Enterキーでサジェストが確定出来ない
ElixirLSではデフォルトでサジェストの受け入れを_tab_のみに設定しています。
`"editor.acceptSuggestionOnEnter": "on"`
を設定することで、Enterキーでサジェストを確定できるようになります。

## asdf
[asdf](https://github.com/asdf-vm/asdf)はオープンソースツールで、複数の実行環境を管理することが出来ます。
[asdfのインストール方法](https://asdf-vm.com/#/core-manage-asdf-vm)はこちらから確認できます。
macOSの場合、Homebrewでインストールできます。
`brew install asdf`
あとは使っているShellのタイプに応じて、Shellのコンフィグファイルに以下のような設定を追記します。
以下は_ZSH_の場合の例です。
~.zshrcに以下を追記します。
`. $(brew --prefix asdf)/asdf.sh`
これでasdfの準備は完了です。
Elixirを使えるように、以下のプラグインの追加を実行してください。
`asdf plugin-add erlang`
`asdf plugin-add elixir`
Elixirを使用したい任意のディレクトリで、以下の様にターミナルからコマンドを打つだけです。
`asdf install elixir ref:51c95b60004d3d9d297fff23f576bdd97c931afd`
`ref:51c・・・` の部分は[Elixir](https://github.com/elixir-lang/elixir)のコミットのrefです。  
任意のバージョンを探して指定してください。

## 最後に
私もまだまだ_VSCode_や_Elixir_について勉強中の身ですので、ここで詰まった、や、こういう方法がいいなど、ご意見がありましたらぜひ伺わせて頂きたいと思います。