NeovimにRustの開発環境を構築する

この記事は [ユニークビジョン株式会社 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/uniquevision) の9日目の記事です。

# はじめに
社内でRustを使う風潮になってきているので、
Neovimに、Rustの開発環境を構築してみます。
ほぼプラグインの紹介になります。

# プラグインマネージャーを導入する
プラグインの導入・管理を簡単にするため、プラグインマネージャーを導入します。
本記事では、[dein.vim](https://github.com/Shougo/dein.vim)を導入します。
`~/.config/nvim/init.vim`に以下を追記します。

```vimscript:~/.config/nvim/init.vim
" dein.vimのディレクトリ
let s:dein_dir = expand('~/.vim/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

" なければgit clone
if !isdirectory(s:dein_repo_dir)
  execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
endif
execute 'set runtimepath^=' . s:dein_repo_dir

if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)

  " 管理するプラグインを記述したファイル
  let s:toml = '~/.dein.toml'
  let s:lazy_toml = '~/.dein_lazy.toml'
  call dein#load_toml(s:toml, {'lazy': 0})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})

  call dein#end()
  call dein#save_state()
endif

" その他インストールしていないものはこちらに入れる
if dein#check_install()
  call dein#install()
endif
```

動きとしては、指定した箇所に`dein.vim`が入っているかチェックし、
入っていなければ`git clone`します。
また、プラグインの情報を外部のTOMLファイルにまとめることができ、
`call dein#load_toml(s:toml, {'lazy': 0})`ではプラグインの情報をまとめたTOMLファイルを読み込んでいます。
プラグインの情報はこのTOMLファイルに書き込んでいくことになります。
ここではホームディレクトリ直下に置くように指定していますが、お好みで場所を変えてください。
最後に、プラグインがインストールされているかチェックし、インストールされていないものはインストールします。

# Language Server Protocolを導入する
Language Server Protocolを導入すると、入力補完であったり、定義位置ジャンプなどが簡単にできるようになります。
Language Serverの導入には、[coc.nvim](https://github.com/neoclide/coc.nvim)を使います。

`.dein.toml`に以下を追記します。

```vimscript:.dein.toml
[[plugins]]
repo = 'neoclide/coc.nvim'
rev = 'release'
hook_add = '''
  nnoremap [coc] <Nop>
  nmap <space>c [coc]
  nmap <silent> [coc]f <Plug>(coc-format)
  nmap <silent> [coc]<space> :<C-u>CocList<cr>
  nmap <silent> [coc]rn <Plug>(coc-rename)
  nmap <silent> [coc]h :<C-u>call CocAction('doHover')<cr>
  nmap <silent> [coc]d <Plug>(coc-definition)
  nmap <silent> [coc]rf <Plug>(coc-references)
'''
```

`hook_add`ではよく使う機能をキーマップしています。
中でも特によく使うのは定義元へのジャンプ(`<Plug>(coc-definition)`)や、
関数や変数の型や定義の表示(`:call CocAction('doHover')<cr>`)です。

上記を追記したら、neovimを再起動するか、`:source ~/.config/nvim/init.vim`としてください。

## coc-rust-analyzerを入れる
[coc-rust-analyzer](https://github.com/fannheyward/coc-rust-analyzer)
nvim内で、以下のコマンドを実行してください。

```vim
:CocInstall coc-rust-analyzer
```

必要なファイルが足りなければインストールするか聞いてくれますので、
都度インストールすると良いと思います。

これで`.rs`ファイルを開いたときに、入力補完などをしてくれるようになります。

# その他便利なプラグイン
Rustとは直接関係ありませんが、
あると便利なプラグインをいくつか紹介します。

## vim-quickrun
[vim-quickrun](https://github.com/thinca/vim-quickrun)
`:QuickRun`とすることでウィンドウに表示されているプログラムを実行してくれます。
また、`<Leader>r`と打っても実行できます。`<Leader>`はデフォルトで`\`なので、
変更していなければ`\r`と打つことでプログラムを実行できます。
保存するほどでもない簡単なプログラムを実行したり、動作を見ながらコーディングしていくのに便利です。

## fzf
[fzf.vim](https://github.com/junegunn/fzf.vim)
導入が若干面倒ですが、便利なプラグインです。
Gitで管理されているファイル一覧や、バッファにあるファイル一覧などを表示でき、
表示したファイルはファジー検索できるので、ファイルの移動はこれだけでもいいくらい便利なプラグインです。

## vim-fugitive
[vim-fugitive](https://github.com/tpope/vim-fugitive)
Vimで動くGitのクライアントです。
Git diffがVim上で見れたり、addしてcommitする流れが簡単にできたりと、
Gitを使った開発をするのであれば入れておくと便利なプラグインです。

# おわりに
Language Serverはとても強力な上、導入もかなり楽になっているのはとても嬉しい点です。
ただ、coc-rust-analyzerを導入するのにexコマンドを打つ必要があるのが若干気になるところで、
できればここもファイルで管理したい気持ちがあります。
いずれ気持ちが向いたときにここらへんはちゃんと整理したいと思います。