Vim入門記

私はこれまでろくに`.vimrc`の設定もろくにやったことがないような薄っぺらい人間でした。
[以前の記事](http://qiita.com/us10096698/items/893f7e3c0b1ba69fdd23)で唐突にNeoBundleおよびRuby関連プラグインの導入について述べたのですが、そもそも見よう見まねで何も分かってないので有効活用できてませんでした (当然ですね)。

この記事ではイチから真面目にメモしたいと思います。
記述に間違い等ありましたら教えていただければ幸いです。

## 目標 (2013 秋)
現時点で一応の動作確認はできています。

1. 基本の.vimrc設定を行って(自分が)使いやすい環境に __(この記事で記述)__
1. 外部プラグインの導入
 + NeoBundleによるプラグイン管理 __(この記事で記述)__
 + Markdown記法を利用してシンタックスハイライト、ブラウザプレビュー。[こちらの記事参照](http://qiita.com/us10096698/items/1ac05c5c9543d2f79fa3)
 + NeoComplCacheとNeoSnippetを使って便利に補完
 + TBD...
1. Vimの日本語IME(挿入モード抜けるときにオフりたい)をキーリマップツールを使って何とかする
1. これらの設定を(恥を忍んで)GitHubの公開リポジトリで管理 __(この記事で記述)__

--

それではやっていきます。

## GitHubリポジトリ作成

まずは入れ物を作ってしまいたいと思います。

### 公開リポジトリ作成まで

+ [ナウなヤングのためのgithub入門講座　-基本機能からdotfiles管理まで-](http://d.hatena.ne.jp/shim0mura/20111212/1323660740)

上記サイト様に全て書いてあります。
以下の手順をこなします。

1. GitHubアカウント登録
1. SSH公開鍵設定
1. 公開リポジトリの作成 (以下ではdotfilesという名前にしています)

### .vimrcを作業ツリーへ

上記で作成したdotfilesを作業PC上にクローンしてきます。

```
$ git clone https://youraccount/dotfiles
```

今後`.vimrc`をdotfilesで管理するため、ホームから移動し、シンボリックリンクを貼ります。

```
$ cd
$ mv .vimrc path/to/dotfiles/.vimrc
$ ln -s path/to/dotfiles/.vimrc .
```

### NeoBundleのインストール

ここでVimプラグイン管理プラグインであるNeoBundleを導入します。
こちらもdotfilesで管理しますが、外部リポジトリを参照する形になりますので`$ git submodule`で追加しています。

```
$ cd path/to/dotfiles
$ git submodule add https://github.com/Shougo/neobundle.vim.git .vim/bundle/neobundle.vim
```

`.vim`ディレクトリもホームにシンボリックリンクを貼ります。

```
$ cd
$ ln -s path/to/dotfiles/.vim .
```

`.vimrc`に以下を追記します。
[公式](https://github.com/Shougo/neobundle.vim)のサンプルとは違っていますので、何か不具合あればご指摘いただければ幸いです。

```.vimrc
 if has('vim_starting')
   set nocompatible               " Be iMproved
   set runtimepath+=~/.vim/bundle/neobundle.vim/
 endif

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

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

  NeoBundle 'Shougo/vimproc'
  NeoBundle 'Shougo/unite.vim'

" NeoSnippets
  NeoBundle 'Shougo/neocomplcache'
  NeoBundle 'Shougo/neosnippet'

" Added For Ruby Programming
  NeoBundle 'AndrewRadev/switch.vim'
  NeoBundle 'tpope/vim-endwise'

 filetype plugin indent on     " Required!
 NeoBundleCheck
```

ちなみにProxy環境の場合は以下の行をcall文の後くらいに置いてください。httpsで繋ぎにいってくれます。
`let g:neobundle_default_git_protocol='https'`

編集が終わったらVimを再起動し、`:NeoBundleInstall`でプラグインをインストールします。
※ ちなみに`NeoBundleCheck`を書いておけばVim再起動時に対話的にインストールしてくれます(知りませんでした)。

なお、今後必要ないプラグインができた場合は`.vimrc`から削除後に`:NeoBundleClean`で削除できます。

### .gitignoreの記述

こうしてNeoBundleでインストールしたプラグインは`.vim/bundle`以下に配置されます(上記でそう指定しました)。
`$ git submodule`で追加したneobundle以外は、`dotfiles/.gitignore`でリポジトリの管理対象外にしておきます。

```.gitignore
.vim/bundle/*
!.vim/bundle/neobundle.vim
```

### リモートリポジトリにpush

ここまでで一旦区切りを付けます。
作業ツリーをステージング(add) -> 変更の確定(commit) -> リモートリポジトリにpush、という流れでGitHubに持っていきます。

```
$ cd path/to/dotfiles
$ git add .
$ git commit -m 'my first commit'
$ git push
```

準備は以上です。

---

## 基本の.vimrc設定
それでは`.vimrc`の設定をやっていきます。
この間のようにいきなり背伸びした真似はせずに、バニラでできる設定をコツコツとやっていきます。

現時点では以下の設定を行っています(自分がやりやすいように、がテーマ)。
そのほかの設定項目は[このサイト](http://www15.ocn.ne.jp/~tusr/vim/options.html)がとても参考になると思います。
同サイトの[Tipsページ](http://www15.ocn.ne.jp/~tusr/vim/vim_text2.html)にもお世話になりっぱなしです。

### :setパラメータ一覧

|設定項目|My設定値|設定内容の説明|
|----|----|----|
|nocompatible|-|Vi互換を切る(便利機能を使いたい)|
|encoding|utf-8|内部エンコーディングをUTF-8に指定|
|fileencodings|iso-2022-jp,utf-8,cp932,sjis,euc-jp|ファイルの文字エンコード定義(前方から適用、エラーがないものを採用)|
|number|-|行番号を表示|
|backspace|indent,eol,start|backspaceキーの挙動。インデント、改行記号、行頭文字を削除可能に|
|tabstop|4|\<TAB\>押下時のインデント幅|
|clipboard|unnamed|クリップボードを使う|
|ruler|-|何行目の何列目かを表示|
|wrap|-|ウインドウより長い行を折り返して表示|
|list|-|不可視文字を表示|
|listchars|trail:-,tab:>-|listがonの時に使う文字を指定(trail:行末のスペース、tabはタブ。他にもあり)|
|smartindent|-|現在のインデント幅を維持|
|showmatch|-|カッコ記号の対応するものをハイライト|
|whichwrap|b,s,<,>|カーソルを行頭/行末で止まらないように(b:backspaceキー,s:spaceキー,<は左、>は右キー)|
|textwidth|0|自動改行無効|
|laststatus|2|ステータスラインを常に表示|
|statusline|表外参照|ステータスラインの書式を指定|
|ignorecase|-|検索時に大文字、小文字を区別しない|
|smartcase|-|検索時に大文字が指定された場合のみ区別して検索|
|nowrapscan|-|下まで検索したら最初に戻らない|
|hlsearch|-|検索結果をハイライトする|
|wildmode|list,null|\<TAB\>キーによるコマンドライン補完設定|
|noswapfile|-|スワップファイルを作らない|
|backupdir|$HOME/.vimbackup|バックアップファイルを保管するディレクトリを指定|

### ステータスラインの表示設定
[このページ](http://www.ksknet.net/vi/statusline.html)を参考にさせていただきました、というかマネさせていただきました。

```.vimrc
set statusline=%<%f\ %m%r%h%w
set statusline+=%{'['.(&fenc!=''?&fenc:&enc).']['.&fileformat.']'}
set statusline+=%=%l/%L,%c%V%8P
```

### Cygwin向けマッピング
CygwinのVimは+clipboardではないので、ヤンクした文字列を`:cb`コマンドでクリップボードに貼り付けられるようにマッピングしました。
[Mac向けには以前別の記事を書きました。](http://qiita.com/us10096698/items/f656b89ee7d0d02d37cb)

```.vimrc
noremap :cb :w !cat > /dev/clipboard
```

__追記： 追加プラグインによる対処__
上記のコピペはバッファ全体しかコピーできないので現在は追加プラグインの[fakeclip](https://github.com/kana/vim-fakeclip)で*レジスタとのやりとりを行っています。

```:.vimrc
NeoBundle 'kana/vim-fakeclip'
vmap ,y "*y
nmap ,p "*p
```

`:source ~/.vimrc`で反映しましょう(NeoBundleCheckが有効ならそのままインストールしてくれます)。
これで`y`、`p`でクリップボードへのコピペが有効になります。

## 変更をリモートリポジトリにpush

変更したら初回push時と同様、 addして作業ツリーをステージング -> commitで作業ツリーの変更内容を確定 -> pushでリモートリポジトリにpushすることができます。

## 今後は…

今後新しい環境に移行しても、落ち着いてこのリポジトリをクローンし、`.vim`ディレクトリと`.vimrc`のシンボリックリンクを貼ればマイセッティング済になります。(もっと良いやり方があるかもしれませんが…)

__追記： Submoduleの導入手順を忘れてました。__

```bash
$ cd path/to/dotfiles
$ git submodule init
$ git submodule update
```

以上になります。だんだん便利になってくるのが嬉しいです。
今後メンテすることがあったら適宜追記していきたいと思います。