【vim】Vimmerになったらまずはこれだけ！！

Vim初心者の私がVimを数週間使った上で最低限必要だと感じたVim操作（入力、移動 etc.）に関して簡単にまとめます。備忘録投稿です。

#vimの5つのモード
実際には他にもモードがあるかもしれないが、とりあえず、この5つを押さえておけば問題ないです。

| モード | 意味 | 代表的なkey |
|:--|:--| :-- |
| NORMAL  | ノーマルモード  | esc, Ctrl + c, Ctrl + [|
| INSERT  | 入力モード  | i |
| VISUAL  | ビジュアルモード  | v |
| REPLACE  | 上書きモード  | R |
| COMMAND|  コマンドラインモード| :（コロン） |

#移動
**移動はノーマルモードで行います**。

| key | 意味 |
|:--|:--|
| h  | ←（左に移動）  |
| j  | ↓（下に移動）  |
| k  | ↑（上に移動）  |
| l  | →（右に移動）  |
| e  | 単語の最後へ移動  |
| w  | 次の単語の先頭へ移動  |
| b  | 前の単語の先頭へ移動  |
| ^  | 行の先頭文字へ移動  |
| 0  | 行頭へ移動  |
| $  | 行末へ移動  |
| gg  | ファイルの先頭へ移動  |
| G  | ファイルの末尾へ移動  |
| %  | 対応する括弧に移動（[],{},()など） 
| {  | 段落の先頭に移動  |
| }  | 段落の末尾に移動  |
| zz  | カーソル行が画面中央に来るようにスクロール  |
| Ctrl + f  | ページアップ  |
| Ctrl + b  | ページダウン  |
| Ctrl + u  | 半ページアップ  |
| Ctrl + d  | 半ページダウン  |
| Shift + m | カーソルを画面の中心へ移動  |

###3つのTips

- `4j`、`3w`などのように`数字`を先頭につけると、その`数字`回数分移動できる。とても便利。
- コマンドラインモードで、行番号を入力し[Enter]を押すと、目的行に移動できる（つまり、ノーマルモードから**:行番号[Enter]**を押す）。
- 行内では、`f[目的の文字]`で、ジャンプすることができる。いくぶん移動が楽になる。

#入力1 (モードに移行前)
| key | 意味 |
|:--|:--|
| i  | 入力モードへ  |
| I  | 行頭に移動して入力モードへ  |
| a  | カーソルの後ろに移動して入力モードへ  |
| A  | 行末に移動して入力モードへ  |
| o  | 行の下に空行を作り、行頭から入力モードへ  |
| O  | 行の上に空行を作り、行頭から入力モードへ  |
| C  | カーソルから後ろをすべて削除して入力モードへ  |

#入力2 (モードに移行後)

| key | 意味 |
|:--|:--|
| Ctrl + y  | 真上の文字と同じものが入力される  |
| Ctrl + e  | 真下の文字と同じものが入力される  |
| Ctrl + h  | バックスペース  |
| Ctrl + w  | 単語ごとにバックスペース  |

#基本操作
| key | 意味 |
|:--|:--|
| y  | ヤンク（コピー）  |
| Y  | 行をヤンク  |
| p  | カーソル後にペースト  |
| P  | カーソル前にペースト  |
| x  | カーソル下の一文字を削除  |
| X  | カーソル前の一文字を削除  |
| d  | 削除  |
| D  | 行内のカーソル以降を削除  |
| dd  | カーソルがある行を削除  |
| u  | 元に戻す（undo）  |
| Ctrl + r  | 操作を進める  |
| r  | 一文字変更  |
| >>  | 右へインデント  |
| <<  | 左へインデント  |
| .(ピリオド)  | **直前の操作を実行** |
| q:  | 履歴を確認  |

###6つのTips
- 移動の時と同様に、`数字`を基本操作の前につけることにより、操作を指定回数回繰り返すことができる。
- `q:`で履歴を確認すれば、過去のコマンドを実行することも可能。
- コピーはヴィジュアルモードで使うことが多い。
- `diw`(delete inner word)で、単語を切り取れる。
- `ya"`(yank all)でダブルクォーテーションで囲まれた文字列を囲みダブルクォーテーションごとコピー。
- `yi"`(yank inner)でダブルクォーテーションで囲まれた文字列をコピー（ダブルクォーテーションは除く）。

#検索
| key | 意味 |
|:--|:--|
| *  | カーソル下の単語を検索  |
| #  | カーソル下の単語を検索（上方向に検索）  |
| /[word]| wordを検索。n, Nでそれぞれ次と前の検索へ移動することができる|
| ?[word]| 同上（上方向に検索）  |

###1つのTips
- 【キーワード検索】 同じキーワードで引き続き検索したいときは、キーワードを指定せずに**/**か**?**を入力してEnterキーを押せばよい。

#置換
| key | 意味 |
|:--|:--|
| :%s/hoge/fuga/g  | ファイル内で全てのhogeをfugaに置換  |
| :%s/hoge/fuga/gc  | 同上 + マッチした文字列を一つずつ確認しながら置換  |
| :10,20s/hoge/fuga/g  | 行間（10~20行）内でマッチした文字列のみ置換  |

#変更
行う内容は、**削除 + インサート**だが、要は**変更**(change)。

| key | 意味 |
|:--|:--|
| ce  | 単語の終わりまで削除し、インサートモードへ |
| c$  | カーソルから行末まで削除し、インサートモードへ |
| ciw | 単語を削除し、インサートモードへ  |
| ci( | 括弧`(`で囲まれた文字列を削除し、インサートモードへ|

#ウィンドウ
コマンドラインモード（`:`タイプ後）で行う

| key | 意味 |
|:--|:--|
| sp  | ウィンドウを上下に分割 (split)  |
| vsp  | ウィンドウを左右に分割 (vertically split) |
| new  | 新規ウィンドウとして上下に開く  |
| vnew  | 新規ウィンドウとして左右に開く  |

###1つのTips
- `[Ctrl-w]``[Ctrl-w]`で順番に移動できる。

#タブ
コマンドラインモード（`:`タイプ後）で行う

| key | 意味 |
|:--|:--|
| tabnew  | 新規タブを開く  |
| gt  | 次のタブに切り替え  |
| gT  | 前のタブに切り替え  |

#外部コマンドの実行
コマンドラインモード（`:`タイプ後）では`!`を先頭につけることで、外部コマンド（lsコマンドなど）を実行することができる。

#補足（ビジュアルモードについて少し）
Vimには3つのビジュアルモードがあります。

- エディタやワープロのように文字単位で選択する**ビジュアルモード**
- 行単位で選択する**ビジュアルラインモード**
- 矩形で選択する**ビジュアルブロックモード**

の3種類だ。`v`、`V`、`Ctrl + v`でそれぞれのビジュアルモードへ移行します。

visualモード中に`shift + >`を入力することで、選択範囲のインデントもできます。複数回インデントさせたい場合には`数字>`のように数字を加えて実行します。

#参考
- [Vim初心者に捧ぐ実践的入門](https://qiita.com/okamos/items/c97970ab34ff55ff3167)
- [よく使うVimのコマンドまとめ](https://qiita.com/hide/items/5bfe5b322872c61a6896)
- [vim文字列置換 基本的なこと](https://qiita.com/shirochan/items/a16487d0739f455b5e8a)

#終わりに
Vimを数週間使った程度の私でさえ、Vimの恩恵を感じられました。移動の高速化、基本機能の充実、モード分けすることにより（keyを記憶したのち）、**keyの組み合わせだけで痒い所に手が届く**、等、まだまだ可能性を感じることができるテキストエディタです。

**「できるエンジニアはVimを使っている」**

そんなことを耳にはしていましたが、やんわりとその理由が理解できた気がします。他のエディタと比べて最初の学習コストは比較的高いですが、長いエンジニア人生、**できるだけ早めに慣れておくこと**でますますVimの恩恵を享受することができるでしょう。

ここであげたのはVim初心者の私が、数週間という短い期間で必要としたものですので、とりあえずこれだけはマストのキー操作となると思います。