Vimプラグイン"の"カテゴリまとめ

Vimのプラグインがたくさんあってなにがどうなっているかの整理できていない！という人向けによくあるプラグインのカテゴリをまとめてみました。プラグインを見つけた際にどこらへんに該当するかなーと判断の参考にしてもらえればと思います。

# はじめに

- 対象はVim初心者から中級者一歩手前くらいを想定しています。
- プラグイン自体の説明はあまりするつもりはないので、リンクのGitHubのREADMEを読むなり使ってみるなりしてみてください。
- 表の中の四角括弧[]は機能が重複しているプラグインです。同じようなプラグイン複数入れると良からぬことが起こるのでいずれか一つを試すのがよいと思います。
- 個人的によく使う特におすすめのものは★を書いておきます。(ちなみにNeovim使いです)


# プラグインのカテゴリ

## プラグインマネージャー

まずはプラグインをいれるためのプラグイン（GitHubからダウンロードしたり、読み込んだりしてくれるもの）をいれます。

いろいろ種類はありますが、

- [vim-plug](https://github.com/junegunn/vim-plug): 世界的に利用者が多くシンプル
- [dein.vim](https://github.com/Shougo/dein.vim): 日本人に使っている人が多く、高速

を選んでおくと無難かと思います。


## 標準機能拡張系

ここでは、Vimの標準機能を拡張するプラグインをまとめます。

|カテゴリ(説明)|代表的なプラグイン|
|---|---|
|**移動改善** (Vimの醍醐味でもあるスッと移動する機能を拡張する)|[[vim-easymotion](https://github.com/easymotion/vim-easymotion), [vim-sneak](https://github.com/justinmk/vim-sneak)], [quick-scope★](https://github.com/unblevable/quick-scope)|
|**選択** (文字選択をスマートに行う)|[vim-expand-region★](https://github.com/terryma/vim-expand-region), [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors)|
|**検索**|[vim-anzu★](https://github.com/osyo-manga/vim-anzu), [vim-asterisk★](https://github.com/haya14busa/vim-asterisk)|
|**全体検索**(今開いているファイル以外からも検索)|[vim-grepper★](https://github.com/mhinz/vim-grepper)|
|**Highlight** (同じ単語を識別しやすくする)|[vim-quickhl★](https://github.com/t9md/vim-quickhl), [[vim-illuminate](https://github.com/RRethy/vim-illuminate), [coc-highlight](https://github.com/neoclide/coc-highlight)]|
|**ヤンク(コピー)**|[[yankround.vim](https://github.com/LeafCage/yankround.vim), [nvim-miniyank](https://github.com/bfredl/nvim-miniyank)]|
|**Undo**|[undotree](https://github.com/mbbill/undotree)|
|**ウインドウ** (画面分割等のウィンドウを拡張する)|[winresizer](https://github.com/simeji/winresizer), [vim-choosewin](https://github.com/t9md/vim-choosewin)|
|**バッファ操作**|[vim-bufonly](https://github.com/schickling/vim-bufonly), [vim-bbye](https://github.com/moll/vim-bbye)|
|**コマンド** (コマンドモードの拡張)|[suda.vim](https://github.com/lambdalisue/suda.vim), [CmdlineComplete](https://github.com/vim-scripts/CmdlineComplete), [capture.vim★](https://github.com/tyru/capture.vim)|
|**編集支援** (括弧を入れ替えたり、単語をクオートでくくったりできる)|[[vim-sandwich★](https://github.com/machakann/vim-sandwich), [vim-surround](https://github.com/tpope/vim-surround)]|
|**整形支援**|[vim-easy-align★](https://github.com/junegunn/vim-easy-align), [vim-table-mode](https://github.com/dhruvasagar/vim-table-mode), [vim-partedit](https://github.com/thinca/vim-partedit)|
|**行結合、分割**|[vim-jplus](https://github.com/osyo-manga/vim-jplus), [splitjoin.vim](https://github.com/AndrewRadev/splitjoin.vim)|
|**Diff**|[linediff.vim★](https://github.com/AndrewRadev/linediff.vim)|
|**Mark**|[vim-signature](https://github.com/kshenoy/vim-signature)|
|**Manual** (Helpを引いたり)|[vim-ref★](https://github.com/thinca/vim-ref), [vim-cheatsheet](https://github.com/reireias/vim-cheatsheet)|
|**Tag** (タグジャンプ用のタグを管理する)|[vim-gutentags](https://github.com/ludovicchabant/vim-gutentags)|
|**Session** (Vimのセッションを管理して以前の状態を復元したりする)|[vim-obsession](https://github.com/tpope/vim-obsession)|
|**Quickfix** (ビルド後などに使用する下の方に表示されるウィンドウ)|[vim-qf](https://github.com/romainl/vim-qf), [quickr-preview.vim★](https://github.com/ronakg/quickr-preview.vim)|
|**ファイラー** (ファイル一覧からファイルを選択したりするやつ)|[[defx.nvim](https://github.com/Shougo/defx.nvim), [fila.vim](https://github.com/lambdalisue/fila.vim), [vim-dirvish](https://github.com/justinmk/vim-dirvish)]|

## レイアウトカスタマイズ系

ここでは、主にVimの見た目をカスタマイズするプラグインをまとめます。

|カテゴリ(説明)|代表的なプラグイン|
|---|---|
|**スタートメニュー** (Vimを起動したときにメニューを表示できるようにする)|[vim-startify★](https://github.com/mhinz/vim-startify)|
|**ColorScheme** (Vimの色を変更する。いろいろなプラグインに対応している方が望ましい。そうしないとプラグインを追加するごとに色を調整する必要がでてくる)|[[gruvbox-material★](https://github.com/sainnhe/gruvbox-material), [iceberg.vim](https://github.com/cocopon/iceberg.vim)]|
|**Statusline** (Vimの下に表示される情報を出すバー)|[lightline.vim★](https://github.com/itchyny/lightline.vim), [vim-airline](https://github.com/vim-airline/vim-airline)|

## 機能追加系

ここでは、Vimに本来備わっている以外の機能を追加したプラグインをまとめます。

|カテゴリ(説明)|代表的なプラグイン|
|---|---|
|**ファイル切り替え**|[vim-buffergator](https://github.com/jeetsukumaran/vim-buffergator), [vim-xtabline★](https://github.com/mg979/vim-xtabline)|
|**メモ機能**|[memolist.vim★](https://github.com/glidenote/memolist.vim)|
|**ファジーファインダー** (曖昧検索でファイルやコマンドを検索する)|[[fzf.vim★](https://github.com/junegunn/fzf.vim), [denite.nvim](https://github.com/Shougo/denite.nvim), [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim), [vim-clap](https://github.com/liuchengxu/vim-clap)]|
|**Git操作**|[gina.vim](https://github.com/lambdalisue/gina.vim), [vim-fugitive](https://github.com/tpope/vim-fugitive), [git-messenger.vim](https://github.com/rhysd/git-messenger.vim), [committia.vim](https://github.com/rhysd/committia.vim)|


## コーディング支援系

主にプログラミングをする際の支援をしてくれるプラグインたちです。

|カテゴリ(説明)|代表的なプラグイン|
|---|---|
|**自動補完**|[[coc.nvim★](https://github.com/neoclide/coc.nvim), [asyncomplete.vim](https://github.com/prabirshrestha/asyncomplete.vim), [deoplete.nvim](https://github.com/Shougo/deoplete.nvim)]|
|**LSP**|[[coc.nvim★](https://github.com/neoclide/coc.nvim), [vim-lsp](https://github.com/prabirshrestha/vim-lsp), [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim)]|
|**ライティング支援**|[nerdcommenter★](https://github.com/scrooloose/nerdcommenter), [vim-better-whitespace](https://github.com/ntpeters/vim-better-whitespace), [vim-autoformat](https://github.com/Chiel92/vim-autoformat)|
|**リーディング支援**|[indentLine](https://github.com/Yggdroot/indentLine)|
|**コードジャンプ**|[[vista.vim](https://github.com/liuchengxu/vista.vim), [tagbar](https://github.com/majutsushi/tagbar)], [vim-altr★](https://github.com/kana/vim-altr)|
|**タスクランナー**|[[vim-test](https://github.com/janko/vim-test), [vim-dispatch](https://github.com/tpope/vim-dispatch), [asyncrun.vim](https://github.com/skywind3000/asyncrun.vim), [vim-quickrun](https://github.com/thinca/vim-quickrun)]|
|**Checker** (最近はLSPにて代替が可能な場合が多いため使用しないこともある)|[ale](https://github.com/dense-analysis/ale)|
|**括弧可読支援**|[rainbow_parentheses.vim](https://github.com/kien/rainbow_parentheses.vim), [vim-matchup](https://github.com/andymass/vim-matchup)|
|**括弧入力支援**|[[lexima.vim](https://github.com/cohama/lexima.vim), [coc-pairs★](https://github.com/neoclide/coc-pairs), [delimitMate](https://github.com/Raimondi/delimitMate)]|
|**スニペット** (定型文入力支援)|[[coc-snippets★](https://github.com/neoclide/coc-snippets), [neosnippet.vim](https://github.com/Shougo/neosnippet.vim), [ultisnips](https://github.com/airblade/vim-rooter)], [sonictemplate-vim](https://github.com/mattn/sonictemplate-vim)|
|**プロジェクト管理**|[vim-rooter](https://github.com/airblade/vim-rooter), [vim-localvimrc](https://github.com/embear/vim-localvimrc)|


## プログラミング言語別プラグイン

Vim（だいたいのエディタでもそうですが）では、各プログラミング言語ごとに専用のプラグインが存在し、言語固有の便利機能を提供していることが多いです。シンタックス（コードの色付け）の設定だけが必要ならvim-polyplotを入れれば大抵の言語は適切に色がついた状態で表示できます。

|カテゴリ(説明)|代表的なプラグイン|
|---|---|
|**Markdown**|[[previm](https://github.com/previm/previm), [markdown-preview.nvim★](https://github.com/iamcco/markdown-preview.nvim)]|
|**言語ごとのシンタックス設定**|[vim-polyglot](https://github.com/sheerun/vim-polyglot)(いろいろな言語のシンタックスがセットになっている。 ただしトラブルことも多い気がするので特定の言語しか書かない場合は個別にインストールするほうがよい)|


# さいごに

### プラグインを選ぶ際のポイント

- 継続的にメンテナンスされているか
    - Vim scriptは比較的簡単に書けるため最初作ったまま放置されるパターンも多い
        - プラグイン作者のGitHubのアクティビティなども参考にする
    - Vim本体の機能に追従していっているか
        - 機能追加でそのプラグイン自体が不要となるケースもある
        - 最近話題の機能を取り込めているか
            - 非同期実行ができるようになった(2016-)
            - LSPが出てきた(2016-)
            - ポップアップ(floating window)ができるようになった(2019)
- そのプラグインよりメジャーなプラグインがないか調べてみる
    - あまりGitHubスターはあてにならない。古いプラグインのほうが星がたくさんついていることが多いため。
    - プラグインの移り変わりは激しいので(検索ワードとしては、xxx alternativeとかでよい)

### プラグインを管理する際のポイント

- プラグインを入れること自体は悪いことではないのでどんどん試して入れるとよいと思う。ただし、ただ入れて放置して管理していない状態にはならないように定期的に見直すこと。
- たくさんいれるとプラグイン同士が干渉することがある（主にマッピングがかぶって動かなくなるなど）
    - トラブったときはプラグインを全部オフにして徐々に有効化してあたりをつけていくのがよい 
- たくさんいれすぎると起動が遅くなることがある

     ```shell:デフォルトのvimよりもどのくらい遅くなっているか確認するワンライナー
echo "scale=3; $(vim --startuptime /tmp/stime_mine.log -c 'quit' > /dev/null && tail -n 1 /tmp/stime_mine.log | cut -d ' ' -f1) / $(vi -u DEFAULTS --startuptime /tmp/stime_def.log -c 'quit' > /dev/null && tail -n 1 /tmp/stime_def.log | cut -d ' ' -f1)" | bc | xargs -i echo {}x slower your Vim than the default.
     ```
     ```shell:デフォルトのneovimよりもどのくらい遅くなっているか確認するワンライナー
echo "scale=3; $(nvim --startuptime /tmp/stime_mine.log -c 'quit' > /dev/null && tail -n 1 /tmp/stime_mine.log | cut -d ' ' -f1) / $(vi -u DEFAULTS --startuptime /tmp/stime_def.log -c 'quit' > /dev/null && tail -n 1 /tmp/stime_def.log | cut -d ' ' -f1)" | bc | xargs -i echo {}x slower your Vim than the default.


### 継続的に調査する

プラグインの移り変わりは激しいので定期的に情報を取得する必要があります。以下に私がよく使っているサイトのリンクを記載しておきます。

- vim-jpのSlack pluginチャンネル https://vim-jp.org/docs/chat.html に招待リンクがあります
- 定期的に"Vimプラグインおすすめ"で検索する
- GitHubのvim pluginトピック https://github.com/topics/vim-plugin
- Redditの[r/vim](https://www.reddit.com/r/vim/), [r/neovim](https://www.reddit.com/r/neovim/)