現時点で使っている＆おすすめの Vim プラグイン抜粋

## 1. モチベーション

定期的に使っている Vim プラグインを更新してアウトプット習慣を付けようとの試み。
「最近 Vim を始めたけど定番おすすめプラグインを入れすぎて沼」とか「似たような機能のプラグインが乱立していて沼」とか「プラグインはカスタマイズ前提の情報が多すぎて沼」と感じている人の参考に少しでも参考になれば幸いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569749/8271dab9-cea7-f688-3c2e-ca1fc872aa29.png)
沼にハマる人のイラスト（[いらすとや](https://www.irasutoya.com/2017/09/blog-post_281.html)）

## 2. はじめに：個人的なプラグインに疲れないための選び方

- Vim は実用を兼ねた趣味なので実用性を維持するのは大切
  - 「作業しようとしたらプラグインがエラー吐いた」
  - 「修正しようとして `.vimrc` を弄っていたら日が暮れた」状態になっては本末転倒
- なので、

1. 「入れたら動く」を大事にする
    - カスタマイズ前提の物は避ける
    - 自動でイイ感じに動作してくれる物を選ぶ
2. できるだけ最近更新されている物を選ぶ
    - 概ね２年以内が目安
    - ただし、他に選択しが無い場合は諦める
3. キーにマッピングするプラグインのショートカットやコマンドは必要最小限に留める。
    - １０個以内ぐらい
    - マッピングしまくるとキーバインドが衝突して「ヴァー！！」となる
    - マッピングしないコマンドや機能は Which-key で整理
4. 一ヶ月に一度しかお世話にならない程度のプラグインは入れない
    - 毎日お世話になる物に厳選
5. 機能モリモリプラグインよりも単機能プラグインを組み合わせる
    - どうせ機能は使い切れないし機能補完で別のプラグイン入れたりするので
6. **超重要** VSCode とのすみ分けを考える
    - VSCode でできることを実装し続けると「もうそれ VSCode でよくね？」となる
    - あくまでもターミナルから離れずに使えるエディタであることを前提にカスタマイズする
    - でも「VSCode を起動するまでもないことだから Vim でやりたい」は個人的にアリだと思う

## 3. カラースキーム

### 3.1. [whatyouhide/vim-gotham](https://github.com/whatyouhide/vim-gotham)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569749/e5092b86-b537-5dbe-41ef-2ea285956ca5.png)

- 落ち着いた色合いのカラースキーム
- ターミナルのカラースキームや Google Chrome、VSCode のカラーテーマにまで同名のカラーが存在し、統一感を出せるのもお気に入りのポイント

## 4. 文章入力サポート

### 4.1. [obcat/vim-hitspop](https://github.com/obcat/vim-hitspop)

![img](https://user-images.githubusercontent.com/64692680/102915667-81b06800-44c5-11eb-8b53-e37eacc4e67b.gif)

- ワード検索をすると画面の片隅に「現在位置／総ヒット数」が自動で表示される便利プラグイン
- 何かのログを Vim で確認している際、特定のナニカが含まれている数を確認したい場合などに割と便利

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

- 「選択範囲を記号で囲む」と「現在位置を囲むカッコなどの記号種類を変更する」ができるプラグイン
- 特にマークダウンなどを入力していて、後から「あ、ここはカッコ書きした方がよかった」みたいな場合に便利
- 使い方
  - 記号で囲む：Visual mode で範囲を選択後に `Shift + s` の後に任意の記号を入力（`(), [], {}, <> ...`）
  - 囲み記号を変更：変更したい記号の間にカーソルを置いてから `cs` の後に変更対象の記号を入力、その後に変更後の記号を入力
    - 例：`print("Hello")` のダブルクオーテーションをシングルクォーテーションに変更したい場合、「Hello」 にカーソルを合わせて「`cs " '`」と入力

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

- カレント行や選択範囲行を一括でコメントアウト／解除してくれるプラグイン
- Vim の矩形選択を駆使すれば不要かもしれないが、インデントも考慮してくれるので最終的な視認性は向上する・・・気がする

### 4.4. [gosukiwi/vim-smartpairs](https://github.com/gosukiwi/vim-smartpairs)

```text
You type        You get        Notes
(               (_)            "_" represents the cursor
<BS>            _
[               [_]
]               []_
<BS>            [_
<BS>            _
{               {_}
<CR>            {              Cursor will be indented using current syntax
                  _
                }
```

- 囲み記号を入力すると自動的にペアとなる記号も入力してくれるプラグイン
- 有名どころに [auto-pairs](https://github.com/jiangmiao/auto-pairs) があるものの、５年ほど更新されていないため新しい方を選択してみた。
- 自動入力系は意図しない動作が暴発して逆に効率が下がったりすることもあるが、これは今のところ問題なし。

### 4.5. [dominikduda/vim_current_word](https://github.com/dominikduda/vim_current_word)

![img](https://raw.githubusercontent.com/dominikduda/vim_current_word/master/gifs/customized.gif)

- カーソル下にあるものと同じワードを自動ハイライトしてくれるプラグイン
- VSCode でもお馴染みの機能。変数名の入力ミスに気づくことができたりと地味に便利
- 初期設定だとキビキビ動きすぎ、かつカレントワードまでハイライトしてしまいうるさいので、以下の設定で抑制して使用している。

```vim
let g:vim_current_word#highlight_current_word = 0
let g:vim_current_word#highlight_delay = 500

```

### 4.6. [ntpeters/vim-better-whitespace](https://github.com/ntpeters/vim-better-whitespace)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569749/f930377e-25be-7614-6dbc-90676ccbccd5.png)

- 行末や空白行のホワイトスペースを強調表示してくれるプラグイン
- `StripWhitespace` で不要なホワイトスペースを一括削除することも可能
- よそから拾ってきたコードに含まれる不要な空白を一括削除する時などに便利
  - ・・・なんだけど、空白に神経質になるデメリットがある。

### 4.7. [ConradIrwin/vim-bracketed-paste](https://github.com/ConradIrwin/vim-bracketed-paste)

- クリップボードから文字列をコピペする際、インデントが爆裂してしまうのを防止してくれるプラグイン
- `:set paste` を使えばプラグインは不要。とはいえコピペをよく使う自分には必須の機能

### 4.8. [skanehira/denops-translate.vim](https://github.com/skanehira/denops-translate.vim)

- 文字列を翻訳してくれるプラグイン
- Visual モードで選択した範囲を簡単に翻訳、結果をヤンクしてくれる。
- Google 翻訳にわざわざ張り付けるのが面倒な英語音痴には必須

## 5. UI 改善系

### 5.1. [obcat/vim-sclow](https://github.com/obcat/vim-sclow)

![](https://camo.githubusercontent.com/15ce78705b1074913d0c030fa73eeeebd3ddbb83fb5dd451dfb092b8d1b35798/68747470733a2f2f692e6779617a6f2e636f6d2f30653134313434366630346266333465636464336535356565343339613239312e676966)

- 画面右端にスクロールバーを表示してくれるプラグイン
- マウスで掴んだりクリックしたりの操作はできないものの、「いまどの辺りにいるか」を視覚的に把握できるので便利
- デフォルトのバー表示は存在感が強め、かつカラースキームによっては埋没するため、次の設定がおすすめ。

```vim
let g:sclow_block_buftypes = ['terminal', 'prompt']
let g:sclow_hide_full_length = 1
let g:sclow_sbar_text = '┃'
```

### 5.2. [luochen1990/rainbow](https://github.com/luochen1990/rainbow)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569749/9164fbab-1065-7500-cd44-223041becd25.png)

- カッコをカラフルにして視認性を向上させてくれるプラグイン
- 同様のプラグインは複数存在するものの、古かったり動作が不安定だったりすることが多い中、このプラグインは今もメンテナンスが続いている。
- デフォルト設定だと少し視認性が悪いので、少し設定を追加して使っている。

```vim
let g:rainbow_conf = {
      \'guifgs': ['orange', 'magenta', 'cyan'],
      \'ctermfgs': ['yellow', 'magenta', 'cyan'],
      \'guis': ['bold'],'cterms': ['bold']
      \}
```

### 5.3. [liuchengxu/vim-which-key](https://github.com/liuchengxu/vim-which-key)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569749/de853c1d-c80b-f5b4-ca14-7e9f2725211f.png)

- 設定されたショートカットコマンドを表示し、ナビゲーションしてくれるプラグイン
- ショートカットの登録などは自分で `.vimrc` にゴリゴリ入力しないといけない。
- が、一度登録さえしてしまえばキーバインドのチートシート兼ショートカットとして機能してくれるため、かなり重宝する。

### 5.4 [psliwka/vim-smoothie](https://github.com/psliwka/vim-smoothie)

![img](https://github.com/psliwka/vim-smoothie/raw/master/demo.gif)

- スクロールをなめらか～にしてくれるプラグイン
- あってもなくてもいいんだけど、あってくれると少しリッチな気持ちになれるような気がする。
- あと、名前が個人的に好み 🥤

## 6. システムコントロール系

### 6.1. [simeji/winresizer](https://github.com/simeji/winresizer)

![img](https://camo.githubusercontent.com/cbe818fa4553b3c21ce695777da1be24577829fc266a8bf46451f3c6bbc1fde1/68747470733a2f2f7261772e6769746875622e636f6d2f77696b692f73696d656a692f77696e726573697a65722f696d616765732f64656d6f2d666f722d7465726d696e616c2e676966)

- ウィンドウのサイズを簡単便利に変更できるプラグイン
- `ctrl + e` でウィンドウサイズ変更モードに入り、`h, j, k, l` でサイズ変更、Enter で確定・・・と、かなり直感的に変更できるようになる。
- なお、カレントウィンドウを一時的に最大化・復元したい場合はプラグインによらずとも `.vimrc` に以下を記載するだけでよい。（`fz` で最大化・復元のスイッチ）

```vim
let g:toggle_window_size = 0
function! ToggleWindowSize()
  if g:toggle_window_size == 1
    exec "normal f="
    let g:toggle_window_size = 0
  else
    :resize
    :vertical resize
    let g:toggle_window_size = 1
  endif
endfunction
nnoremap <silent> fz :call ToggleWindowSize()<CR>
```

## 7. 特定ファイル形式用

### 7.1. for Markdown

#### 7.1.1. [preservim/vim-markdown](https://github.com/preservim/vim-markdown)

- Markdown のシンタックス改善や TOC 作成など、多岐にわたる機能を使用できるプラグイン
- `:Toc` で作成される TOC は、長文の Markdown ファイル編集時に便利
- `:TableFormat` でテーブルの整形もできる。
- デフォルトではヘッダーで折り畳みが発生したり不便なので以下の設定を推奨

```vim
# 折り畳みを無効化
let g:vim_markdown_folding_disabled = 0

# Tab などのインデント幅が４に固定されてしまうのを防ぐには、以下を設定
let g:markdown_recommended_style = 0
# Tab の代わりに Space を入力し、その幅を２にするためには、以下を設定
set expandtab
set tabstop=2
set softtabstop=2
set shiftwidth=2
```

#### 7.1.2. [bullets-vim/bullets.vim](https://github.com/bullets-vim/bullets.vim)

![img](https://github.com/bullets-vim/bullets.vim/raw/master/img/bullets.gif)

- マークダウンで多用する箇条書きを楽にしてくれるプラグイン
- vim-markdown では箇条書き周りが弱いため補完的に使用
- 他にも `RenumberList` で番号リストを再ナンバリングできたりする。
- デフォルトだと少し捻りのきいたマジックがあるため、以下の設定をして使用中

```vim
let g:bullets_pad_right = 0
let g:bullets_outline_levels = []
```

#### 7.1.3. [mattn/vim-maketable](https://github.com/mattn/vim-maketable)

![img](https://camo.githubusercontent.com/4a87a8b67b45d7e0619eecd3f47a5f8ce5493addd326a7b42010e3610217a14b/687474703a2f2f692e696d6775722e636f6d2f6a6f59475665322e676966)

- "CSV <--> TABLE" の変換を行ってくれるプラグイン
- Markdown テーブルの編集を楽にするプラグインは多数あるものの、どれも一長一短
- 「なら、編集は CSV でいいんじゃね？」となったので、これを採用

#### 7.1.4. [i9wa4/vim-markdown-number-header](https://github.com/i9wa4/vim-markdown-number-header)

- Markdown のヘッダー（`#` で始まる行）にナンバリングしてくれるプラグイン
- VSCode に "Markdown All in One" 拡張機能を入れて `Add/Update section numbers` を実行した場合と同じ挙動をしてくれる。
  - ※ Deno など Vim 外の依存があるため、インストールは少し面倒
- あくまでもナンバーを付けてくれるだけで削除することはできない。
- ちょっと不便だったので以下の拙い関数を作成し、 `call RemoveNumbers()` を実行して無理やり番号を削除している。

```vim
" デフォルトで使える Vim のバージョンだと Deno のバージョンチェックに引っかかり動作しない事があるため、念のためチェックを無効化
let g:denops_disable_version_check = 1

" ナンバリングを h2 から開始する設定
let g:mnh_header_level_shift = 1

" call RemoveNumbers() で現在のナンバリングを全削除
function! RemoveNumbers()
  let g:mnh_header_level_shift = 99
  NumberHeader
  let g:mnh_header_level_shift = 1
endfunction
```

#### 7.1.5. [iamcco/markdown-preview.nvim](https://github.com/iamcco/markdown-preview.nvim)

![img](https://user-images.githubusercontent.com/5492542/47603494-28e90000-da1f-11e8-9079-30646e551e7a.gif)

- Markdown ファイルをブラウザでプレビューしてくれるプラグイン
- プレビューのプラグインとしては [previm](https://github.com/previm/previm) が有名だけど、こちらはスクロールを追従してくれるので便利