rust-analyzerをVimで使う

Rustのコーディングを支援する[rust-analyzer](https://rust-analyzer.github.io)が、少し前にアルファリリースを迎えたとか今後は公式の標準的なツールになるとかの噂を聞き、自分のVim環境に入れてみようと思いました。
しかしrust-analyzerを使おうと[User Manual](https://rust-analyzer.github.io/manual.html)を見ると、まずcoc.nvimを入れろと言われ、coc.nvimのためにはPluginをどーのこーのとかバージョン要件がどーのとか言われ、最近のモダンなVim環境をちゃんと構築したことがない初心者には少ししんどいところもあったので、イチからの構築手順を記録しておこうと思います。

# 構築手順

使うツールとしてはこんな感じです。
ベースとなるシステムはLinux（Debian）になります。

- Neovim
- Vundle
- coc.nvim
- rust-analyzer

NeovimとVundleあたりは他の選択肢があります。
以下で各手順について詳しく説明していきます。

### Neovim

恥ずかしながら今まで存在を知りませんでした。Neovimが何者かというのを正確に伝えるのは難しそうなので[公式ドキュメント](https://neovim.io)に目を通して頂くとして、まあ新しいVimの別実装くらいに思っておけばいいのではないでしょうか。

rust-analyzerはVimでもNeovimでも使えるようですが、どちらも結構新しめのバージョンが必要で、パッケージマネージャ（apt）でインストールされるものでは対応できませんでした。なので、現時点ではどちらを選択するにせよ自力で用意する必要があります。

その点でNeovimはめちゃくちゃ楽です。[リリースページ](https://github.com/neovim/neovim/releases)にアクセスし、Assetsにある自分の環境に合ったtarballをダウンロードして展開すれば使えます。バージョンはある程度新しければ何でもいいと思いますが、stableあたりが安心なのではないでしょうか。

```
$ wget https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz
$ tar xzf nvim-linux64.tar.gz
$ cd nvim-linux64/bin/
$ ./nvim
```

ちなみにVimは自分でビルドする必要がありますし、環境設定がややこしくて私は途中でめげました、、、


### Vundle

VundleはVimのプラグインマネージャーです。Vimのプラグインマネージャーはいろいろあって、例えばcoc.nvimの手順例ではvim-plugが使われているようです。そこまで強い理由はないのですが、前から使っているのでVundleを選択しました。

導入は[Vundleのリポジトリ](https://github.com/VundleVim/Vundle.vim)にあるQuick Startの手順でやれば問題ありません。まずVundleをgitでcloneしてきます。

```
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
```

次にinit.vimに設定を書き込みます。Vimでいう`~/.vimrc`は、Neovimの場合`~/.config/nvim/init.vim`が相当することに注意して下さい。公式の.vimrcは設定例なども含まれていて長いですが、最低限これだけあれば大丈夫です。

```vimscript:init.vim
set nocompatible
filetype off

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

" Pluginを追加する場合はここに記載します。

call vundle#end()
filetype plugin indent on
```

nvimを立ち上げて`:PluginInstall`を実行すればVundleの設定完了です。


### coc.nvim

coc.nvimは、LSPクライアントとして動作してくれるいろいろ便利なVimのプラグインです。rust-analyzerがLSPサーバなので、ここではその対となる存在ですね。[リポジトリ](https://github.com/neoclide/coc.nvim)のQuick Startでは上述した通りプラグインマネージャーにvim-plugを使っていますが、ここではVundleを使った手順で説明していきます。

coc.nvimにはNode.jsが必要なのでインストールしておきます。また、公式手順には記載がないようですが、yarnもないといけないようなので、そちらもインストールします。

```
# curl -sL install-node.now.sh/lts | bash
# npm install -g yarn
```

Vundleでの追加は、[Vim Awesomeのcoc.nvimのページ](https://vimawesome.com/plugin/coc-nvim)に従ってやっていきます。先ほど作ったinit.vimに`Plugin 'neoclide/coc.nvim'`を追加し、`:source %`、`:PluginInstall`と打ちます。加えて、`:CocInstall coc-json coc-tsserver`と打てば、coc.nvimの準備完了です。

もしVimもしくはNeovimのバージョンが足りていない場合は、立ち上げた際にcoc.nvimが警告を出してくれます。


### rust-analyzer

ようやく下準備が完了したので、これでrust-analyzerが入れられます。

公式手順には、まずrust-analyzerの本体をインストールしろと書いてありますが、実はここでやらなくても、coc.nvimが検知してうまくやってくれます。なのでこの手順は飛ばしても問題ないですが、一応載せておきます。

```
$ curl -L https://github.com/rust-analyzer/rust-analyzer/releases/latest/download/rust-analyzer-linux -o ~/.local/bin/rust-analyzer
$ chmod +x ~/.local/bin/rust-analyzer
```

後は簡単です。nvimを立ち上げて`:CocInstall coc-rust-analyzer`と打ちます。本体のインストールを飛ばした場合は、再度立ち上げたときに本体をインストールするか聞かれるので、そこでお願いすれば設定完了になります。

お疲れ様でした！


# おまけ

基本的にはこれで完了ですが、個人的にやったこと、はまったことについても残しておきます。

### 動作のチューニング

細かい動作のチューニングパラメータは[coc-rust-analyzerのリポジトリ](https://github.com/fannheyward/coc-rust-analyzer)に記載があります。また、ここに記載があるrust-analyzerとしてのパラメータとは別に、coc.nvim自体の設定もあります。設定は`:CocConfig`から行うか、直接`~/.config/nvim/coc-settings.json`を編集しても問題ありません。

私はとりあえず、補完候補を表示する際に第一選択肢が最初から選択状態になるように`suggest.noselect`を無効にしました。

```json:coc-settings.json
{
 "suggest.noselect": false                                  
}   
```

まだ使い始めたばかりなので、細かいチューニングはこれから少しずつやっていきたいですね。

### screen/tmuxとの併用

私はGNU screenを愛用していたのですが、なぜかscreenとrust-analyzerを併用したときだけ表示が崩れるという問題があり、いろいろ頑張ったものの解決するには至りませんでした、、

なので同じような機能を提供してくれるtmuxを試してみたところ、こちらでは表示が崩れずうまくいき、とりあえずは乗り換えて使っていくことにしました。screenとtmuxは使い勝手も近いので移行はそこまで大変ではなく助かりました。


### 表示が一部消えてる？

rust-analyzerでは特定の補完候補にカーソルを合わせると標準ライブラリの説明を表示してくれたりするんですが、その中のコードの一部が背景色と同じになっているのか、うまく表示されないんですよね。colorscheme変えてみたりするもうまくいかず、、もし解決策ご存じの方がいましたらコメント頂けるとうれしいです。


# 感想

少し苦戦したところもありましたが、rust-analyzerでより快適なVim+Rustの生活を送ることができそうです。組み合わせによっては挙動（表示？）があやしい部分も見られましたが、逆に言うとまだまだ発展途上のツールたちなので、今後の修正や機能追加も注目ですね。