自分のvimでやってきたことのまとめ

しばらくvimを使ってきて、いろいろ設定を変えたり、プラグインを入れたりして大分馴染んできました。

Vimは使いこなせば便利なのですが、いきなり使いこなそうとすると死ぬので、とりあえず使えるレベルから初めて徐々にコマンドを覚えていけばよいかと思います。

なんていうかスポーツと一緒でいきなりオリンピック選手にはなれないので、基礎練しっかりやって、次のステップに行きましょう。覚えるというよりかは体に染み込ませるみたいな感じ。jキーのカーソル移動が上か下かはパッとでてこないけど、手をホームポジションに置くと自然と動かせるあの感じです。

なんか結構長いので、とりあえずちょっとカスタマイズしてみたい人は下記の設定をおすすめ！

- [カーソルスピードをあげる](http://qiita.com/ykyk1218/items/ab1c89c4eb6a2f90333a#カーソルの速度を変える)
- [NeoBundleの導入](http://qiita.com/ykyk1218/items/ab1c89c4eb6a2f90333a#neobundle)
- [NERDTreeの導入](http://qiita.com/ykyk1218/items/ab1c89c4eb6a2f90333a#nerdtree)
- [カラースキーマを変更](http://qiita.com/ykyk1218/items/ab1c89c4eb6a2f90333a#カラースキーマの設定)

多分この4つやっただけで、だいぶ使いこなせている感でますw
特にカラースキーマを変更すると、自分用にカスタマイズした感がでてvimに愛着がわきます（きっと）。

だって、

人は見た目が9割、vimも見た目が9割
http://www.amazon.co.jp/%E4%BA%BA%E3%81%AF%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%8C9%E5%89%B2-%E6%96%B0%E6%BD%AE%E6%96%B0%E6%9B%B8-%E7%AB%B9%E5%86%85-%E4%B8%80%E9%83%8E/dp/4106101378

全部見るの面倒って言う人のために.vimrcはここにおいておきますね。
https://github.com/ykyk1218/myvim

プラグインと小技系はこちらをみた方がよいです。
[プラグインまとめ](http://qiita.com/ykyk1218/items/ab1c89c4eb6a2f90333a#vimのプラグインを入れ始めた)
[小技まとめ](http://qiita.com/ykyk1218/items/ab1c89c4eb6a2f90333a#いろいろ興味がでてきて小技も覚えはじめました)

まだまだ使いこなせてないです。もっとこんな便利な使い方あるよーって言う方いたら教えてください！

## Vim使い始め
vimすげーよ、vim超便利、という話はよく聞いていたのですが、いざ自分が使ってみると、使いにくいことこの上ない。

- 矢印しか使えないのでカーソル移動が遅い
- コピペできない
- とりあえず':wq'だけ覚える

といった状態でした。
この状態で僕がやったことは、将来は使えると絶対便利になると思っていたので、
**とりあえず無理やり使う** ようにしてました。
「今回はVimで全部コーディングする！」みたいに決めて、ちょっと操作がわからなければすぐに検索して覚えるようにしてました。

このころ使えていたコマンドはせいぜいyy→pぐらいですね :pensive:

後はこういうサイトでvimの操作になれるようにしていきました。
**VIM Adventures**
http://vim-adventures.com/
<img width="687" alt="スクリーンショット 2015-12-10 19.09.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/6808/2c5c1157-32b3-0acf-e7f3-3eeeb0af306d.png">

## Vimで作業できるレベルになったころ
ある程度なれてきて、単純カーソル移動ぐらいならできるようになってくると、こういう設定した方がいいのではという事を考えるようになってきました。

特に書く最初のころは行頭（`^`)と行末(`$`)にカーソルを移動させるのが面倒だったので、ここの部分のキーマッピング設定しました。

```
inoremap <C-e> <Esc>$a
inoremap <C-a> <Esc>^a
noremap <C-e> <Esc>$a
noremap <C-a> <Esc>^a
```

これの意味は

|設定|内容|
|---|---|
|inoremap|インサートモードでキーマッピング|
|noremap|ノーマルモードでキーマッピング|

なので、`inoremap <C-e> <Esc>$a`は
Ctrキーとeキーを押したときにノーマルモードに変更してカーソルを行末に移動して、挿入モードにする、となります。

たったこれだけだったのですが、結構効率が変わりました。後はもう一つ個人的には結構衝撃的なことがありました。

### カーソルの速度を変える

カーソル移動のキーを覚えてないので、ちょっとしたカーソル移動にも不便を感じていたのですが、下記の設定をしてからカーソル移動でのストレスが激減しました。

http://qiita.com/ykyk1218/items/8f5471c5e90cc83fd407#番外編キーリピートを高速化



## Vimのコマンドをいろいろ覚え始めた

このころから本格的Vimのコマンドを覚え始めました。

もっと簡単にカーソル移動できないかな？
もっと簡単にファイルを開けないかな？
もっと簡単にファイル編集できないかな？

というのをちょくちょく考えてやるようにはしてました。とはいえまだ、このころでも普通のエディタ（Atom/SublimeText/VSCodeとか）のほうが使い勝手がよかったです。

このころに覚えたキー達です。

### カーソル移動系コマンド

|キー|動作|
|---|---|
|w|右に進む|
|b|左に戻る|
|gg|ファイルの先頭に移動|
|G|ファイルの末尾に移動|
|M|画面の真ん中に移動|
|Ctr-f|一画面進む|
|Ctr-b|一画面戻る|

他にもいろいろあるのですが、この辺が使えてれば作業には困らないレベルにはなっていると思います。
このころはj、k、l、hのカーソル移動がまだ、ままならなかったのでとりあえずj、kだけ覚えてカーソルの右、左はwキーとbキーに委ねるようにしてました。

### ファイル、ウィンドウ操作

|キー|動作|
|---|---|
|:e <ファイルパス>|現在のウィンドウにファイルを開く|
|:sp <ファイルパス>|現在のウィンドウを横に分割してファイルを開く|
|:vp <ファイルパス>|現在のウィンドウを縦に分割してファイルを開く|
|Ctr+w+w|次のウィンドウへフォーカスを移動|
|Ctr+w+↑(k)|上のウィンドウへフォーカスを移動|
|Ctr+w+↓(j)|下のウィンドウへフォーカスを移動|
|Ctr+w+-|現在のウィンドウを広げる|
|Ctr+w+=|全てのウィンドウの大きさを揃える|
|u|アンドゥ|
|ctr+r|リドゥ|

正直これだけだと、まだ不便さが拭えなかったです、、、最低限の必要なところですね。
でもウィンドウを分割するようになると、 **ちょっとしたやってる感** がでてvimに興味が湧いてきました。
画面分割に関しては、僕は横がメインです。

Ctr+hogeのところはCtrキーは押しっぱなしで問題ないです。

### 検索

|キー|動作|
|---|---|
|/<検索ワード>|指定したキーワード検索|
|n|次の検索結果にカーソルを移動|
|N|前の検索結果にカーソルを移動|

これだけ
とりあえずどうにかなります。

### その他

**入力補完**
Ctr+p
入力中にキーをctr+pを押すと、補完してくれます。次に出てくるneocomplecacheを覚えるまでの間重宝しました。

**ビジュアルモード**
通常モードで`v`を押すとビジュアルモードになります。

このビジュアルモードを覚えるまでは、複数行をコピーするのに、`y3`とかでできるのですが、いかんせん何行目までをコピーすればよいのかがパット見でわからないことがほとんどなので、いちいちマウスを使って普通のエディタみたいにコピペしてました。

ビジュアルモードをマスターしてからは、
1. ビジュアルモードでコピーしたい範囲を選択
2. `y`でヤンク
3. ペーストしたい箇所にカーソルを移動して、`p`でペースト

とできるようになりました。

（この場合いちいちカーソルがビジュアルモード開始位置に移動するのですが、これどうにかならないかな・・・）

## Vimのプラグインを入れ始めた

いよいよ本格的にVimをカスタマイズしていくようになりました。プラグインの登場です。
ファイル間の移動がとにかくやりずらかったので、まずはその辺のプラグインを探し始めました。

### NeoBundle

vimのプラグイン管理はこれがなければ始まらないので、とりあえずいれます。
https://github.com/Shougo/neobundle.vim

設定は
https://github.com/Shougo/neobundle.vim#quick-start

こちらの手順通りにやればうまくいくと思います。

### カラースキーマの設定

NeoBundle入れたついでにカラースキーマの設定を変えました。
NeoBundleでインストールできるので、簡単。もっとはやくやればヨカタ。


```
NeoBundle 'w0ng/vim-hybrid'

colorscheme hybrid
```
僕はこのhybridを使ってます。

使える色の一覧はこちら
http://cocopon.me/app/vim-color-gallery/index.html?welcome=1

しかし、デフォルトのvimの色ってなぜにああもドギツイ色設定になっているのか・・・


### NERDTree

https://github.com/scrooloose/nerdtree

まずはこれ。フォルダ階層をツリー表示してくれるすぐれものです。
各ノードで押すキーによってファイルの開き方を変えることができます。


|キー|動作|
|---|---|
|enter|直前のバッファのウィンドウで開く（フォルダの場合は展開する）|
|x|展開したフォルダを閉じる|
|i|横に分割して開く|
|s|縦に分割して開く|
|t|別タブで開く|


![tree.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/64eaa490-666e-64a4-99fe-16dc30a63e03.gif "tree.gif")



又`m`を押すとメニューが表示されてファイルのコピー、追加、削除、リネームができます。
コマンドラインにいちいち戻らなくていいので結構便利
この画面だけでことたります。

![tree2.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/a0f0d79e-ed5c-af2c-d4db-5df4530df6a3.gif "tree2.gif")


プラグインを実行するときに **:NERDTreeToggle** と打つ必要があるのですが、面倒なのでキーマッピングさせました。

```
nnoremap :tree :NERDTreeToggle
```


似たようなプラグインでvimfilerというのもあります。
https://github.com/Shougo/vimfiler.vim

こちらはツリー表示を全画面でだすようになります。vimになれている人だとツリー表示させてファイル間移動するのはかったるいと思いますが、僕ぐらいのvimレベルだとこうしたプラグインは大変ありがたいです。


### Unite.vim

https://github.com/Shougo/unite.vim

ファイル開くときには先ほどの、NEADTreeか、:sp、:eを使って開くことが多いのですが、もう少しさくっとイケてる感じでファイルを開けるのがこのUnite.vimです。

僕がこれを使う場面は、「さっき開いてたあれ、もう1回みたいなー」っていう過去のファイルを開きたいときです。
そんなときは、Unite.vimと同時に、Shougo/neomru.vimもいれます。

これがファイルを開いた履歴をUnite.vimを使用してみれるプラグインです。

![unite.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/0e8007f8-79b2-4a25-0635-182919850b01.gif "unite.gif")


Unite関連の.vimrcの設定は

```
" unite.vimの設定
noremap <C-U><C-F> :Unite -buffer-name=file file<CR> " ファイル一覧
noremap <C-U><C-R> :Unite file_mru<CR> " 最近使ったファイル一覧

au FileType unite nnoremap <silent> <buffer> <expr> <C-i> unite#do_action('split') " ウィンドウを分割して開く
au FileType unite inoremap <silent> <buffer> <expr> <C-i> unite#do_action('split')

" ESCキーを2回押すと終了する
au FileType unite nnoremap <silent> <buffer> <ESC><ESC> q
au FileType unite inoremap <silent> <buffer> <ESC><ESC> <ESC>q
```

Unite.vimのコマンドは基本長くて覚えられないので、これもキーマッピングさせてます。
↑のサンプルgif動画では
1. <Ctr+u>+<Ctr+r>:ファイルの閲覧履歴を表示
2. i:インサートモードに変更
3. 検索ワードを入力
4. 対象のファイルパス上でctr+i

という流れになってます。

### neocomplcache（neocomplete)

https://github.com/Shougo/neocomplcache.vim

（neocomplcacheは保守のみになって、開発はneocompleteの方で行われているので、今から入れる人はneocompleteのほうが良いかと思います。
https://github.com/Shougo/neocomplete.vim）

私がNEADTree、Unite.vimと合わせて **vim三種の神器** と勝手に僕が呼んでいるneocomplacacheです。これは入力時に文字を自動補完してくれる、超頼もしいやつ。これがあると、IDEにも引けをとらない開発環境ができると思います。

![neocomplcache.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/d3979c07-a7bc-9c55-57cb-75a2445dd50c.gif "neocomplcache.gif")


ただ、こいつは設定する項目が多くてちと面倒
どこからかコピってきた設定をのせておきます。（すいません、どこからコピーしたかは忘れていましました・・・）

```
highlight Pmenu ctermbg=4
highlight PmenuSel ctermbg=1
highlight PMenuSbar ctermbg=4

" 補完ウィンドウの設定
set completeopt=menuone

" 補完ウィンドウの設定
set completeopt=menuone

" rsenseでの自動補完機能を有効化
let g:rsenseUseOmniFunc = 1
" let g:rsenseHome = '/usr/local/lib/rsense-0.3'

" auto-ctagsを使ってファイル保存時にtagsファイルを更新
let g:auto_ctags = 1
 
" 起動時に有効化
let g:neocomplcache_enable_at_startup = 1
 
" 大文字が入力されるまで大文字小文字の区別を無視する
let g:neocomplcache_enable_smart_case = 1
 
" _(アンダースコア)区切りの補完を有効化
let g:neocomplcache_enable_underbar_completion = 1
 
let g:neocomplcache_enable_camel_case_completion  =  1

" 最初の補完候補を選択状態にする
let g:neocomplcache_enable_auto_select = 1
 
" ポップアップメニューで表示される候補の数
let g:neocomplcache_max_list = 20
 
" シンタックスをキャッシュするときの最小文字長
let g:neocomplcache_min_syntax_length = 3

" 補完の設定
autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete
if !exists('g:neocomplete#force_omni_input_patterns')
  let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_omni_input_patterns.ruby = '[^.*\t]\.\w*\|\h\w*::'

if !exists('g:neocomplete#keyword_patterns')
        let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '\h\w*'
```

### 他にもいろいろいれた

後は、いろいろ進めていくうえで不便さを感じるところを解消できるプラグインないかなーと思って検索して取り入れていってます。
困ったことは検索すればだいたい解決。いい時代になりました。

|キー|動作|
|---|---|
|vim-endwise|ruby向け、endを自動でいれてくれる|
|html5.vim|html5のシンタックスカラーon|
|vim-coffee-script|coffeeスクリプトのシンタックスカラーon|
|vim-visual-star-search|ビジュアルモードで選択した範囲を*で検索できるようにする|



## もっと便利になるように設定した

このころには、だいぶVimをストレスなく使えるようになってきて、必要最低限の動作はできるようになってきました。
ただ世の中には便利なエディタがいっぱいあるので、それらに使い勝手で負けてしまってはVimを使っている意味ないじゃないかと思い、コーディングスピードがあがる便利設定をしていくようになりました。

### ctagsの活用

ctagsはソースコード上のメソッド名とか変数の宣言箇所のインデックスを作成するプログラムです。
これを使うことで宣言箇所にジャンプすることができます。
これはプラグインとかではなくて、Vim本体の機能です。

#### ctagsのインストール

macだと既に入っているみたいなのですが、オプションが微妙に違っているので別途インストールしましょう。

```
brew install ctags
```

#### ctagsの実行

```
ctags -R
```

これで、カレントディレクトリにtagsファイルが作成されます。
![ctag.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/888ff1c6-f1d7-ac0c-e2f4-7e93c6fcf23a.gif "ctag.gif")


ctags使えるとこんな風にだいぶ便利にファイル間の移動ができます。

これは
1. ファイルを開く
2. hoghoge関数上で`ctr+]`
3. 別ファイルに定義されているhogehoge関数にカーソルが移動
4. `ctr+o`で前のバッファに戻る
5. 今度は`ctr+k`で先ほど開いたファイルををウィンドウを横に分割して開く
6. `<ctr+w><ctr+w>`で最初のウィンドウにフォーカスをあてる

.vimrcへのctags用の設定はこちら

```
nnoremap <C-h> :vsp<CR> :exe("tjump ".expand('<cword>'))<CR>
nnoremap <C-k> :split<CR> :exe("tjump ".expand('<cword>'))<CR>


" unite-tagsの設定
autocmd BufEnter *
\   if empty(&buftype)
\|      nnoremap <buffer> <C-]> :<C-u>UniteWithCursorWord -immediately tag<CR>
\|  endif
```

ctagsで見つかったファイルを画面分割して開けるようにキーマッピングしてます。

都度タグを更新するのは面倒なのですが、勝手にタグが更新されるプラグインがあるので、こちらをいれておくと便利。
**auto-ctags**
https://github.com/soramugi/auto-ctags.vim

### htmlの閉じタグ補完

htmlで閉じタグを勝手に補完してくれるやつ
</ を入力すると閉じタグを補完します

![html.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/49627773-8339-7ef4-eb90-496664f7548d.gif "html.gif")


```
augroup MyXML
  autocmd!
  autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
  autocmd Filetype html inoremap <buffer> </ </<C-x><C-o>
augroup END
```

### 括弧の補完

{とか[とか(を入力してEnterを押すと閉じ括弧が自動で入ります。
ruby使い始めてからあんまり`{}`を使わなくなってしまったので、出番が少なくなってしまいました。

```
inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap [<Enter> []<Left><CR><ESC><S-o>
inoremap (<Enter> ()<Left><CR><ESC><S-o>
```


### ヤンクレジスタ周りの設定

通常xキーで文字を削除するとヤンクの内容が上書きされてしまうので、xキーで文字を削除したときにヤンクした内容が消えないようにしました。

```
noremap PP "0p
noremap x "_x
```

以前に書いたこちらの記事を見ていただくとよいかもしれません。
http://qiita.com/ykyk1218/items/8f5471c5e90cc83fd407#%E3%83%A4%E3%83%B3%E3%82%AF%E3%81%97%E3%81%9F%E5%86%85%E5%AE%B9%E3%81%8C%E6%B6%88%E3%81%88%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B


### 初期設定をいろいろ変えた

vimにはset hogehogeの設定がいろいろあるので、必要そうなのをもってきてます

```
set hlsearch
set ruler
set number
set noswapfile
set title
set incsearch
set wildmenu wildmode=list:full
```

|設定|内容|
|---|---|
|hlsearch|検索結果をハイライト|
|ruler|カーソル位置の行数と列を表示|
|number|行数を表示|
|noswapfile|swapファイルを作成しない（ローカルだとswapファイルはむしろ邪魔なのでw)|
|title|windowのタイトルを変更|
|incsearch|インクリメント検索|
|wildmenu|onにするとvimからファイルを開くときにリストを表示する|
|wildmode|wilemenuのモード、list:full


**wildmenuなし**
![wildmode-none.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/b0ba83c8-32a9-7dc8-450c-e62dd3032015.gif "wildmode-none.gif")

TABキーを押すことで、ファイルの候補を表示させていきます。
ちょっと使いづらい


**wildmenu wildmode list:full**
![wildmode.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/73094993-4fa6-37ea-ab5d-f266430a7cf0.gif "wildmode.gif")

候補をリストで表示して、TABキーでフォーカスを移動できます。
どんなファイルが候補にあるのかを見れるので、パッ見わかりやすい。


### vimgrepを覚えた

vim内でgrepをできるようになる。いちいちvimを抜けなくていいので、便利。
```
:vim[grep] {pattern} {file} | cw
```

下記を見てもらうとだいたいのノリがわかるかと思います。

|コマンド|検索対象|
|---|---|
|:vim hogehoge **|カレントディレクトリから検索|
|:vim hogehoge ***/**.js|カレントディレクトリの下のjsファイルから検索|

最後の`cw`をつけるとquickfix-windowを表示して検索にヒットした対象の一覧を表示してくれるので、基本的にはつけたほうが良いです。

![vimgrep.gif](https://qiita-image-store.s3.amazonaws.com/0/6808/fc53280c-bbba-cd04-8091-f31f72f4eb91.gif "vimgrep.gif")


## いろいろ興味がでてきて小技も覚えはじめました。

### 囲まれたところを選択
`vi"`でダブルクォーテーションで囲まれた箇所を選択
`vi]`で[]で囲まれた箇所を選択
`vi)`で()で囲まれた箇所を選択

`i`を`a`にすると囲んでいる文字も含めて選択します。

選択した後に`y`でヤンクなり、`x`で削除なりすればよいかと


### 元いた場所に戻る
ファイルをいろいろ開いた結果、さっきいたあそこに戻りたいっていうときに活躍。

|キー|内容|
|---|---|
|m[A-Z]|カーソル位置をマークする|
|`[A-Z]|マークした位置に戻る|

同じファイル内であれば、
`u`→`ctr-r`でも戻ります。アンドゥ、リドゥしてるだけ


### スペースを複数行にいれる
1. `ctr-v`で矩形（くけい）選択を開始して、スペースを入れたいとこまで選択。
2. `shift-i`でインサートモードに入る
3. スペースを入力
4. インサートモードを抜ける

するとあら不思議、スペースが複数行に入りました。


### コマンドモードで現在開いているパス表示

コマンドモードで`%:h`と打つと現在のパスが表示されます。
app/controller/home_controller.rbを開いていて、

```
:e %:h
```
と打つとapp/controller/までを自動補完してくれます。

%:hは打ちにくいので`%%`でキーバインドさせときす。

```
cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h') . '/' : '%%'
```

## 最後に

学習コスト高いけどVim楽しいよ

## すばらしい参考サイト達

vimgrepとQuickfix知らないVimmerはちょっとこっち来い
http://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b

脱初心者を目指すVimmerにオススメしたいVimプラグインや.vimrcの設定
http://qiita.com/jnchito/items/5141b3b01bced9f7f48f

脱初心者を目指すなら知っておきたい便利なVimコマンド25選 (Vimmerレベル診断付き)
http://qiita.com/jnchito/items/57ffda5712636a9a1e62

Vim幼稚園からVim小学校へ
http://qiita.com/hachi8833/items/7beeee825c11f7437f54