Vim初心者に送るカテゴリ別Vim Pluginまとめ

# 動機

最近会社に入った後輩がVimを使っていました。
彼の.vimrcはプラグインが何も入っていない非常にシンプルなものでした。
これはしめたものだぞと、良さそうなプラグインを怒涛のように勧めまくろうと思ったのですが、
勢いのままに雑多な情報を与えては彼が混乱してしまうし、
同じような系統のプラグインであっても好みによるものが多いので
自分が使っているからと勧めるのは良くないと踏みとどまりました。

というわけで一旦自分の中でプラグインに関する情報をまとめた上で、
じっくりと彼に選んでもらいたいと思い。この記事をしたためました。

~~Vim以外の記事書けって上司に言われてたのに結局またVim書いちゃったよ...~~

新人の彼は、これから深い闇に染まり混沌を愛するDarkVimmerになるのか、
Vimのデフォルトを愛しシンプルさを信仰するWhiteVimmerになるのか、
はたまたVim以外のエディタを使うのはわかりません。
しかし、それでもこういうものもあるんだなと知っておくことで、
彼のこれからのエディタ生活が、より良いものになることを願います。

## 注意

- できるだけフラットにご紹介したいですが、自分が使っているプラグインは思い入れが強いので、つい力が入る可能性があるのでご注意ください
- Vim対応とNeovim対応、それにバージョンによっては対応していない場合などあるのでご注意ください。Neovimについては[別記事](https://qiita.com/lighttiger2505/items/440c32e40082dc310c1e)にまとめたので参考にしてください
- プラグインは増やしすぎるとVimが重くなります。軽くしようと遅延ロードしまくると消耗するので、入れすぎにご注意ください

## インタラクティブフィルター系プラグイン

それにつけてもインタラクティブフィルターです。
ファイルとかタグとかヘルプとかを一覧に出力し、ファジーに絞り込むにくいやつ。
数多くのVimmerはこれを取り込んだが最後、その便利さに取り込まれて使わずにはいられない。
もはや現代のエディタに必須の機能といえるでしょう。

なお私はdenite.nvimとfzf.vimを併用しています

### ctrlp.vim

[ctrlpvim/ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim)

~~[kien/ctrlp.vim](https://github.com/kien/ctrlp.vim)~~
[kien/ctrlp.vim](https://github.com/kien/ctrlp.vim)は現在メンテナンス中止されており、[ctrlpvim/ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim)に開発が引き継がれているとのご指摘をいただきました。

- pure Vimscript により実装
- シンプルかつ豊富な拡張性
- 拡張プラグインを追加することで更に機能強化が可能

紹介するこのカテゴリのプラグインの中で、唯一 pure Vimscript (Vimscriptのみで実装されているプラグイン)のプラグインとなります。
Vimscriptのみで実装されているということは、他のプログラムを導入する必要なく、
プラグインをインストールするだけで使用することができるということです。これは非常に魅力的です。

だからといって機能が不足しているということはなく、必要十分な機能を持っています。



### fzf.vim

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

- Go実装されたインタラクティブフィルターのラッパー
- はやいはやいとにかくはやい

[fzf](https://github.com/junegunn/fzf)といばGitHub Trend(Golang)のランキング常連であり、
最もスターの多いインタラクティブフィルターコマンドとして有名です。
このプラグインはfzfをVimからコールするためのラッパーを提供し、
絞り込みはGo実装されたバイナリであるfzfにて行われます。

なんといってもその特徴は実装がGoだからこそ出せるその速度。
候補が数万ファイルあろうがいとも簡単に絞り込みをやってみせるパワフルさ。そこに痺れる憧れる。
grepしてからその結果のプレビュー表示とか、重めの処理をしてもサクサクするのはやばい。

### denite.nvim

[Shougo/denite.nvim](https://github.com/Shougo/denite.nvim)

- NeoVimのリモートプラグイン(Vim8以降ならVimでも使える)
- 豊富なオプションによる高い拡張性
- Vimと親和性の高いイカしたデザイン
- Pythonによる機能拡張

我らが暗黒美無王のお通りです。その特徴は圧倒的な拡張性。これぞ暗黒。
Python実装のリモートプラグインのため、導入は他のプラグインに比べて難易度が高めです。
しかしその拡張性故に色々自分好みにカスタマイズすると手放せなくなるほどの中毒性を持ちます。

Pythonにより絞り込みとアクションを定義したスクリプトを記述することで、
自分のサブコマンド(deniteではsourceと呼ばれます)を自作することができます。
上記でご紹介した他プラグインでもできますが、Vimscriptが苦手ならPythonで書けるのはありがたかったりします。

## ファイラー系プラグイン

Vimにはnetrwというファイラーが付属していますが、
重かったり使い勝手が良くないという理由から
ファイラー系プラグインを使用するVimmerが多いのが実情かと思います。
上記インタラクティブフィルター系プラグインを使用していればいらなくねという人も
いらっしゃるらしいのですが、私は普通にいると思っています。

ちなみに私はnerdtree使用しています。

### nerdtree

[scrooloose/nerdtree](https://github.com/scrooloose/nerdtree)

- Vimファイラー界で最も有名
- 長い歴史が培った豊富なオプションと拡張プラグイン

Vimで入れるべき必須プラグイン的な記事があると必ず紹介されています。
IDEとかAtomやVSCode等のファイルエクスプローラがVimに欲しければ、まずコレでしょうね。
その特徴はなんと言っても豊富な機能と拡張プラグインの多さです。
依存プラグインを導入することで、Gitと連携してGitStatusを表示に反映することや、
タブ間で共通のツリーを表示するといった機能拡張も可能です。

### vim-dirvish

[vim-dirvish](https://github.com/justinmk/vim-dirvish)

- シンプルなファイラー(パスナビゲータと銘打っており厳密にはファイラーでないらしい)
- 早い

起動するときれいなパスの一覧が高速で起動します。コンセプト(Lines are filepaths)が明確でかっこいい。
ファイラーなんて高速で起動して一覧が見れてファイル開けりゃいいんだよというミニマリストにおすすめです。
プラグイン組み込みのファイル操作コマンドなどがないためご注意ください。
こちらも依存プラグインでの機能拡張が可能です。

### vaffle.vim

[cocopon/vaffle.vim](https://github.com/cocopon/vaffle.vim)

- シンプルなファイルマネージャ
- 上記nerdtreeとvim-drivishの中間的な存在

シンプルながら必要十分なファイル操作機能を有したバランスの良いファイラーといえるのではないでしょうか。
個人的にnerdtreeは機能が多くUI的にちょっとかっこ悪いかもと、私も思ったりします。
複数のウィンドウでファイラーを開けるところも面白そうです。

## 拡張テキストオブジェクト系プラグイン

Vimの便利機能といえばテキストオブジェクトといった具合の文脈で紹介されていることも多いですね。
このカテゴリはそのテキストオブジェクトの拡張となります。
主に`"`, `'` ,`[` ,`{` などの囲む系文字列に対する操作を拡張してくれます。
慣れていくと面倒な囲み文字列の追加や変更、削除などをより効率的に行うことが可能となります。

私はvim-sandwichを使っています

### vim-sandwich

[machakann/vim-sandwich](https://github.com/machakann/vim-sandwich)

- 後発プラグイン
- プラグイン単体でのドットリピートの実現
- 変更対象がハイライトされたりと嬉しい機能がある

この系統のプラグインとしては後発なだけあって、
対象箇所のハイライトや、これまで複数のプラグインで実現していた操作のドットリピートなどの実現など
うまくまとまっており、ベターな選択肢な印象です。

### vim-surround

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

- Vim Pluginでは有名なtpope氏のプラグイン

このジャンルでは古株プラグインです。

## Syntaxチェック & Linter系プラグイン

Vimをコーディングで使う上で、文法チェックは非常に重要になります。
極端な話、Shellに戻ってmakeやlintを実行した後またVimに戻れば同じことはできますが、
記述したらどの行にエラーが発生しているかビジュアル的に見れたり、
QuickFixでエラー箇所の一覧を表示して快適にジャンプしたりという状態に慣れていると、
Shellで出力したファイルと行を確認して手動で移動するのは前時代的に思えます。

このジャンルはVimの非同期実行機能であるJobの登場以降、
その恩恵を最も強く受けたジャンルの一つでもあります。
Lintの実行中にコーディングをブロックしないのはとても重要ですね。

なお私はALEを使用しています。

### ALE

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

- 最近のLinter実行プラグインではディファクトになりつつある
- 非同期実行可能
- 豊富な対応言語
- 豊富なコマンドとオプション
- LSP対応

ALEは Asynchronous Lint Engine の略だそうで、その名の通りLintの非同期実行が可能です。
VimにJobが追加されて以降、古参のSyntasticのシェアを奪う怒涛の勢いで伸びてきたプラグインです。
このジャンルの現在のディファクト的な存在といえます。

対応言語の多さや豊富なコマンド、オプションには目を見張るものがあり、最近話題の Language Server にも対応しています。
インストールして充実したドキュメントに目を通せばサクッと使え、かつオプションで細かい制御が可能と優等生です。
ただ一方で豊富な機能にブロッキングされて編集のノイズになるという声も。

### neomake

[neomake/neomake](https://github.com/neomake/neomake)

- Linterというよりはmakeの置き換えだそうです
- 非同期実行可能
- ALEよりも玄人志向な印象

名前の示すとおり、Vimの組み込みコマンドであるmakeの置き換えを謳っています。
makeはコンパイルを実行し、エラーがあればその内容をQuickFixに表示する組み込みコマンドですね。
しかし、makeにはないgutterへのエラーマークの表示や
エラー箇所のハイライト表示などQuickFixを表示するだけでない現代的な仕上がりとなっています。
ALEと比べるとオプションやコマンドは少なく玄人向けという感じがしますが、ウォッチする価値があるプロジェクトだと思います。

### syntastic

[vim-syntastic/syntastic](https://github.com/vim-syntastic/syntastic)

- この系統では古株のプラグイン
- 非同期実行はできない

古株のプラグインですが、以下のIssueを見る限り今後非同期実行をサポートする気は無いようです。

- https://github.com/vim-syntastic/syntastic/issues/1876
- https://github.com/vim-syntastic/syntastic/issues/699

現在ではLinterの意義はプログラミングする高まってきており、非同期実行をサポートしていないのは厳しい印象を受けます。

## プログラム実行(ランナー)系プラグイン

コーディングしたら可能な限り早く実行したい。それがプログラマの性(さが)というものです。
私達プログラマーはその業務の中で膨大な回数のトライ＆エラーを繰り返します。
そのサイクルを高速化する上で重要なのがこのジャンルになります。

私はvim-quickrunを使用しています。

### vim-quickrun

[thinca/vim-quickrun](https://github.com/thinca/vim-quickrun)

- まさしくプログラム実行用のプラグイン
- 実験的であるもののjobやterminal

実は記述したプログラミングを実行する。
というワークに焦点を当てたプラグインvim-quickrunをおいて他にありません(私が知らないだけの可能性があるので知ってたら教えてください)
vim-quickrunを入れて、最低限の設定をするだけで各種言語で記述したプラグラムを即時実行する環境が手に入ります。
実験的な機能とのことですが、jobやterminalといった新機能をrunnerとして使用可能です。
ただし作者の方がNeovimを使用していないので、これら実験機能はVim限定です。
細かく設定することでTestのランナーとしても使用可能です。

### vim-dispatch

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

- 非同期ランナー
- tmuxやscreenと連携したりする。カッコイイ

基本的に非同期で実行し、QuickFixに流す機能のみを提供します。
なので実行には`:Dispatch respc %`など実態のプログラム入力が必要となります。
いろんな言語に対応したいのであればAutocmdでファイルタイプ別にキーバインドを設定するなどの対応が必要です。
なお[vim-test](https://github.com/janko-m/vim-test)というプラグインと連携することでテストランナーとして使用することができます。

大きな特徴としてtmuxやscreenなどのターミナルマルチプレクサを認識し、
ペイン切ってそのペイン上でプログラムを実行する機能を持っていることです。
プログラムの実行経過をリアルタイムで見ることができます。

### asyncrun.vim

[skywind3000/asyncrun.vim](https://github.com/skywind3000/asyncrun.vim)

- 非同期ランナー

上記vim-dispatch同様に非同期実行機能とQuickFix連携機能をもつランナーです。
ほとんど使ったことないのでご紹介のみにとどめます。

## 自動補完系プラグイン

実はVimにはプラグインを入れなくとも補完機能があります。
ただし明示的に`<C-p>`, `<C-n>`を使う必要があるので、自動補完ではなく手動補完です。
このジャンルは言語別プラグイン(jedi-vimやvim-go)に搭載されているパターンなどありますが、
ここでは特定言語に依存しないプラグインのみご紹介します。

割と導入ハードルが高くdeoplete.vimに満足しているため他が試せていない状態です。また余裕が合ったら追記します。

### YouCompleteMe

[Valloric/YouCompleteMe](https://github.com/Valloric/YouCompleteMe)

使ってないので紹介のみ

### deoplete.nvim

[Shougo/deoplete.nvim](https://github.com/Shougo/deoplete.nvim)

- NeoVimのリモートプラグイン(Vim8以降ならVimでも使える)
- 2017/12頃から処理並列化によりかなり高速に
- 豊富な拡張(source)により、多くの言語に対応
- [neocomplete.vim](https://github.com/Shougo/neocomplete.vim)の後継

[別記事を参照](https://qiita.com/lighttiger2505/items/e0ada17634516c081ee7#deopletenvim)

### nvim-completion-manager

[roxma/nvim-completion-manager](https://github.com/roxma/nvim-completion-manager)

使ってないので紹介のみ。
作者の興味が他に移ったため[(Issue)](https://github.com/roxma/nvim-completion-manager/issues/12#issuecomment-382334422)、現在他の方がフォークしているプロジェクトがあります。

[ncm2/ncm2](https://github.com/ncm2/ncm2)

### asyncomplete.vim

[prabirshrestha/asyncomplete.vim](https://github.com/prabirshrestha/asyncomplete.vim)

使ってないので紹介のみ。

## LSP(Laungage Server Protocol)系プラグイン

Language Serverと通信するためのクライアントです。
各言語のコーディング機能をLSのプラグインで統一できたらかなり便利になると思うのですが、
現状整備が追いついていない印象です。

こちらも自動補完系と同様に導入ハードルが高く試せていない状態です。また余裕が合ったら追記します。

なおNeovimでは本体側にクライアントをビルドインする流れもあるそうです。

- [参考Issue](https://github.com/neovim/neovim/issues/5522)
- [参考PR](https://github.com/neovim/neovim/pull/6856)

### vim-lsp

[prabirshrestha/vim-lsp](https://github.com/prabirshrestha/vim-lsp)

### vim-lsc

[natebosch/vim-lsc](https://github.com/natebosch/vim-lsc)

### languageclient-neovim

[autozimu/languageclient-neovim](https://github.com/autozimu/languageclient-neovim)

## ステータスライン拡張プラグイン

Vimはターミナル上で動作するエディタなので、その見た目は簡素でシンプルなものです。
しかしIDEに慣れ親しんだ方には、ともすれば貧弱なUIに見えることでしょう。
そんなときはステータスライン拡張プラグインです。
キャラクタベースの中で美しく見やすいステータスラインを実現してくれます。

私はlightline.vimを使用しています。

### vim-airline

- 豊富なオプションによる簡単カスタマイズ
- 他のプラグインとの連携が豊富

[vim-airline/vim-airline](https://github.com/vim-airline/vim-airline)

現状のステータスライン拡張プラグインとしてはディファクトな印象を受けます。
その理由は豊富なオプションによる簡単な表示のON/OFFや
他のプラグインとの連携による表示可能な機能の多彩さからも伺えます。

### lightline.vim

[itchyny/lightline.vim](https://github.com/itchyny/lightline.vim)

- 軽量
- プログラマブルなカスタマイズで柔軟な対応が可能

上記vim-airlineに比べ軽量に動作します。
airlineが入れてオプションで見た目を編集してくれ。といったポリシーに対し、
lightline.vimは基本機能をベースにレイアウトだけ提供して、
あとは自分でVimscript記述してカスタマイズしてくれといったポリシーであり、
プログラマブルな設定をする必要があります。
だからこそVimscriptが使える人ならかなり自由なカスタマイズが可能です

## コメントアウト系プラグイン

Vimは高度な編集機能を持っているから、
コメントアウトくらい自分でやればいいじゃんという人もいるかもしれませんが
私は無理でした。キーバインド一発でON/OFFできるのは便利です。
個人的に各プラグインの機能自体に差はないと思っているので一覧だけ置いておきます。

私はcaw.vimを使用しています

### tcomment_vim

[tomtom/tcomment_vim](https://github.com/tomtom/tcomment_vim)

### nerdcommenter

[scrooloose/nerdcommenter](https://github.com/scrooloose/nerdcommenter)

### caw.vim

[tyru/caw.vim](https://github.com/tyru/caw.vim)

## まとめてみた感想

Vimはその歴史の長さにより大量のプラグインが存在します。
またプラグインの進化と同様に、Vimの本体やそのフォークプロジェクトも進化しており、
新機能を用いたプラグインもどんどん増えているため、
これまでディファクトであったプラグインも新興プラグインによってその地位を脅かされる
といった事例も出てきています。とりわけJobによる非同期処理はその傾向が顕著です。

この記事を含め人に頼らず自分で動向をウォッチしていくことも非常に重要ですね。
私も自分のプラグインをご紹介できる機会を作りたいものです(遠い目)