ROMするためのVim操作

​
## はじめに
以前からVimやろうVimやろうと思っては頓挫し凝りもせずまたVimを触り始めたところなんですが、どうも躓く理由が毎回「編集を身につける前に移動操作にイライラして諦める」だったようです。
そこで「最初はコードを読むための操作に限定して覚えていけばどうか」と、スパッと**編集作業は諦めて**カーソル移動系だけの操作を先に身につけていったところ、これがしっくりき始めたので、覚えてきた操作を一旦棚卸しします。

という理由からこのVim操作まとめには「編集」操作は1つもありません。`i``o`すらありません。どうしようもないVim入門ですね。

Vim(の移動)がだんだんと使いこなせるようなイメージで並べたつもりです。また、プラグインなどは使わないように書きました。最初はノロノロとしか移動できませんがそのうちズバズバーンと移動できるようになってきます。ではゴー
## vimの起動とファイルオープン
##### vim起動
```
$ cd (プロジェクトフォルダ)
$ vim
```
プロジェクトフォルダの先頭でvim起動がよいですね。
空の状態でvimが開かれますが、ファイルを指定して起動することもできます。次、とりあえずファイルを開きます。
##### ファイルオープン1
`:e (ファイルパス)`
tab補完が効きます。
##### ファイルオープン2
`:Explore`
エクスプローラー風の画面が出てきます。上下と`<CR>`を駆使してファイル選択します。
`j`,`k`で上下移動、`<CR>`でオープン
(ctrlp,SrcExplなどさらに便利なツールがあるけどとりあえずこれで)
## 何か編集ぽいことしちゃった！
いろいろ試しているとコマンドを間違えて押してしまい、編集してしまったというのが有ると思いますのでそのリカバリー方法を先に書いておきます。

`<ESC>` ノーマルモードに戻る
編集中の場合、画面下の方に「-- INSERT ---」とか編集中である表示が出てると思います。これ、文字入力するモードになってます。きっと移動コマンドと間違えて編集モードに入る`a``i`とか偶然`ciw`とかしちゃったのだと思います。移動を試しているモードは「ノーマルモード」なので、
まずは落ち着いて`<ESC>`で「ノーマルモード」に戻しましょう。困ったらとりあえず`<ESC>`連打です。この時点ではまだ元に戻せてませんので、普通にアンドゥします。

`u` アンドゥ
無事「ノーマルモード」に戻れたら、アンドゥを表すコマンド`u`を連打しましょう。そのうち「Already at oldest change」とか出てきます。もぅ戻せないようってことです。

`:q!` 強制終了
最後の手段です。Vimを終了させます。`:q`も終了ですが、これは編集中のファイルがあったら「保存しねえの？」って聞いてきて面倒です。`:q!`も終了ですが編集中のファイルがあっても強制的に閉じます。何かあったら`:q!`で自害しましょう。
## 移動
##### 方針
・縦に動いて横に動く
・大きく動いて小さく調整
##### 縦に大きく動く1
`G` ファイルの最後尾へ
`gg` ファイルの先頭へ
##### 縦に大きく動く2
`C-f` 次ページ
`C-b` 前ページ
`C-d` 次半ページ
`C-u` 前半ページ
##### 縦に小さく調整
`j` 1行下へ移動
`k` 1行上へ移動
`+` 1行下へ＆行頭へ移動
`-` 1行上へ＆行頭へ移動
※最初にこれ覚えると地味な移動しかできなくてイライラするから先にページめくり覚えるとよさそう
##### 横に大きく動く1
`0` 行頭へ(Oではなく0)
`$` 行末へ
`w` 次の単語の先頭へ
`b` 前の単語の先頭へ(単語の途中にカーソルあるときはその単語の先頭へ)
`e` 今の単語の最後尾へ(すでに最後尾にある場合は次の単語の最後尾へ)
↑厳密には横移動ではないけど(次の行に行くこともあるので)
##### 横に大きく動く2
`f(1文字)` 行内の次の(1文字)へ移動。
`;` 直前のfを繰り返す。
`,` 直前のfを逆向きに繰り返す。
慣れてくると`w``b`や以下`l``h`よりも便利になる。
`:`や`<CR>`を押さなくてもよいところがすっきりしてよいと思います。
##### 横に小さく調整
`l` 右へ1文字移動
`h` 左へ1文字移動
※最初にこれ覚えると地味な移動しかできなくてイライラするから最初は`w`,`b`,`0`,`$`,`f`から覚えるとよさそう
##### 検索で動く1
`/(検索文字列)` 検索する(下方向)
`*` カーソル上の単語を検索する(下方向)
`n` 直前に検索した文字を再検索(下方向)

行き過ぎたーと思ったら↓
`N` 直前に検索した文字を再検索(上方向)

`?(検索文字列)` で上方向の検索
`#` でカーソル上の単語を上方向検索
だけどあまり使わない
##### カーソル行の位置調整
検索していくとカーソル行が画面の一番下に行くことがありますね。
俺はその下のコードが見たいんです。不便なので調整しましょう。

カーソル行を保持したまま画面スクロールするキーです。
`zz` 現在のカーソル行を画面中央で表示(`z.`でも可)
`zt` 現在のカーソル行を画面先頭で表示(`z<CR>`でも可)
`zb` 現在のカーソル行を画面最後で表示(`z-`でも可)

画面表示を保持したままカーソルを移動するキーです。
`M` 画面中央にカーソルを移動
`H` 画面最上部にカーソルを移動
`L` 画面最下部にカーソルを移動
中央移動系はよく使いますね。下記の関数ジャンプ系の後は`zt`使うかな。

`C-e` 画面を1行分下へスクロール
`C-y` 画面を1行分上へスクロール
カーソルが上の方にあって、「もうちょっと下を見たいのに」ってときに使います。
##### 縦に大きく動く3
`]]` 現在カーソルの後にある、最も外側のコードブロックの最初に移動
`[[` 現在カーソルの前にある、最も外側のコードブロックの最初に移動
`[{` 現在カーソルにある、直近の外側のコードブロックの最初に移動
`]}` 現在カーソルにある、直近の外側のコードブロックの最後に移動

最も外側のコードブロックって何やねん？って話ですが、C言語なら関数ブロック({}で囲まれた一番大きい単位は関数ですよね)、Javaならクラスです。
直近の外側のコードブロック(日本語が危うい)はいろいろありますね、今if文の中にカーソルがあるときはif文直近の{に移動します。

つまり↑はC言語の場合はこう↓言い換えられる。
`]]` 現在カーソルの後にある、関数の初めのカッコへ移動
`[[` 現在カーソルの前にある、関数の初めのカッコへ移動
`[{` 現在カーソルにある、if文などの最初のカッコに移動
`]}` 現在カーソルにある、if文などの最後のカッコに移動

関数の最後に行きたい？
`%` 対応するカッコに移動
でよいでしょう(本当はいろいろなコマンドがあるけど覚えきれない)。

このあたりの話題は↓が参考になります。コマンドたくさんあってヒィってなった。
http://vim-jp.org/vimdoc-ja/usr_29.html
##### マークして動く
`ma` 現在のカーソル位置に「a」というマークをつける
`` ]` `` 次のマーク文字へ
`` [` `` 前のマーク文字へ

`'a` 「a」で保存したカーソル位置に移動
`:marks` マーク一覧を表示

だいたい自分はどのアルファベットに割りつけたか覚えてないので`` ]` ``や`` [` ``を多用しています。
マークは「a」でなくてもアルファベット1文字(a-z)ならOK。

マークをもっと便利に使う↓こういうのとか。まだ試せていない。
http://saihoooooooo.hatenablog.com/entry/2013/04/30/001908
##### 直前のカーソル位置に戻る
`C-o` 直前のカーソル位置に戻る
`C-l` ↑で戻りすぎたときにカーソル位置を１つ戻す
関数の真ん中で「これなんていう関数の中だっけ？」って`[[`使って関数の最初にジャンプして
あれ、どこから飛んできたっけ？って戻りたくなった時に使います！！
※他にも使い道あります

---

基本移動系は以上です。もちろんこれで全部では無いけど、なんとなくヒョイヒョイ移動できるようになってきた気がします。
ここまで1ファイル単位での画面移動についてまとめてきました。次は複数のファイルを行き来する移動系操作です。

---

## バッファ
複数ファイルを開くのはいいけど今まで開いていたファイルが表示されなくなってしまいます。
これ、消えているわけではなくて、簡単に言うと裏にある状態。これを表に持ってきたりしたいですね。
開いている(すべての)ファイルは「バッファにある」状態で、このバッファを表にしたり、裏にしたりすることで複数のファイルの行き来ができるようになります。
##### バッファの切替
`C-^` 直前に裏に回ったバッファを表にする(表示させる)(`:e #` でもOK)
`:bn` 次のバッファに移動する
`:bp` 前のバッファに移動する
##### バッファ一覧見れないの？
`:ls` バッファの一覧を見る
% がカレント(操作中)ウィンドウのバッファ、 # はオルタネイト(C-^で切り替え可能な)バッファ。
こんな表示になる

```
:ls
  1      "foo.php" 行 22
  2 %a   "bar.php" 行 7
  3 #    "hoge.php" 行 6
```

で、`:ls`で調べた番号をどうするかというと
`:b (バッファ番号)` バッファを切り替える
`:bd` 現在開いているカレントバッファを消す
で操作します。

これで、1画面内で複数ファイルを切り替えて表示することができました。
次は画面自体を分割させる方法です。
## ウィンドウ
画面をスパーンと割って、複数ファイルを見ることができます。
`:sp` ウィンドウ横分割
`:vsp` ウィンドウ縦分割
画面を割ると、元居たファイルが表示されます。なお、ファイル名を指定することもできます。

ちなみに、新しいファイルで分割したい場合は以下。
`:new` 新規ファイルで開く(横分割)
`:vnew` 新規ファイルで開く(縦分割)

分割したウィンドウを行き来するキーです。
分割したウィンドウの移動 `C-w h/j/k/l`
一番上のウィンドウに移動 `C-w t`
一番下のウィンドウに移動 `C-w b`

閉じる系操作です。
`:q` ウィンドウ閉じ
`:only` 他のウィンドウをすべて閉じる

無事ウィンドウの移動ができたら、いつもの通り今までの移動コマンド・バッファ操作コマンドを使えばいいですね。

これでウィンドウの分割と移動ができたので、ウィンドウ自体の大きさや位置を変更するコマンドを覚えておきます。
`C-w +/-/>/<` ウィンドウを縦に広げる/縦に狭める/横に広げる/横に狭める
`C-w _` 縦に最大化
`C-w |` 横に最大化
`C-w =` 各ウィンドウのサイズを揃える
`C-w H` ウィンドウを左端に移動
`C-w J` ウィンドウを一番下に移動
`C-w K` ウィンドウを一番上に移動
`C-w L` ウィンドウを右端に移動

ちなみに自分はウィンドウの移動はあまり行わず、3つくらい分割させつつ
「ちょっと詳しく見てみたいなあ」って時に最大化、いいタイミングで`C-w =`で大きさを揃える(たいてい、うまく戻る)ような使い方をしています。

更に増えそうだったどうするか？タブページを新たに作ります。
## タブページ
最近のエディタなら大抵存在しているタブページですが、Vimではこれくらいのタイミングで覚えるのがちょうどいいように思えます。
##### タブページを作る
`:tabnew` 別のタブページを新規ファイルで開く
ファイルパスも指定できます。

`:tabnew | b (バッファ番号)` バッファ番号を指定して、そのファイルを新しいタブページを開く
`:tabnew %` 今操作しているファイルを別のタブとして開く
`:tab ba` 現在保持しているバッファをすべてタブページにする
##### タブページ間の移動
`gt` 右タブへ
`gT` 左タブへ
##### タブを閉じる
`:tabc` 今見ているタブを閉じる
`:tabo` 今見ているタブ以外を閉じる
複数バッファ開いている時含めタブを閉じます。

## grep
ファイル中の検索は`/`でした。ようやくgrep、ファイル横断検索です。
`:vimgrep (検索パターン) (file)` grep検索を行う
fileには`**`(すべてのフォルダとファイル)が指定できます。
`:vimgrep hogehoge ./hello/**`みたいな。
`:vimgrep hogehoge **`だとカレントディレクトリ配下すべてのファイルが対象になります。
ちなみにカレントディレクトリは`:pwd`で確認することができます。

検索パターンは正規表現使えるけど、省略

`:vim {pattern} %` 今のバッファだけでgrepする

`/`と同様、見つかった場所にジャンプするので
`:cn` 次へ
`:cN` 前へ
で移動していきます。

でもgrep結果は一覧で見たい。こんなときはQuickfixというウィンドウで一覧表示ができます。

`:vimgrep (検索パターン) (file) | cw` grep検索し、Quickfixウィンドウで結果表示

`j``k`で候補に移動して`<CR>`でジャンプです。`C-W <CR>`で新しいウィンドウを開いてジャンプすることもできます。

自分は`C-W <CR>`で開いて、中をフムフムとみたらすぐ`:q`で閉じたりします。

`:ccl` Quickfixウィンドウを閉じる

## ctagsとタグジャンプ
あらかじめ関数や定数などの定義場所をタグファイルとして生成しておくことで、
それをもとに定義場所にジャンプすることができます。

##### タグファイルの生成
プロンプト上のソースがあるフォルダで以下コマンドを実行。

```
$ ctags -R
```

すると同フォルダに「tags」という名前のファイルができます。
なお、Vim上でtagsファイルを作りたい場合は`:!ctags -R`を使います。
Vimを中断してプロンプトに戻り、tagsファイルの生成を行います。

##### タグジャンプ
基本は以下の２コマンドです。
`C-]` カーソル位置の単語をタグとみなしてジャンプ。
`C-t` 直前のタグに戻る。
この２つはよく使います。

手繰ってきた履歴を見ることもできます。
`:tags` タグジャンプ履歴を見る
関数のコールスタックとして見ることもできますね。

おまけジャンプです。
`g C-]` 複数候補がある場合に番号付きの選択ウィンドウがでて、その番号ジャンプできる。
`C-w ]` 新しいウィンドウを開きつつジャンプ

プレビューウィンドウでカーソルジャンプせずに定義を確認することができます。
`C-w }` カーソル位置の単語の定義を、プレビューウィンドウで開く。
`C-w C-z` プレビューウィンドウを閉じる。(:pcと同じ)

プレビューウィンドウを常に開いておくのもよいですね。
`C-w }`であらかじめ開かれたプレビューウィンドウの内容が変わってくれます。カーソル動かしたくないときによいです。

## 以上
コードを読むときに使うキー操作でした。自分もおぼろげにしか覚えてないですけど、だんだんと思うように移動できるようになってきましたよ。

## 最後に
<blockquote class="twitter-tweet" lang="ja"><p>Vimの強力な移動手段は致死レベルの正確性で目標に到達する　実践Vim p.170 <a href="http://t.co/4HsGF9yeu8">http://t.co/4HsGF9yeu8</a></p>&mdash; iizukak (@iizukak) <a href="https://twitter.com/iizukak/status/416529472775786496">2013, 12月 27</a></blockquote>
​
​
​