まじで最＆高のvim環境を作りたい1

どうも、プログラミングを始めて一年ちょいくらいの初心者エンジニアです
普段はscalaを主に書いていて、ちょこちょこAngularとかも書いてます

両方vimを使って書いてますが、定義元ジャンプとか補完機能とかはやっぱりIDEとかVScodeの熱いプラグインが優秀すぎて。。。

じゃぁそっち使えよって話なんですが、基本的なターミナルでの操作がしっかりできるようになるまではIDEじゃなくてemacsとかvim使おうって会社のCTOに言われて一旦emacsを使い始めたんですが、emailはカスタマイズの記事がなさすぎてvimに移行しました。
ちなみにCTOはeamcs派（エディタ戦争w）

でもやっぱり強い補完機能、定義元ジャンプ、構文エラーくらいは教えて欲しい。。。

そしたら最近vim-metalsとかいうプラグインが激アツとの情報が流れてきたので入れてみたんですが神すぎたので共有します


| 環境       |        |
|:-----------------|------------------:|
| OS|              　　　　　　MacOS |
| vimのプラグイン管理|            Plug |
|   terminal  |    hyper    |
| 言語    | Scala |


※ただちゃんと理解はできていないのでおかしいところあったら教えてください:bow_tone1:

それでは早速インストールしていきましょうー！！
[Vim・Metals](https://scalameta.org/metals/docs/editors/vim.html)
## JDKのバージョン確認
```console
$ java -version
openjdk version {1.8系}
```
JDKのバージョンが8系であることを確認してください
９から上はサポートされてないらしいのでもしバージョンが違う場合はJDK８に変えてください

## Vimのバージョン確認
```console 
$ vim --version | head
VIM - Vi IMproved 8.1 (2018 May 18, compiled Feb 19 2019 12:07:03)
```
vimのバージョンは8.1以上じゃないとダメらしいので確認してください
## coc.nvimのダウンロード
Langage Serverっていう各言語ごとの、補完、定義元ジャンプ、ソースコードのエラー解析みたいな機能を提供してくれるものがあるらしく(IDEも要するにこれを使ってあの最強の環境を実現してると)
それらをまとめて管理できるものを入れないといけない(そゆわけでもないのかな)
いくつかあるんだけど一番人気なのはこれらしい

https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md
`LSP(Langage Server Protocol)っていう各言語ごとの補完とかを提供する際の規約をMicroSoftがちょっと前に定めたらしい。`

ちょっとよくわからない。

まぁいいやとりあえずインストール

```console
#coc.nvimを使うにはnode.jsが必要なので入れるのと
#yarnで拡張機能を管理できるので入れる

$curl -sL install-node.now.sh/lts | sh
$curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
```

できたら`Plug`っていうvimプラグイン管理ツールを使って`coc.nvim`をInstall

ない人は入れてください
[vim-plug導入](https://qiita.com/kouichi_c/items/e19ccf94b8e5ab6ed18e)

```vim
" ~/.vimrc

" Configuration for vim-plug
Plug 'derekwyatt/vim-scala'
Plug 'neoclide/coc.nvim', {'do': { -> coc#util#install()}}

" Configuration for vim-scala
au BufRead,BufNewFile *.sbt set filetype=scala
```
そんで`:PlugInstall`してください

できたら`~/.vim/coc-settings.json`に以下を追記してください

```json
{
  "languageserver": {
    "metals": {
      "command": "metals-vim",
      "rootPatterns": ["build.sbt"],
      "filetypes": ["scala", "sbt"]
    }
  }
}
```
次にCoursierっていうCLIを使って最新のMetalsをビルドします

```console
# Make sure to use coursier v1.1.0-M9 or newer.
$curl -L -o coursier https://git.io/coursier
$chmod +x coursier
$./coursier bootstrap \
  --java-opt -Xss4m \
  --java-opt -Xms100m \
  --java-opt -Dmetals.client=coc.nvim \
  org.scalameta:metals_2.12:0.5.2 \
  -r bintray:scalacenter/releases \
  -r sonatype:snapshots \
  -o /usr/local/bin/metals-vim -f
```


できたらいけてるはず

## Scalaのプロジェクトを開いてみる
初めてbuild.sbtを開くとビルドをインポートしますかって聞かれるので1と入力する
<img width="957" alt="スクリーンショット 2019-05-25 22.50.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/0363f511-b7e7-b16b-96e6-bbcb1c2402d1.png">
頑張ってる
<img width="278" alt="スクリーンショット 2019-05-25 22.53.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/0aa84ed8-6bec-eec7-1451-bcc47a7cb2b0.png">
でけた
<img width="224" alt="スクリーンショット 2019-05-25 22.54.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/9e76b24a-251b-6bd7-a029-1a2cc42fd9bb.png">

## vimが最＆高に近づいてることを確認
<img width="356" alt="スクリーンショット 2019-05-25 22.58.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/806e2e33-8ae5-91d5-8076-c1c534a2411a.png">
怒ってくれた

Importとか
<img width="723" alt="スクリーンショット 2019-05-25 23.03.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/25488aee-503d-b76d-78e0-57c6ae7d6f76.png">
こんな手厚い補完が...
選択すると
<img width="349" alt="スクリーンショット 2019-05-25 23.03.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/e949488e-7595-42fa-5450-46cc7d9cd2b6.png">
全部書いてくれる。マジすばらしい
それだけじゃない！！
<img width="666" alt="スクリーンショット 2019-05-25 23.05.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/bd00aa28-b827-d96b-c71b-eb3a239ef04c.png">
なんとわざわざimport書かなくても、、、、、
<img width="356" alt="スクリーンショット 2019-05-25 23.05.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/0620b349-cc5b-9dfe-87a4-11b70abb507a.png">
オートインポートしてくれる

しかもしかも！
メソッドの補完までしっかりと。
<img width="1097" alt="スクリーンショット 2019-05-25 23.06.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/b33b18fd-c8c4-6ea4-4960-da6fb0af1d78.png">
importのソートもしてくれる
:SortScalaImports
ってコマンド打つとimportを言語の規定に沿ってsortしてくれる（いまいちわからんけど）
<img width="307" alt="スクリーンショット 2019-05-25 23.10.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/3cae60df-aab6-c872-469e-f683158d2b93.png">

`.vimrc`ファイルに以下を追記して

```vim
" Remap keys for gotos
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
```
適当にメソッドの上で`gd`とかやると
<img width="385" alt="スクリーンショット 2019-05-25 23.41.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/6f1238ac-6e8c-8e7e-8dfc-4c635b876246.png">
GOD
<img width="880" alt="スクリーンショット 2019-05-25 23.41.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238826/2f34cc2e-b151-1f12-fccf-6dd1b67dbb8d.png">



###最&高に近づいたね


今回の記事に関係するリンクは以下です
[Vim・Metals](https://scalameta.org/metals/docs/editors/vim.html)
[vim-plug導入](https://qiita.com/kouichi_c/items/e19ccf94b8e5ab6ed18e)
https://github.com/blueshirts/darcula
https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md
[あなたの sbt update を爆速にする sbt-coursier の紹介](https://gist.github.com/gakuzzzz/49b78acfe1401fd8047c7a0f0d981cfa)
https://hyper.is

よかたらこちらも〜〜〜
[まじで最＆高のvim環境を作りたい2](https://qiita.com/KaoruIto76/items/002d9658b890fb6392f9)