VimmerがRuby on Railsを書くときに使えるVimプラグイン集 2019

vimでRuby on Railsを書くときに重宝するプラグインを紹介します。

  - **NERDTree** 　　ファイルツリー
  - **vim-rails** 　　　ファイル移動、Railsコマンド実行
  - **fzf.vim** 　　　　インクリメンタル検索
  - **vim-endwise** 　`if` や `def` などの `end` 補完
  - **coc.nvim** 　　　補完
  - **ale** 　　　　　　静的解析

設定例として、自分の`.vimrc`に書いている設定を載せてます。

## [NERDTree](https://github.com/scrooloose/nerdtree)
scrooloose/nerdtree
ファイルツリー機能が使えます。ド定番です。
![nerdtree2.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/a830ca3e-a8ec-b561-c9e5-1432a25a2225.gif)

> 参考
[vim-plugin NERDTree で開発効率をアップする！](https://qiita.com/zwirky/items/0209579a635b4f9c95ee) @zwirky 

## [vim-rails](https://github.com/tpope/vim-rails)
tpope/vim-rails

railsプロジェクト内のシームレスな移動や、vimからのrailsコマンドの実行が出来るようになります。
![vimrails.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/18482731-68a9-9ca9-ae09-9921e85c8f19.gif)

GIFでは例として、`gf`でカーソル下の文字列から該当するファイルを開き、`:A`で対応する`spec`ファイルを開いています。

> 参考 
[vim-rails よく使いそうなやつ](https://qiita.com/bibio/items/ac3f0cb8e7949b2ce56c) @bibio

## [fzf.vim](https://github.com/junegunn/fzf.vim)
junegunn/fzf.vim

Go言語製の **fzf** と呼ばれるコマンドラインツールを使用したプラグインで、プロジェクト内のファイル名や、ソースコードの文字列あいまい検索ができます。

```vim:.vimrc
let g:fzf_action = {
  \ 'ctrl-s': 'split' }

nnoremap <C-p> :FZFFileList<CR>
command! FZFFileList call fzf#run(fzf#wrap({
            \ 'source': 'find . -type d -name .git -prune -o ! -name .DS_Store',
            \ 'down': '40%'}))

nnoremap <C-b> :Buffers<CR>
nnoremap <C-g> :Ag<CR>
nnoremap <silent> <C-]> :call fzf#vim#tags(expand('<cword>'))<CR>

let g:fzf_buffers_jump = 1

command! -bang -nargs=? -complete=dir Files
            \ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)
```

![fzf.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/873fa3d2-0c9b-4cd5-eedd-22e6d6ddfa67.gif)

GIFでは `ctrl` + `p` でファイル名検索、`ctrl` + `b`でバッファー検索をしています。
ctagsとの連携なんかもできちゃいます。

`fzf.vim` はプラグイン本体に加えて `fzf`そのもののインストールも必要になりますが、
`fzf` は `vim` 抜きにしてもコマンドラインツールとしてとても優秀なのでオススメです。

> 参考
[fzfとvimで少ない労力で作業効率を引き上げた話]
(https://qiita.com/Sa2Knight/items/6635af9fc648a5431685) @Sa2Knight
[さいつよのターミナル環境を構築しよう](https://qiita.com/b4b4r07/items/09815eda8ef72e0b472e) @b4b4r07

ファイル検索プラグインの別の選択肢として[denite.nvim](https://github.com/Shougo/denite.nvim)(unite.vimのつよいやつ)というプラグインがあります。
もっと複雑な処理を走らせたい方におすすめです。(あんまりわかってない）

## [vim-endwise](https://github.com/tpope/vim-endwise)
tpope/vim-endwise
`def`...`end`や、`if`...`end`などの対応するキーワードを自動補完してくれます。

![endwise.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/bf09aabf-250b-066f-71dc-3662655359c4.gif)

地味にきいてくる便利さです。

## [coc.nvim](https://github.com/neoclide/coc.nvim)
neoclide/coc.nvim
`coc.nvim` は `TypeScript` 製の補間プラグインです。`LanguageServerProtocol(以下LSP)`と呼ばれる、コーディング支援用のプロトコルが使用可能で、強力な補完機能が使えます。
`ruby` の場合、 [solargraph](https://github.com/castwide/solargraph)と呼ばれるLSPの `gem` を使用します。

`coc.nvim` は、 独自の設定ファイルとして `.vim/coc-settings.json` を使用します。

```json:coc-settings.json
{
  "suggest.enablePreselect": true,
  "solargraph.commandPath": "solargraphの絶対パス"
}
```

```vim:.vimrc
let g:coc_global_extensions = ['coc-solargraph']

inoremap <silent><expr> <TAB>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction
```
![coc.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/1e757978-55ee-50d4-f5af-0b694f2b73d4.gif)

右に[LS]と表記されている単語が、LSPによる補完候補です。
めっちゃ出ます。

>  参考
[LanguageServerProtocol(LSP)のススメ](https://qiita.com/himanoa/items/04a105cc9615e85ad420) @himanoa 
[neovim + coc.nvim で LSP](http://wakame.hatenablog.jp/entry/2019/03/31/124941) 藻ログ

`coc.nvim` の他にも、[asyncomplete](https://github.com/prabirshrestha/asyncomplete.vim) + [vim-lsp](https://github.com/prabirshrestha/vim-lsp) や、 [deoplete](https://github.com/Shougo/deoplete.nvim) + [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim) の組み合わせでもLSPの補完が使えます。

## [ale](https://github.com/w0rp/ale)
w0rp/ale

`gem`の`rubocop`構文エラーを自動で非同期静的解析してくれるツールです。

```vim:.vimrc
let g:ale_fixers = {
      \ 'ruby': ['rubocop'],
      \ }
```

![ale.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402968/ba5f9cd6-2af3-c294-3971-0b7dc1eb446c.gif)

`if`...`end`の`end`を消すと構文エラーを指摘してくれます。

言語ごとにfix, lintツールを指定すると`ruby`以外でも大活躍してくれます。

> 参考
[neovim + 🍻ale + 🚓rubocop](https://hoshinotsuyoshi.com/post/neovim_rubocop_autocorrect) hoshinotsuyoshi.com

# まとめ
他にも良いプラグインがあれば教えてください
それではよい vim, rails ライフを…