2018年に向けてNeoVim&dein.vimを整えた

こちらは[フロムスクラッチ Advent Calendar 2017の4日目](https://qiita.com/advent-calendar/2017/fromscratch)の記事です。

## はじめに
- 普段はIDEやAtomなどを全く使わず、VimでRubyやらJavaScriptを書いています。
- [実践Vim](http://amzn.asia/fUMRdSG)を読んだものの、思考のスピードで編集できるほどのVim力はないです。

## やりたいこと
- literally the future of vim（直訳：文字通りvimの未来）と強気なNeovimを使ってみたい。
- 2年前からメンテしていなくてぶっちゃけ重い.vimrcをキレイにしたい。
- NeoBundleからとりあえずdein.vimに乗り換えた状態なので、使いこなしたい。具体的にはプラグインのTOML化を目指す。


## 環境
- MacBook Pro（Retina, 13-inch, Early 2015）
- macOS High Sierra Version 10.13.1
- Homebrewは導入済み

## NeoVimのインストール
まず最初にNeoVimをHomebrewを使ってインストールします。

```console
$ brew install neovim
$ nvim
```
![neovim初起動.png](https://qiita-image-store.s3.amazonaws.com/0/77941/b644e704-63c8-f705-ae58-0830a20da6a5.png "neovim初起動.png")
こんな感じでNeovimを起動することができました。

### 設定ファイルのパス
デフォルトだと`~/.config/nvim/init.vim`を読み込むようです。
僕はそういった類いのものは`dotfiles`でまとめて管理しているので、`.zshrc`に以下の記述を足しました。
こうすることで`~/dotfiles/nvim/init.vim`が設定ファイルになります。

```zsh:.zshrc
export XDG_CONFIG_HOME=$HOME/dotfiles
```

## 設定ファイルとの戦い

### dein.vimリポジトリのgit clone
任意のディレクトリにdein.vimをgit cloneします。

```console
$ mkdir -p ~/dotfiles/.vim/dein/repos/github.com/Shougo/dein.vim
$ git clone git@github.com:Shougo/dein.vim.git \
    ~/dotfiles/.vim/dein/repos/github.com/Shougo/dein.vim
```

### nvim/init.vimへの設定追加

ミニマルな設定をinit.vimに追加しました。

```vim:~/dotfiles/nvim/init.vim
" dein.vimによるプラグイン管理
if &compatible
  set nocompatible
endif

" dein.vimのclone先を指定する
set runtimepath+=~/dotfiles/.vim/dein/repos/github.com/Shougo/dein.vim

call dein#begin(expand('~/dotfiles/.vim/dein'))

call dein#add('Shougo/dein.vim')
call dein#add('Shougo/vimproc.vim', {'build': 'make'})

" 補完、スニペット
call dein#add('Shougo/neocomplete.vim')
call dein#add('Shougo/neosnippet')

" その他必要なプラグインはこちらに追加する

call dein#end()
```

一度NeoVimを終了し、再度立ち上げてから`:call dein#install()`でプラグインのインストールができます。
ここまででdein.vimの導入は終了です。

### プラグインのTOML化
プラグインをTOMLにして別ファイルで管理ができるようなので、こちらを試してみます。

```vim:~/dotfiles/nvim/init.vim
" dein.vimによるプラグイン管理
if &compatible
  set nocompatible
endif

" dein.vimのclone先を指定する
set runtimepath+=~/dotfiles/.vim/dein/repos/github.com/Shougo/dein.vim

let s:dein_dir = expand('~/dotfiles/.vim/dein')

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

    call dein#load_toml(s:dein_dir . '/plugins.toml', {'lazy': 0})
    call dein#load_toml(s:dein_dir . '/lazy.toml', {'lazy': 1})

    call dein#end()
    call dein#save_state()
endif
```
init.vimはこんな感じに書き換える。

```toml:~/dotfiles/.vim/dein/plugins.toml
[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]] # 非同期処理
repo = 'Shougo/vimproc.vim'

[[plugins]] # colorschema
repo = 'chriskempson/vim-tomorrow-theme'

[[plugins]] # slimのハイライト
repo = 'slim-template/vim-slim'

[[plugins]] # ES6のハイライト
repo = 'othree/yajs.vim'

[[plugins]] # インデントを見やすく
repo = 'Yggdroot/indentLine'

[[plugins]] # j,kによる移動を爆速に
repo = 'rhysd/accelerated-jk'
```

```toml:~/dotfiles/.vim/dein/lazy.toml
[[plugins]] # 補完
repo = 'Shougo/neocomplete.vim'

[[plugins]] # スニペット
repo = 'Shougo/neosnippet'

[[plugins]] # スニペット
repo = 'Shougo/neosnippet-snippets'

[[plugins]] # メソッドの定義元にジャンプ
repo = 'szw/vim-tags'

[[plugins]] # Rubyのend補完
repo = 'tpope/vim-endwise'

[[plugins]] # ローカル変数ハイライト
repo = 'todesking/ruby_hl_lvar.vim'
```
これでプラグイン管理が相当スッキリしました。
2年間放置していた.vimrcがかなりキレイになりました。

## 終わりに
- NeoVim導入してみたけど、通常のVimと比べてすごい！！感動する！！という感じはない。
- プラグインを色々入れては見るものの、普段からよく使っているものは少ないから定期的に整理したい。
- .vimrc(init.vim)がかなり整理できたのが収穫。