.vimrc の基本的な設定項目について

.vimrc の設定について備忘。

# set nocompatible: vi 互換モードで動作させない

[Vim のすゝめ様のこの記事](http://www.soum.co.jp/misc/v/vim-no-susume/6.html)が詳しい。 Vim を vi 互換モードで動作させると各種プラグイン等機能しなくなったり不都合が生じる。 その為 .vimrc の先頭に書く。

# syntax enable: シンタックスハイライトを有効にする

Vim はファイルの拡張子で自動で各種キーワードをシンタックスハイライトしてくれる。 これを ON にするとコードが見やすくなるし間違いにも気付きやすくなるので必ず ON にする。

# filetype plugin indent on: ファイルタイプ検出及び各種プラグインを有効にする

こちらも[Vim のすゝめ様のこの記事](http://www.soum.co.jp/misc/v/vim-no-susume/1.html)が詳しい。 以下一部引用させていただくと:

>最後の filetype plugin indent on は、Vim のファイルタイプ検出と、ファイルタイププラグインとインデントプラグインをオンにする設定です。ファイルタイプの検出とは、ファイルを開いたときにファイルの種類を検出する機能のことを言います。この機能により、Vim は .pl ファイルを開いたとしても、それが Prolog ファイルなのか Perl スクリプトなのかを判別することができるのです。ファイルタイププラグインとは、ファイルの種類毎に定義された共通の設定のことです。インデントプラグインはファイルタイプ毎に定義されたインデント設定です。

# set ruler: カーソルの位置表示を行う

set ruler しておくと Vim 最下部のバーの右側にカーソルの位置を表示してくれる。例えばカーソルが 60 行目の 7 文字目にあり、それがファイルの 13% ぐらいの場所であれば「60, 7 13%」などと表示される。

個人的には set number (行番号表示) してあればそんなに見ないので要らないといえば要らないのだが、まぁ表示しておいても邪魔でもないので ON にしておく。

# set encoding=utf-8

Vim 内部で使用されるエンコーディングを UTF-8 にする。ファイルタイプ判別に失敗した場合や新規ファイルを開いた際にこのエンコーディングとなる。 OS X や Linux の場合はデフォルトで UTF-8 になっているはずなので指定する必要は無いのだが念のため。

# scriptencoding: Vim Script 内で使用するエンコーディングを指定する

つまり Vim Script 内 ... というのは .vimrc も含むのでなるべく早く指定してやったほうが良い。ただ、set encoding の後である必要があるらしいので、直後に指定すればよいか。

# set fileencodings: ファイルエンコーディングの自動判別対象を指定する

このオプションで指定しておくとファイルを開くときに対象のエンコーディングかどうかを自動判別してくれる。 使用できる文字コードは iconv の実装に依存するらしい。

# set number: 行番号を表示する

プログラミングではエラーが出た場合行番号で示す場合が多いので必須のオプション。 ちなみにコピペする際など行番号が邪魔になることがあると思うが、その場合は先頭に `no` をつけて実行すれば良い。

```vim
:set nonumber
:set nonu  " 省略形
```

# set expandtab: タブをスペースに変換する

プロジェクトの規約にもよると思うが、昨今ではタブ文字よりスペース 4 つの方が好まれる場合が多いと思う。

# set tabstop: ファイル上のタブ文字の幅

ファイル上のタブ文字を見た目上何文字分にするかを指定する。

# set shiftwidth: 自動で挿入されるインデントのスペース幅

コードを書いていて Vim が自動でインデントを入れてくれたり >> コマンドでインデントを入れたりした時に挿入されるスペースの量。

# set softtabstop: tab キーを押した時に挿入されるスペース量

0 を指定すると tabstop と同じ値を指定したことになる。

# set hlsearch: 検索語句のハイライト

例えば `/encoding` と検索した際にマッチした encoding の部分がハイライトされる。便利なので ON でいいと思う。

# set showmatch: 括弧の対応関係を一瞬表示する

昔これが「括弧にカーソルを合わせた時に対応する括弧を強調表示する」のだと思っていたが違った。 **閉じ括弧を入力した時に対応する開始括弧に一瞬カーソルが移動し、また元の位置に戻る** という地味に分かりにくい機能。とはいえこの機能がある事を意識してプログラムを書いていれば多少便利かもしれない。

# set cindent: C 言語スタイルのインデントを自動で入れる

C 言語だとよく `if (xxx) {` とか `for (yyy) {` とか書くが、そう書いた次の行はインデントされる。 中括弧 `{` で改行するとインデントするようだが、そのほかにもいろいろルールがあるようだ。 プログラムを書く場合便利なので ON にしておく。

# set showcmd: 入力中のコマンドを表示する

例えば `yy` を実行する際に `y` だけ入力すると「y」が右下に表示される。

# set ignorecase: 検索時に英大小文字の区別を無視する

例えば「Java」を検索したいときに `/java` でヒットするようになる。 `/JAVA` でも良い。後述の smartcase で一部動作が変更される。

# set smartcase: 検索時に全て英小文字で入力した場合のみ区別を無視する

ignorecase の動作を一部変更し、これを ON にすると検索語句を全て英小文字で入力した場合のみ区別を無視するようになる。例えば「Java」を検索したい時に `/java` や `/Java` だとヒットするが `/jaVa` や `/JAVA` はヒットしなくなる。 意識的に ignorecase したい場合は英小文字で入力する事が多いので割と重宝する。

# set nowrapscan: 検索した際に最後の語句の次に最初の語句にループしないようにする

例えば文中に java という語句が 3 つあったとして文頭から `/java` で検索し n を 2 回押すと 3 番目の java に移動するが、 その時 n を押すと「下まで検索しましたが該当語句はありません」などと表示される。 これが set wrapscan だと n を押した時 1 番目の java まで戻り更に n を押していくと 2 番目, 3 番目, 1 番目, ... とループする。

完全に好みだが筆者は nowrapscan にしている。

# set noincsearch: インクリメンタルサーチしない

インクリメンタルサーチとは、1 文字入力する毎にその状態の語句に対し検索を行うものである。 例えば Java という語句を引っ掛けたいとき `/J` と入力した瞬間に他に J で始まる語句がなければその語句の先頭にカーソルが移動する。

何となく画面がチカチカして見辛いので noincsearch にしている。有効にするなら set incsearch で。

# set nobackup: バックアップをとらない

Vim はデフォルトだと編集したファイルに関して同一ディレクトリに「ファイル名 . 拡張子~」といった末尾にチルダを付けたファイルをバックアップファイルとして作成する。 これが非常に鬱陶しいので、 `set nobackup` で無効にする。

ちなみに `set backupdir=(バックアップディレクトリパス)` で指定したディレクトリにバックアップを作成することもできる。 が、個人的にこのバックアップファイルが必要だと思ったことが無いので `set nobackup` にしておく。

# set backspace: バックスペース押下時の挙動を変更する

バックスペースキーを押した時は多くの場面で「手前の文字を消しつつ 1 文字分左に移動して欲しい」と思うのだが、 OS X デフォルトの Vim などではこういった挙動になっていない。その為以下のように記述する:

```vim
set backspace=indent,eol,start
```

それぞれの細かい意味は[こちらの記事](http://www.atmarkit.co.jp/ait/articles/1107/21/news115.html)が詳しいが、もうイディオムとしてこう書いてしまっていい気がする。

# set clipboard: Vim で yank したテキストをクリップボードに格納する

そのまま Vim を使っていると `y` コマンドでコピー (yank) したテキストを他のエディタ等に貼り付けて使えないのが不満だったりする。 そこで以下の指定を書けばそんな事ができるようになる:

```vim
set clipboard=unnamed,autoselect
```

ただこの `set clipboard` を使うには条件がある。[うみやま亭様のこの記事](http://sea-mountain.hatenablog.jp/entry/20110421/1303362772)が詳しい。 以下引用する:

>このset clipboardが使えるのは `vim --version | grep clipboard` をしたときに 
`-clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments 
 -xterm_clipboard -xterm_save` のように `+clipboard` になっていないと使えません。

# set list / listchars: 不可視文字を表示する

コードを書いているとファイルによってタブ文字だったり半角スペースだったりまたはその混在だったりと気になる時がある。 なのでタブ文字や半角スペースが見えるようになると便利だ。 ただ単に表示するには  `set list` で、表示する形式を選択する場合 `set listchars` を使う。

```vim
set list  " 不可視文字を表示する
set listchars=tab:>-,trail:.  " タブを >--- 半スペを . で表示する
```

`listchars` はその他 `eol:X` で行末に X を表示する事が出来るのだが、画面がうるさくなるし個人的に行末スペースで困ったことが無いので非表示にしている。

# 全角スペースも可視化する

プログラマに全角スペースを含んだ文字列を見せると発狂するというネタがあるように、コードと全角スペースの相性は非常に悪い。 意図的に入れているのでは無い限り全角スペースは排除したい。まぁ実際は全スペなんて入れないのだが……。以下の様な感じでハイライト出来る:

```vim
augroup highlightIdegraphicSpace
  autocmd!
  autocmd Colorscheme * highlight IdeographicSpace term=underline ctermbg=DarkGreen guibg=DarkGreen
  autocmd VimEnter,WinEnter * match IdeographicSpace /　/
augroup END
```

# NeoBundle

昨今の Vim の流行りのパッケージマネージャ。.vimrc にインストールしたいパッケージを箇条書きして Vim を起動すればインストールしたり最新に保ったりいろいろやってくれる。 導入方法は GitHub の公式に載っているのでその通りにする。

# colorscheme: テーマ色を変える

デフォルトの色だと味気ないので `colorscheme` でテーマを変えると画面が華やかになる。 筆者は molokai が気に入っているのだがそれも NeoBundle で入れてしまう。 ただ molokai で一点、ビジュアルモード時のマーカが見辛いのが難点なのでそこは以下のように変更した:

```vim
" molokai のビジュアルモードが見辛いので色を変える
autocmd colorscheme molokai highlight Visual ctermbg=8
colorscheme molokai  " カラースキーマ molokai 指定
```

この autocmd にしているのは「molokai で起動 -> 他のテーマに変更 -> 再度 molokai に変更」というパターンに対応するため。 autocmd にしないと再度 molokai にした時に見辛い設定に戻ってしまう。