vimで読み込まれるファイルについて

# vimでの設定ファイルの考え方

* `対象者`:結局vimってどうやって設定すりゃいいんよ？って人、あるいは私と同じvim初心者
* `前提知識`:vimrcに関する知識少々
* `必要なパッケージ`:vim
* `終着点`:楽々vim環境整備♪

## runtimepathが重要

> vimのファイル読込においてruntimepathが重要な役割を果たします。
> VimのDocumentationにはruntimepath内の特定のファイルが順繰り読み込まれることが明記されています。
> さっそくruntimepath設定を見る

```vim
:set runtimepath
```

私のruntimepath(※ NeoBundle分は除く,Windows)

```vim
:runtimepath=~/.vim/,~/vimfiles,C:\app\Vim/vimfiles,C:\app\Vim,C:\app\Vim/vimfiles/after,~/vimfiles/after
```

> vimやWindows以外の大半のシステムにおいて~(チルダ)はホームディレクトリを指します。
> これはWindows7なら`C:\Users\user_name` ,Linuxなら`/home/user_name`を指しているかと思います。
> ここから分かるように設定ファイルはホームディレクトリを基準に配置するのが良いといえるでしょう。

検索されるファイルとディレクトリは以下の通りです。

* filetype.vim  ファイル名によるfiletypeの決定
* scripts.vim   ファイルの内容によるfiletypeの決定
* autoload/     自動的に読み込まれるスクリプト
* colors/       カラースキーマの定義
* compiler/     コンパイラ定義ファイル
* doc/          ヘルプドキュメント
* ftplugin/     ファイルタイプ別のプラグイン
* ftdetect/     ファイルタイプを判別するファイル
* indent/       インデントの設定
* keymap/       キーマップの定義
* lang/         メニューの翻訳(GVim)
* menu.vim      メニューの設定(GVim)
* plugin/       プラグインスクリプト
* print/        印刷用
* spell/        スペルチェック用
* syntax/       文法
* tutor/        チュートリアル

> Windowsはエクスプローラーから.(ドット)で始まるファイルやフォルダは作れないため、コマンドを使用して.vimrcを作成することをおススメします。
> `_vimrc`は削除して`.vimrc`に追記してね。

```bat:.vimrcがある人は不要
> echo ""this is .vimrc >> .vimrc
```

```vim:.vimrc
if has('win32') >> .vimrc
    set runtimepath^=~/.vim/ >> .vimrc
endif
```

## 結局どう設定するか

> ~/.vim以下に設定したいディレクトリを作成して各種ファイルを配置します。
> 私はcolors, ftdetect, indentを定義・設定しています。
> [dotfiles](http://qiita.com/himinato/items/7f5461814e8ed8916870)を使った管理を行うとシステム間の同期が更に楽です。

> ただしindentについてはその後に読み込まれるpluginなどのindentディレクトリ内の内容によっては設定が上書きされる可能性があります。
> 自分で記載した`indent/拡張子.vim`での設定が上書きされるのを防ぎたい場合、大抵は`~/.vim/after/indent`内にいれることによって解決するかと思います。
> Windowsに限って`~/.vim`同様`runtimepath`に`~/.vim/after`を追加する必要があります。

```sh
$ cd ~ # windows -> cd %HOMEPATH%
$ mkdir .vim
$ cd .vim
$ mkdir colors ftdetect, indent
```

* `colors`内には自分でカスタマイズしたカラースキーマ定義ファイルを入れます。
* `ftdetect`内には拡張子.vimファイルを入れて、拡張子ごとのファイルタイプ判別をカスタマイズします。
* `indent`内には拡張子.vimファイルを入れて、ファイルタイプ毎のインデント設定をカスタマイズします。

```vim
:echo $VIM
```

> で表示されるディレクトリ以下のファイルを編集することなかれ、vimをインストールするたびにまた設定しなきゃいけなくなりまっせ。

## 結果的にどうなるのか

> ftdetectではcls拡張子の時は判定によってはファイルタイプをvbに変えたいとか。
> indentではファイルタイプごとにインデントを変更したいとかが実現できます。
> 例えば通常時はtabで4文字分のホワイトスペースを入れたいけど、ruby系のファイルを編集する時は 2文字分にするとか。

## 実例というよりは私の設定

> それぞれのディレクトリに置いてね。

* colors

> desert.vimを改造したものを使っています。
> 自分好みにカスタマイズしたい人はこれがオススメです。

* ftdetect

> 例えば.clsのファイルの内容によってはファイルタイプをvbにしたい場合。(if文の最初の条件をfiletype.vimに更に追加した感じ)
> やっている事自体はファイルの内容に特定の文字列が含まれていればファイルタイプはvbにするよって感じです。

```vim:cls.vim
au BufRead,BufNewFile *.cls
	\ if getline(1).getline(2).getline(3).getline(4).getline(5).getline(6).getline(7).getline(8).getline(9).getline(10) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)' |
	\   set filetype=vb |
	\ elseif getline(1) =~ '^%' |
	\   set filetype=tex |
	\ elseif getline(1)[0] == '#' && getline(1) =~ 'rexx' |
	\   set filetype=rexx |
	\ else |
	\   set filetype=st |
	\ endif
```

* indent

> 例えばファイルタイプがrubyのインデントを2文字にしたい場合

```vim:ruby.vim
setlocal expandtab
setlocal shiftwidth=2
setlocal softtabstop=2
setlocal tabstop=2
setlocal autoindent
```

> こんな感じです。
> 公開されているプラグインの`indent`などでは`b:did_indent`という変数によって、開いているvimバッファ内でインデントについて設定済みかどうかを判定させています。
> 今回はvimのちょこっとカスタマイズにこのファイルを利用しているだけですので`b:did_indent`の記載がありません。
> なおこのファイルは`indent`ディレクトリ内の内容としては圧倒的に設定が欠けていますので、(プラグインを公開している方でこのことについて理解が無い方はおそらくいないかと思いますが)プラグインと一緒に公開してしまわないように...。

## 実例の他には

> がりがりとプラグインを書く人なら`autoload`や`plugin`にファイルを追加します。
> また私みたいなライトユーザが触るとしたら`keymap`やGVimを使う人でしたら`menu.vim`などでしょうか。
> もし、自作したpluginをgithubで公開するような人なら説明文を`doc`に入れておくと親切ですね。