Vimおべんきょうメモ



## 目的と方針

これまではサクラエディタとかSublime Textを使ってきたけど、仕事でLinuxをCUIベースで使うことが多くなってきたので、色んな環境で使えるVimに慣れていきたい。

設定ファイルをGitHubで管理して、どこでも``git clone``と少しの手間だけで同じ環境が使えるようになるといいな。

[honeniq / dotfiles](https://github.com/honeniq/dotfiles)

### 利用環境

#### Mac

自宅用。[MacVim KaoriYa版](https://code.google.com/p/macvim-kaoriya/)を使用。
設定は基本的にここで作って、他で流用する感じ。

#### Windows

自宅用サブ・職場用。[gVim KaoriYa版](http://www.kaoriya.net/software/vim/)を使用。
職場がシンボリックリンクを使えない環境なので、どうしてやろうか検討中。

#### Linux

職場のサーバー様お世話用。どれを使うべきかよく分からないので、``yum``とかで落ちてくるものをそのまま使う予定。
色んな環境を行ったり来たりするので、最初に``git clone``するだけで済ませたい。


### ディレクトリ構成

```
~/dotfiles
├── .git
├── .gitignore
├── .vim
│   ├── bundle
│   └── userautoload
│       ├── basic.vim
│       └── neobundle.vim
└── .vimrc
```

* HOME配下にdotfilesディレクトリを作り、そこをGitHubと同期する。
* .vim/bundleは同期しないように.gitignoreに書いておく。
* Vimから見つけられるように、HOME直下にシンボリックリンクを作る。

```
$ ln -s ~/dotfiles/.vim
$ ln -s ~/dotfiles/.vimrc
```

#### Windows版のみ

Windows版はドットファイルが扱いづらい関係で、「.vimrc」の代わりに「_vimrc」になっていたりする。
シンボリックリンクに「_vimrc」って名前を付けてもいいんだけど、今のところは両方のファイルを使い分ける方針に。
「.vimrc」を機能ごとに分割するので、「.vimrc」そのものにはほとんど設定が残らない予定だし、だったらWindowsの機種依存な部分を「_vimrc」に切り出してしまえという考え。


### .vimrcの分割

[.vimrcを機能分割する](http://qiita.com/megane814/items/6a4cf96bbb99168479d7)

「.vim/userautoload」に、「.vimrc」を機能ごとに分割したファイルを入れていく。拡張子は.vim。

```.vimrc
set runtimepath+=~/.vim/
runtime! userautoload/*.vim
```

### プラグイン管理
[Shougo / neobundle.vim](https://github.com/Shougo/neobundle.vim)
[NeoBundleの導入](http://qiita.com/puriketu99/items/1c32d3f24cc2919203eb)

vimのプラグイン管理はNeoBundleで行う。
.vim/bundle配下にプラグインを入れる。
他のプラグインはNeoBundleが管理してくれるけど、NeoBundle自身はさすがに無理なのでGitHubからCloneしてくる。

```
 $ mkdir -p ~/.vim/bundle
 $ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

neobundle.vimに設定を入れて、.vimrc分割の動作確認も兼ねる。
とりあえず最初に、見た目にも分かりやすいNERD-treeを入れてみる。


## Vimの基本設定

基本というか、Vim本体の設定。

### vimrcの種類

一番よく使う「.vimrc」以外にも、設定ファイルと呼べるものはある。

* .vimrc ユーザー用設定。HOME直下に配置。
* .gvimrc ユーザー用設定その2。GUI版を使うときは、こちらも読み込まれる。
* vimrc 全ユーザー共通設定。あまり触らない。
* gvimrc 全ユーザー共通設定その2。あまり触らない。

大事なのが「.vimrc」と「.gvimrc」の使い分け。
CUI版は「.vimrc」だけ、GUI版は両方読み込むので、「.gvimrc」にはGUI版のみに該当する項目を書く。
逆に、CUIとGUIの両方に該当するような設定は、必ず「.vimrc」の方に書くようにする。
両方に該当して、かつプラットフォームに依存しないような設定は、分割先の「basic.vim」に書く。


### basic.vim

可能なかぎりVim本体の設定はここへ。

[vimエディタ・スターターマニュアル #8 （設定ファイル）](http://nanasi.jp/articles/howto/user-manual/user-manual-config.html)
このページのサンプル設定を使って作成。

あとで見ても自分が理解できるように、コメントは消さない。
また、自分が使わない設定であっても、行全体を消すのではなく、コメントアウトして残しておく。


## NeoBundleの使い方

### NeoBundleの初期設定

「.vimrc」を分割しているので、「neobundle.vim」に書く。

```
if has('vim_starting')
  set nocompatible               " Be iMproved

  " Required:
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

" Required:
call neobundle#rc(expand('~/.vim/bundle/'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" My Bundles here:
NeoBundle 'scrooloose/nerdtree'


" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
```

基本的なところはNeoBundleのREADMEに書いてあるものをそのまま利用。

### プラグインの追加

「neobundle.vim」上に``NeoBundle 'プラグインのパス'``の形で列挙していく。
設定の一番最後にある``NeoBundleCheck``で、追加したプラグインがあればインストールされる。

一時的に使わなくなったやつは、行頭に``"``つけてコメントアウトしておく。


### プラグインの削除

↑でコメントアウトしたプラグインは無効になるけど、実体のファイルは残ったままになってしまう。
Vim上で``:NeoBundleClean``を実行すると完全にアンインストールできる。

### プラグインの更新

Vim上で``:NeoBundleUpdate``。

### NeoBundleの状況確認

Vim上で``:NeoBundleList``とか``:NeoBundleLog``とか。
ちゃんとプラグインが入っているか不安になったときに。

## その他

### 分割vimrcのロード順

その後いろいろプラグインを入れたり設定をいじったりしているうちに、一部でエラーが出るようになってしまった。

```
honeniq$ vim
Error detected while processing /Users/honeniq/dotfiles/.vim/userautoload/keybind.vim:
line   34:
E117: Unknown function: submode#enter_with
line   35:
E117: Unknown function: submode#enter_with
line   36:
E117: Unknown function: submode#enter_with
line   37:
E117: Unknown function: submode#enter_with
line   38:
E117: Unknown function: submode#map
line   39:
E117: Unknown function: submode#map
line   40:
E117: Unknown function: submode#map
line   41:
E117: Unknown function: submode#map
Press ENTER or type command to continue
```

[Vimの便利な画面分割＆タブページと、それを更に便利にする方法](http://qiita.com/tekkoc/items/98adcadfa4bdc8b5a6ca)
この記事のキーバインドを真似してたら出たエラー。

原因は、*.vimのロード順だった模様。
NeoBundle関係を「neobundle.vim」に、キーバインド関係を「keybind.vim」に書いてたんだけど、ファイル名的に「keybind.vim」の方が「neobundle.vim」よりも先に読み込まれるので、プラグインのロード前にプラグイン内のメソッドを使うキーバインドを指定することになっていた。ただ、エラーが出ても該当のキーバインド自体は効いていたので、エラー箇所が弾かれるわけではないのかな？

「neobundle.vim」の頭にアンダーバーをつけて「_neobundle.vim」にすることで解決。

### インストールスクリプトを入れた

新しい環境でVimを使うようになったので、.vimrc等のシンボリックリンクを作る作業が面倒になってきた。のでスクリプト化した。

#### *nix用

OSXもこれでOK。

```
#!/bin/sh

ln -sf ~/dotfiles/.vimrc ~/.vimrc
ln -sf ~/dotfiles/.gvimrc ~/.gvimrc
ln -sf ~/dotfiles/.vim ~/.vim
mkdir ~/.vim/tmp

git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

#### Windows用

```
mklink %HOMEPATH%"\.vimrc" %HOMEPATH%"\dotfiles\.vimrc"
mklink %HOMEPATH%"\.gvimrc" %HOMEPATH%"\dotfiles\.gvimrc"
mklink /D %HOMEPATH%"\.vim" %HOMEPATH%"\dotfiles\.vim"
mkdir %HOMEPATH%"\.vimrc\tmp"

git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

exit 0
```

### スワップ・バックアップファイルの置き場所

デフォルトでは編集中ファイルと同じ場所に置かれて鬱陶しいので、``~/.vim/tmp/``を新しく作ってそこにまとめるようにした。

```
set directory=~/.vim/tmp
set backupdir=~/.vim/tmp
set undodir=~/.vim/tmp
```