Vim入門[今度こそ覚える!!]


プログラム言語の便利な関数、エディタのコマンド、爪切り、耳かき、キャッシュカードの置き場所。
最初はバッチリ覚えたと思っていても、いざ必要になった時に思い出せないんですよね。
今回はVimのコマンドくらいは一生覚えられるようにしようと思います。
本屋さんで語源の乗ってる英単語帳を見て語源とセットにしたら覚えられるかと思ってわかる範囲で語源もつけて見ました。



必要最小限のコマンド
---
###Vimの起動
ターミナル上で以下のコマンドを実行することで起動できます。

```
vim [ファイル名]
```

ファイル名を指定せずに起動もできます。存在しないファイル名でVimを起動するとその名前で新しいバッファを作成し、保存するタイミングで新しいファイルとして保存されます。


###保存、終了
`ZZ`：内容が変更されている場合は保存してvimを終了。
`:w`：変更をファイルに書き込む
`:w` [ファイルパス]：名前をつけてファイルを保存する。
`:q`：ウィンドウを閉じる。Vimを終了することになるので、変更があれば警告が出る。
`:q!`：Vimを強制終了。内容が変更されていても警告なしで終了。

スクリプト系の言語でプログラムを書いているなら、`:w`で変更を書き込んでウィンドウを閉じずにソースコードを見ながら実行して動作を確認することができます。

変なコマンドを使って思わぬ変更をしてしまい、取り返しがつかなくなったら`:q!`コマンドで保存せずに終了することができます。

wは'write'の'w'で、qは'quit'の'q'です。


###カーソル移動：`h/j/k/l/0/$`
`h`：左方向にカーソルを移動する。
`j`：下方向にカーソルを移動する。
`k`：上方向にカーソルを移動する。
`l`：右方向にカーソルを移動する。
`0`：行の先頭にカーソルを移動する。
`$`：行末にカーソルを移動する。

このコマンドには語源はなく、操作しやすい配置になっています。


###削除、コピー、貼り付け：`x/dd/yy/p`
`x`：カーソル上の1文字を削除する。
`dd`：カーソルがある一行を削除する。
`yy`：カーソルがある一行をコピーする。
`p`：ddまたはyyで削除やコピーをした内容を貼り付けする。

dは'delete'の'd'で、yは'yank'の'y'、pは'paste'の'p'です。
xはバツ印という意味でしょうか？


これで超入門編は終わりです。
Vimを使っていたらキーボード右下のカーソルキーでカーソルを動かすこともできますが、`hjkl`で慣れておく方が色々捗るかと思います。

次からが本題の各系統のコマンドのまとめです。



カーソル移動・画面スクロール系
---
ここでのコマンドは全てノーマルモードのコマンドです。

### 単語単位で移動する：`w/e/b/W/E/B`
`w`：次の単語に移動する。
`e`：単語の最後の文字に移動する。
`b`：手前にある単語の先頭に移動する。

`W/E/B`では、ドットやコロンのような記号もひと続きの単語として移動します。

wは'word'の'w'、eは'end'の'e'で、bは'back word'の'b'ですね。


###ウィンドウ内でカーソルを移動する：`H/M/L (上/中/下)`
`H`：現在表示されているウィンドウの一番上の行にカーソルが移動する
`M`：現在表示されているウィンドウの一番中央の行にカーソルが移動する
`L`：現在表示されているウィンドウの一番下の行にカーソルが移動する

Hは'Home'、Mは'Middle'で、Lは'Last'です。


###画面をスクロールする：`Ctrl-f/Ctrl-b/Ctrl-e/Ctrl-y (一画面上/下/一行上/下)`

`Ctrl-f`：1画面分下へスクロールする。
`Ctrl-b`：1画面分上へスクロールする。

`Ctrl-e`：画面を1行分下へスクロールする。
`Ctrl-y`：画面を1行分上へスクロールする。

fは'forward'の'f'、bは'backward'の'b'ですね。
'forward'と'backward'は日本語でそれぞれ'順方向'と'逆方向'の意味です。

eは'extra line'の'e'ですが、yの方はわかりませんでした…

###好きな行にカーソルを移動する：`gg/G/<数字>G/:<数字>`

`gg`：ファイルの先頭の行にカーソルを移動する。
`G`：ファイルの最後の行にカーソルを移動する。
`<数字>G`：数字で指定した番号の行へカーソルを移動する。
`:<数字><enter>`：<数字>Gと同様に、数字で指定した番号の行へカーソルを移動する。

gの由来は'go to'の'g'です。
`:<数字><enter>`で指定した行番号へ移動するのはedエディタのコマンドの名残です。
コロンから始まるコマンドはVimがまだedエディタの名残ですね。


編集系
---
###挿入モードに入る：`i/a/s/cw/I/A/S/C`
`i`：カーソルの左側から挿入モードに入る。
`a`：カーソルの右側から挿入モードに入る。
`s`：カーソル上の1文字を削除してから挿入モードに入る。
`cw`：カーソル上の単語を削除してから挿入モードに入る。

`I`：行の先頭から挿入モードに入る。
`A`：行の末尾から挿入モードに入る。
`S`：行全体を削除してから挿入モードに入る。
`C`：カーソルの現在の位置から行末までを削除してから挿入モードに入る。

iは'insert'、aは'append'、sは'swap'、cwは'change word'の頭文字から'cw'です。


###新しい行を追加してから挿入モードに入る：`o/O`

`o`：現在行の下に新たな行を追加して挿入モードに入る。
`O`：現在行の上に新たな行を追加して挿入モードに入る。

oは'open line'の'o'です。


###行を連結する：`J`

`J`：現在の行を一つ上の行と連結する。ビジュアル選択した状態でJコマンドを実行すると選択している行を全て連結する。

Jは'Join'の'J'です。


###ビジュアルモード：`v/Ctrl-v`

`v`：ビジュアルモードに入る。v$で現在のカーソル位置から行末までをビジュアル選択する。
`Ctrl-v`：ビジュアルモードに入る。hjklコマンドでカーソルを動かして矩形選択の範囲を指定する。

矩形選択した状態で`d`を使うと、選択範囲を削除する。
矩形選択した状態で`s/c`を使うと、選択範囲を削除した後に挿入モードに入る。

矩形選択した状態でI/Aとタイプすれば、選択範囲の先頭または末尾にカーソルが移動して挿入モードに入ります。プログラムを複数行コメントアウトする時などに多用します。

vは'visual'の'v'ですね。


###インデント深さを変える：`>>`

`\>>`：ノーマルモードで>>とタイプすると、その行のインデントを1つ増やす。
`\<<`：ノーマルモードで<<とタイプすると、その行のインデントを1つ減らす。
`<数字>+>>`で数字の行数だけ複数行を一つインデントする。

複数行をビジュアル選択した状態で`>`とタイプすると、選択した行をまとめてインデントできます。
複数行を選択した状態で`<数字>+>`とタイプすると、指定した複数行で数字の分だけインデントを深くします。

これも語源などは特に無いようですが、おそらく見た目から来ていると思います。


###大文字/小文字を切り替える：`~/u/U`
`~`：ノーマルモードだとカーソル上の文字を大文字/小文字を切り替える。ビジュアルモードだと選択範囲の文字を全て大文字/小文字を反転させる。

`u`：ビジュアル選択している文字を全て小文字にする。
`U`：ビジュアル選択している文字を全て大文字にする。

uは'uppercase'の'u'です。
uppercaseは英語で大文字という意味です。


###単語補完：`Ctrl-p/Ctrl-n`
`Ctrl-p/Ctrl-n`：挿入モードで初めの数文字を入力してから、`Ctrl-p`または`Ctrl-n`とタイプすると、その文字から始まる単語を補完する。単語を補完する候補はバッファの中から探される。

`Ctrl-p/Ctrl-n`はそれぞれ逆方向検索/順方向検索という違いがあります。それほど気にせずどちらかを覚えておけば大丈夫だと思います。

pは'previous'の'p'で、nは'next'の'n'です。
previousは英語で前という意味です。



部分的な編集系
---
挿入モードに入らなくても内容を編集することもできます。
ここでのコマンドは全てノーマルモードでのコマンドです。

###カーソルの下にある数字を増減する：`Ctrl-a/Ctrl-x`
`Ctrl-a`：カーソルの下にある数字を1つ増やす。
`Ctrl-x`：カーソルの下にある数字を1つ減らす。

これも語源がわかりませんでしたが、おそらくaは'add'の'a'でxはアルファベット順の逆なのか、キーボード上で近いからなのかだと思います。


###1文字/複数の文字を上書きする：`r/R`
`r`：カーソルの上にある1文字を上書きする。ちょっとスペルミスした時によく使います。
`R`：カーソルの上にある文字を上書きする。ESCを押すまで上書きを続けます。

rは'replace'の'r'ですね。


###直前の編集を繰り返す：`ドット(.)`

`.`：直前のテキスト編集をもう一度繰り返す。

結構複雑な編集も繰り返すことができるので便利です。


検索・置換系
---
###文字列を検索する
`/<文字列>`：順方向に文字列を検索する。
`?<文字列>`：逆方向に文字列を検索する。
`n`：直前に検索したワードで順方向にもう一度検索する。
`N`：直前に検索したワードで逆方向にもう一度検索する。
`%`：プログラム中のカッコ文字に対応するカッコ文字を検索する。

`f<文字>`：fの次に入力した文字を順方向検索し、その文字のところへカーソルを移動する。
`F<文字>`：fの次に入力した文字を逆方向検索し、その文字のところへカーソルを移動する。
`t<文字>`：fの次に入力した文字を順方向検索し、その文字の一つ手前へカーソルを移動する。
`T<文字>`：fの次に入力した文字を逆方向検索し、その文字の一つ手前へカーソルを移動する。

nは'next'の'n'で、fは'find'の'f'ですね。


###文字列を検索して置換する。
`:s/[old]/[new]`：置換される文字列[old]を検索して置換する文字列[new]で置き換える。

sは'search'の's'です。


Vimでは正規表現を用いることでより複雑な検索や置換ができますが、ここでは割愛します。
詳しく書かれた記事があるので参考にしてください。



バッファ・ウィンドウ操作系
---
ここでのコマンドは全てノーマルモードでのコマンドです。

###現在開いているバッファを確認する：`:ls`
`:ls`：現在開いているバッファの一覧を表示する。

`:b3`のようにタイプするとその番号のバッファを表示します。

lsはbashのlsコマンドから、bは'buffer'から来ています。


###ウィンドウを分割/移動する：`Ctrl-w`
`Ctrl-w + v`：ウィンドウを縦方向に分割する。
`Ctrl-w + s`：ウィンドウを横方向に分割する。

`Ctrl-w + w`：次のウィンドウへ移動
`Ctrl-w + W`：前のウィンドウへ移動
`Ctrl-w + h/j/k/l`：ウィンドウを移動(左/下/上/右)

`:q`で開いたウィンドウを閉じます。


コマンドを組み合わせた編集
---
いくつかのコマンドを組み合わせることで、もっと便利に編集することができます。
これぞVimって感じがする、僕的に一番好きな機能です。

例えば`d$`と入力すると現在のカーソル位置から行末まで削除することができます。
他にも`4yy`で現在のカーソル位置から4行をコピーします。
`d3w`で3単語を削除、`ggVG`でバッファ全体をビジュアルモードで選択することができます。

組み合わせ方の基本は
`{operator} [count] {motion}`
となっていて、それぞれ

operator：`d`や`y`などの'動作'を意味するコマンド
count：行数や文字数などを指定するための数字
motion：`w`などのカーソル移動を意味するコマンド

です。これらを組み合わせることでより早くより便利にVimを使うことができます。


参考にしたもの
---
http://qiita.com/jnchito/items/57ffda5712636a9a1e62
http://qiita.com/hachi8833/items/7beeee825c11f7437f54#_reference-d89e5711a12b6c84b00a