一日18時間VimでRailsを開発している僕が選ぶVim Tips 10選

### 寝ている時間以外はVimとRailsを触っている僕が選ぶVim Tips10選を紹介します。
Vimを使い始めて3ヶ月ぐらいの人にオススメです。
※ あんまりRailsは関係ありません。

# diw （ノーマルモード）
#### カーソル上の単語を消す
こいつがなくてはVimを使う意味が無いというほどよく使うコマンド。
ノーマルモードで ` hoge ` という文字列上の、どこかにカーソルがある状態で`diw`とタイプすると`hoge`という単語が消えます。

この何を単語とするのか、その判定が非常に秀逸で、直感にマッチしていて便利です。
たとえば、`|`をカーソル位置だとして、
`ho|ge bar` -> `bar`
`ho|ge.bar` -> `.bar`
`"ho|ge"` -> `""`
`<di|v>` -> `<>`

このように、うまい感じに特殊記号等を避けて、単語を削除してくれます。

`ciw`とタイプすることで、`hoge`を削除後、挿入モードになることも可能。

# di" （ノーマルモード）
#### ""（ダブルコーテーション）で囲まれた文字列を消す
`diw` と似たようなコマンドで、`""`で囲まれた文字列を消してくれます。
このコマンドの便利なところは、カーソル位置が`""`内に無くても良いところ。

例えば、カーソル位置を`|`だとして、
` hoge = "f|oo bar"`という状態で、`di"`とタイプすると、当然`hoge = "|"`になります。
しかし、なんと、
`ho|ge = "foo bar"` という状態で、`di"`とタイプしても`hoge = "|"`となります

つまり現在位置が`""`内に含まれて無くても、その行内で今あるカーソル位置よりも後ろに`""`で囲まれた文字列があれば、そこまで移動して消去してくれるのです。

# * （ノーマルモード）
#### カーソル位置にある単語を検索する
`*` のお陰で自分で検索する文字列を打つことが半分以下に減りました。
`*`は今あるカーソル位置の単語を検索してくれます。 `diw` と同じように、単語の判定が秀逸。

`hoge fo|o bar` -> `foo`を検索
`fo|o.bar` -> `foo`を検索

ControllerやModelで、変数がどこで使われているのかを素早く検索するときに便利です。

# C-a, C-x （ノーマルモード）
#### 数値をインクリメント、デクリメントする
ノーマルモードで `3` にカーソルがあったとして、`C-a`（Ctrl+a） とタイプすると `4`になります。
また、`C-x`（Ctrl+x）とタイプすると、逆に`2`になります。

これだけ見ると全く使いどころの無いコマンドに見えますが、ある２つのテクニックを知っているだけで、
CSSを書くのに非常に便利なコマンドになります。

##### 数値と組み合わせる
ただ`C-a`とタイプするのではなく、`3C-a`, `10C-a`のようにコマンドの前に数値を入力します。
Vimでは基本的に、先に数値を入力しておくことで、その数値回数だけそのあとのコマンドを繰り返します。
つまり、`3C-a` は `C-a` を3回繰り返す、 `10C-a` は `C-a` を10回繰り返すという意味です。

これによって、例えばCSSで ` margin: 8px `という記述があり、`15px`に直したいというときも `7C-a` で修正できます。

##### 数値にカーソルを置かないで使う
この `C-a`, `C-x` について、実はなんと数値上にカーソルがなくても使えます。
先に紹介した `di"` のように、その行において、カーソルのある位置から後ろに数値があれば、それをインクリメントしてくれます。

したがって、 `ma|rgin: 8px` こんな状態だとしても、`5C-a` とタイプすることで `margin: |13px` と、インクリメントすることができ、更にカーソル位置も数値の場所に移動します。

CSSを書くときはこの`C-a`（Ctrl+a)と`C-x`（Ctrl+x）がないとやってられません。

# Unite
#### ファイラ（ https://github.com/Shougo/unite.vim ）
唯一Railsに関係するTipsな気がします。Uniteの説明は「vim unite」でググれば色々と出てくることでしょう。
※ :help unite でも簡単なexampleや説明があります。
今回はuniteはファイラとして利用する場合について説明します。

とりあえずキーバインドとして僕は以下のように `.vimrc` に書いています。

```vim
NeoBundle 'Shougo/unite.vim'
let g:unite_enable_start_insert = 1
let g:unite_enable_split_vertically = 0
let g:unite_winwidth = 40
nnoremap <silent> ,uf :<C-u>UniteWithBufferDir -buffer-name=files file file/new<CR>
nnoremap <silent> ,um :<C-u>Unite  file_mru <CR>
nnoremap <silent> ,urc :<C-u>Unite file_rec/async:app/controllers/ <CR>
nnoremap <silent> ,urfc :<C-u>Unite file file/new -input=app/controllers/ <CR>
nnoremap <silent> ,urm :<C-u>Unite file_rec/async:app/models/ <CR>
nnoremap <silent> ,urfm :<C-u>Unite file file/new -input=app/models/ <CR>
nnoremap <silent> ,urv :<C-u>Unite file_rec/async:app/views/ <CR>
nnoremap <silent> ,urfv :<C-u>Unite file file/new -input=app/views/ <CR>
nnoremap <silent> ,urs :<C-u>Unite file_rec/async:app/assets/stylesheets/ <CR>
nnoremap <silent> ,urfs :<C-u>Unite file file/new -input=app/assets/stylesheets/ <CR>
nnoremap <silent> ,urj :<C-u>Unite file_rec/async:app/assets/javascripts/ <CR>
nnoremap <silent> ,urfj :<C-u>Unite file file/new -input=app/assets/javascripts/ <CR>
nnoremap <silent> ,uro :<C-u>Unite file_rec/async:config/ <CR>
nnoremap <silent> ,urfo :<C-u>Unite file file/new -input=config/ <CR>
nnoremap <silent> ,url :<C-u>Unite file_rec/async:lib/ <CR>
nnoremap <silent> ,urfl :<C-u>Unite file file/new -input=lib/ <CR>
nnoremap <silent> ,urr :<C-u>Unite file_rec/async:spec/ <CR>
nnoremap <silent> ,urfr :<C-u>Unite file file/new -input=spec/ <CR>
```

実際に `,urc` 等をノーマルモードでタイプしてみると、どんな動きをするのか理解できると思います。
以前は `rails.vim` をファイラとしては利用していたのですが、ファイル数の増加に伴い、 `:RView hoge.rb` のような指定方法は、補完を使ったとしても難しくなってしまい、Uniteに移行しました。
この設定によって、rails.vim以上のファイル移動速度を発揮しています。

また、これは実行しているVimのカレントディレクトリを、Railsプロジェクト直下にしておく必要があります。

# g; （ノーマルモード）
#### 前に変更した場所へカーソルを移動する
Vimは他のエディタとは違い、いつどこで変更を行ったのかを記録しています。
それをさかのぼって、前に変更したところにカーソルを持って行ってくれるのが、この `g;` です。

このコマンドの存在によって、例えば、大変な行数があるファイルを編集しているときに、そのファイルの先頭を参照し、またさきほど変更していたところから編集し直す、といったことが非常に容易になります。

あんまり知られてないけど、一度使い始めたら、無いと困っちゃうコマンドです。

# C-h （いつでも）
#### backspace（delete）キー
Vimはまるで関係ありませんが、 基本的に`C-h` はBackSpaceキー（OSXならばdelete）に相当します。
backspaceはキーボードの右上にあり、これを使っていると右小指が痛くなってしまうので、手にやさしい `C-h` を使うことにしています。

# C-m （いつでも）
#### Enterキー
こいつもVimに全く関係ありませんが、基本的に `C-m`はEnterキーに相当します。
私は普段、日本語キーボードを利用しておりEnterキーは非常に遠く、また右小指が痛くなってしまうので、これからは一生 `C-m` を使うことに決めました。

# dap （ノーマルモード）
#### パラグラフを消去

```rb
  end

  def hoge
    foo hoge bar
    bar
  end
  
  def ...
```

この状態で `def hoge ... end` の中にカーソルがあるとき、 `dap` とタイプすることで

```rb
  end
  
  def ...
```

`def hoge ... end` のパラグラフが消去されます。

どんな要素を持ってパラグラフなのかは、詳しくは調べてはいませんが、「改行のない連続した行」な気がします。
つまり、

```rb
hoge hoge

foo foo
foo foo

bar bar
bar bar
bar bar
```

このような状態ならば、 `hoge` のパラグラフ、 `foo` のパラグラフ、 `bar` のパラグラフの3つのパラグラフが存在します。

例に上げたとおり、メソッドをまるまる削除するのに便利です。

# C-^ （ノーマルモード）
#### 前に開いたファイルを開く
そのウィンドウで以前開いていたファイルを開きます。
`A.rb`を開いた後、`B.rb` を開いたところで `C-^` とタイプすると `A.rb` が開きます。

このコマンドの良い点は、 `C-^` によって `A.rb` が開かれた状態で、また `C-^` とタイプすると、`B.rb` に戻ってくる点です。
往々にして、他のエディタはこのようなコマンドは、どんどん前のファイルを開いていってしまい、結局元のファイルを開くことが難しくなってしまうことが多いのですが、このコマンドならば、ちょっと参照するために `A.rb` を開き、またすぐ `B.rb` に戻ってくる、みたいなことが簡単にできるのです。流石。

# タブ機能
#### Vimにもタブ機能があったんです。
僕はVimを使い出して、1年ぐらいしてから知ったのですが、VimにもChromeのようなタブ機能があったんです。
[vimのすごい便利なのにあまり使われていない「タブページ」機能](http://qiita.com/wadako111/items/755e753677dd72d8036d)
以前僕が書いた記事を参照してみると良いでしょう。

![5e38065d-2b82-248c-e9fd-e5a62c270b61.jpeg](https://qiita-image-store.s3.amazonaws.com/0/9373/31fedac4-5f94-fdb4-b0b0-5fa26cf0d8fa.jpeg)


　
　
以上です。知っていた事項もあるかもしれませんが、少なくとも僕が上記の事項に気づくのには、Vimを使い出してから1年ぐらいかかりました。
皆様のVimライフがより良いものになれば幸いです。

P.S.
[STORYS.JP](http://storys.jp)、 [coincheck](https://coincheck.jp) などのサービスを運営、開発しています。興味のある方はぜひ [和田](http://qiita.com/wadako111)まで連絡を！