よく使われているvimrcの設定ランキング

## 背景
[世の中のエンジニアのalias設定](https://qiita.com/reireias/items/d906ab086c3bc4c22147)
こんな記事を書いたついでに、vimrcについても気になったので調べてみました。

せっかくなので、こちらは解説（主に[vimdoc-ja](https://github.com/vim-jp/vimdoc-ja)の引用）付きで紹介していきます。

プラグイン版はこちら。
[よく使われているvimのプラグイン top20](https://qiita.com/reireias/items/5364dcaada1a5b88a206)

## 対象
- GitHub上のdotfilesトピックがついたリポジトリ
- スター数順に上位**1000**リポジトリ
- 対象ファイルは`*vimrc`と`init.vim`
  - `.vimrc`や`nvimrc`、`hoge.vimrc`等も含む
- 総ファイル数**644**ファイル

例によって、このリポジトリを使いました。
[reireias/dotseeker](https://github.com/reireias/dotseeker)

## 集計方法
- 対象のファイルをローカルにダウンロード
- 先頭の空白は除去
- 末尾のコメントと空白も除去
- 下記に合致するものは除外
  - `if`, `else`, `endif`, `function`, `endfunction`等の制御構文
  - `autocmd!` (自動コマンドの除去、クリーンナップ的な用途なので)

コマンドは下記になります。

```sh
# ちょっと最初のgrepは非効率かも
grep -r -h -E "^" files --color=none --include="*vimrc" | sed -e 's/^[ \t]*//g' -e 's/[ \t]*$//g' | grep -v -E "^$" | grep -v -E "^\\\\" > rc.txt
grep -r -h -E "^" files --color=none --include="*init.vim" | sed -e 's/^[ \t]*//g' -e 's/[ \t]*$//g' | grep -v -E "^$" | grep -v -E "^\\\\" > init.txt
# 自作のフィルターで末尾のコメントを除去している
wc -l < *.txt | cat - *.txt | ./comment_remove.py | sed -e 's/[ \t]*$//g' | grep -v -E "^(if|endif|endfunction|autogroup|else|autocmd\!|au\!|augroup|endfor)" | sort | uniq -c | sort -nr | head -n 30
```

設定を入れた際との比較用に何も設定していない場合の表示も置いておきます。
(ファイルはなんとなくでrubyのテキトーなサンプルです)

![none.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214526/3c8c4fb2-0434-2e92-e760-ab6f02c72b6e.png)

## 備考
vimのバージョンは下記です。(普段はneovimなので、vim8が手元にありませんでした)

```
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
```

また、ターミナルアプリのカラーを少しいじっているので、シンタックスの色は読者の手元の環境と異なると思います。

## 登場数ランキング
### 1位 `set number` (489回/644ファイル)
>毎行の前に行番号を表示する。

やはり第1位はこれ！！！
そのまんまですね。行番号が表示されます。
vimはコマンドで行数を使ったりするので、必須ですね。

![number.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214526/a9582151-953a-cf9c-e965-bb42917bcbfe.png)


### 2位 `set expandtab` (474回/644ファイル)
>挿入モードで <Tab> を挿入するとき、代わりに適切な数の空白を使う。
>また、コマンド '>' や '<' によるインデントや、オプション 'autoindent' がオンのときのインデントでも空白を使う。
>'expandtab' がオンのときに本当のタブを挿入するには、CTRL-V<Tab> を使うこと。

タブキーで入力した際に、代わりにスペース2つとか4つを入力してくれる設定です。
`autocmd FileType`と組み合わせてファイルタイプごとに設定することが多いです。
例：goはタブ、jsはスペース2つ、pythonはスペース4つ等

### 3位 `set hlsearch` (461回/644ファイル)
>前回の検索パターンが存在するとき、それにマッチするテキストを全て強調表示する。

検索結果のハイライトです。
下記の画像は`/def`で検索しています。

![hlsearch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214526/e068d5b9-b2dd-a78e-b747-c17b57c82322.png)


### 4位 `set ignorecase` (458回/644ファイル)
>検索パターンにおいて大文字と小文字を区別しない。

`/hello`と検索すると、`hello`にも`Hello`にも`HELLO`にもヒットします。

### 5位 `set incsearch` (457回/644ファイル)
>検索コマンドを打ち込んでいる間にも、打ち込んだところまでのパターンがマッチするテキストを、すぐに表示する。
>マッチした文字列は強調表示される。

いわゆるインクリメンタルサーチです。
下記画像は`/d`まで入力した場合です。（エンターはまだ押していません）

![incsearch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214526/28608ab2-1bec-6042-87d7-52cfb51f6bac.png)


### 6位 `set smartcase` (412回/644ファイル)
>検索パターンが大文字を含んでいたらオプション 'ignorecase' を上書きする。

小文字で検索した場合は、大文字小文字の違いは無視、大文字を含む文字列で検索した場合は無視しない、といった検索になります。

### 7位 `set laststatus=2` (402回/644ファイル)
>最下ウィンドウにいつステータス行が表示されるかを設定する。
>	0: 全く表示しない
>	1: ウィンドウの数が2以上のときのみ表示
>	2: 常に表示

画像のようにファイル名等の情報を表示するステータスバーが追加されます。

![laststatus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214526/a1d08d39-95b4-400d-1148-173b6b7998cf.png)

カスタマイズ次第ではこんなにいろいろ表示できます。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214526/80c28457-62d8-95bd-2909-4fc723c93026.png)


### 8位 `set nocompatible` (399回/644ファイル)
>VimをなるべくVi互換にするか、便利な機能を使えるようにするかを決定する。
>これは、特別な種類のオプションである。
>このオプションの値が変更されると、それに伴って他のオプションも変更されるからだ。

実はもうおまじないと化してる模様
[set nocompatibleはもういらない](https://qiita.com/yu_suke1994/items/e0a19574994a57c8fe17)

### 9位 `syntax on` (372回/644ファイル)
>次のコマンドで構文ハイライトが有効になる:
>	:syntax enable

>コマンド `:syntax enable` は現在の色設定を変更しない。
>そのため、このコマンドを使用する前後にコマンド `:highlight` で好みの色を設定することができる。
>現在の設定を破棄して、デフォルトの色を設定させたい場合は次のコマンドを使用する:
>	:syntax on

シンタックスハイライトを有効にします。
シンタックスハイライトなしのエディタでコーディングする人とか、現代にいるのでしょうか？

![syntax.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214526/ba501e40-ba7f-1674-7058-96b8660aad16.png)


### 10位 `set autoindent` (363回/644ファイル)
>新しい行を開始したとき (挿入モードで <CR> を打ち込むか、コマンド "o"や "O" を使ったとき)、新しい行のインデントを現在行と同じくする。

要は改行した時に、同じレベルのインデントにしてくれます。
タブでもスペースでもよきに計らってくれます。
これなしでコーディングはきついですね。


### 11位-20位

- 11位 `filetype plugin indent on` (360回/644ファイル)

>:filetype plugin on と :filetype indent on を行った状態になる。
>ファイルタイプの自動検出、ファイルタイプ用の プラグインとインデント設定 を自動読み込みするようになる。

- 12位 `set showcmd` (344回/644ファイル)

>コマンド (の一部) を画面の最下行に表示する。

ノーマルモードで入力したコマンドが右下に表示されるようになります。

- 13位 `set background=dark` (341回/644ファイル)

>値が "dark" のときは、Vimは暗い背景によく合う色を使おうとする。
>値が "light" のときは、Vimは明るい背景によく合う色を使おうとする。
>その他の値は無効である。

- 14位 `set wildmenu` (335回/644ファイル)

>オンのとき、コマンドライン補完が拡張モードで行われる。

- 15位 `call plug#end()` (329回/644ファイル)
  - 最も利用されているプラグイン管理は[vim-plug](https://github.com/junegunn/vim-plug)のようです
  - `plug#begin`がランクインしてないのは、引数にとるパスが各々異なるためでしょう
  - なお、パスを無視してgrepしたところ、`plug#begin`は363回、`dein#begin`は26回の登場でした

- 16位 `set hidden` (320回/644ファイル)

>オフのときは、バッファは放棄 |abandon| されるときに解放される。
>オンのときは、バッファは放棄 |abandon| されるときに隠れ (hidden) 状態になる。
>そのバッファが別のウィンドウでまだ表示されているなら、もちろん隠れ状態にはならない。

- 17位 `set backspace=indent,eol,start` (307回/644ファイル)

>挿入モードでの `<BS>`, `<Del>`, `CTRL-W`, `CTRL-U` の働きに影響する。
値はキーワードのコンマ区切りのリストである。
それぞれのキーワードがバックスペースの働く対象を定めている。

```
値      効果
indent  autoindent を超えてバックスペースを働かせる
eol     改行を超えてバックスペースを働かせる (行を連結する)
start   挿入区間の始めでバックスペースを働かせるが CTRL-W と CTRL-U は挿入区間の始めでいったん止まる
```

- 18位 `set ruler` (301回/644ファイル)

>カーソルが何行目の何列目に置かれているかを表示する {訳注: これをルーラーと呼ぶ}。

- 19位 `set showmatch` (294回/644ファイル)

>閉じ括弧が入力されたとき、対応する開き括弧にわずかの間ジャンプする。

- 20位 `set cursorline` (278回/644ファイル)

>カーソルがある画面上の行をCursorLineで強調する。
>カーソルを目立たせるのに便利。スクリーンの再描画が遅くなる。

## ランキング全体
とりあえず上位50位と登場回数を下記に載せておきます。
あとでgistに全体を上げる予定です。

```
    489 set number
    474 set expandtab
    461 set hlsearch
    458 set ignorecase
    457 set incsearch
    412 set smartcase
    402 set laststatus=2
    399 set nocompatible
    372 syntax on
    363 set autoindent
    360 filetype plugin indent on
    344 set showcmd
    341 set background=dark
    335 set wildmenu
    329 call plug#end()
    320 set hidden
    307 set backspace=indent,eol,start
    301 set ruler
    294 set showmatch
    278 set cursorline
    266 set mouse=a
    254 set noswapfile
    254 set encoding=utf-8
    251 set shiftwidth=4
    247 set autoread
    244 set shiftwidth=2
    238 set undofile
    236 set tabstop=4
    230 set nobackup
    220 set splitright
    218 set t_Co=256
    215 set splitbelow
    215 Plug 'tpope/vim-fugitive'
    212 set tabstop=2
    211 set list
    211 Plug 'tpope/vim-surround'
    206 set lazyredraw
    204 syntax enable
    203 set smarttab
    191 set nowrap
    190 set smartindent
    188 set noshowmode
    171 set title
    171 set relativenumber
    170 set ttyfast
    165 Plug 'airblade/vim-gitgutter'
    159 set showmode
    153 set noerrorbells
    151 set softtabstop=4
    151 return
```

## まとめ
春は新たなvimmerが多く誕生する季節ですね。
そんな方々の参考になれば幸いです。