Vimコマンド覚書き ~初心者がやりたいことをスラスラできるようになる！~

* 本記事の内容を知っていれば、**基本的な操作やVimらしい事ができるようになる**と思います。
    * 例えば... [カーソルの高速移動](#1-カーソル移動)や[削除したい範囲の直感的な削除](#2-削除と上書き)等

    * Udemyの[Vim Masterclass](https://www.udemy.com/course/vim-commands-cheat-sheet/)で学んだ内容です。  
* **「コマンドモード、Insertモードの切り替え方法は知っているけれど、その他はよくわからない」という方**に適していると思います。
    * 「なんだそれは」という方は、上記の[Vim Masterclass](https://www.udemy.com/course/vim-commands-cheat-sheet/)や[このあたりの動画](https://paiza.jp/works/linux/primer/beginner-linux3/22301)などをどうぞ。VimMasterclassはかなりおすすめです。

#目次
[1. カーソル移動(コマンドモード)](#1-カーソル移動)
[2. 削除・上書き](#2-削除と上書き)
[3. 表示の調整](#3-表示の調整)
[4. 編集(コマンドモード・Insertモード・マクロ)](#4-編集)
[5. 置換・検索](#5-検索と置換)
[6. 保存・終了](#6-保存と終了)
[7. 範囲指定](#7-範囲指定)
[8. VISUALモード](#8-VISUALモード)

#1. カーソル移動
- コマンドモードでのカーソル移動です。  

### 1文字/行移動

|キー|やりたい事|
|:-:|--------|
|j  |下の行へ|
||&nbsp;&nbsp;&nbsp;2jとすると2行下へ移動する(khlも同様)|
|k  |上の行へ |
|h  |左へ|
|l  |右へ|

### まとまった単位の移動
|キー|やりたい事|
|:-:|--------|
|w  |次の単語へ|
|b  |前の単語へ|
|||
|$  |行末へ|
|0  |行頭へ|
|||
|G, :$\<enter>|文末へ移動|
|gg, :1\<enter>|文頭へ移動|
|50G, 50gg, :50\<enter>|50行目へ移動|
|||
|ctrl + f|次のページへ(forward)|
|ctrl + b|前のページへ(back)|
* ":*hogehoge*"のコマンドの場合、入力後\<enter>の入力が必要

#2. 削除と上書き 
### 1文字ずつ削除/置換したい場合: Xコマンド/Rコマンド

|キー|やりたい事|
|:-:|--------|
|x  |カーソル上の文字を削除|
|X (shift + x) |カーソルの左隣りを削除|
||現在のカーソル位置と右隣の文字との入れ替えはxpで可能(pはpaste)|
|r "*c*"|現在のカーソルの文字を "*c*" (任意の一文字)に置換|
||ex) make->takeへの修正の場合、mまでカーソルを動かしてrt|


### まとまった単位で削除したい場合: Dコマンド
|キー|やりたい事|
|:-:|--------|
|dw|1単語を削除|
|3dw|3単語を削除|
|D (shift + d)|現在の位置から行末まで削除|
||d$ と同じ意味|
|d0|現在の位置から行始めまでを削除|
|dj|現在の行とその下の行を削除|
|dk|現在の行とその上の行を削除|
||j,kは[カーソル移動](#1-カーソル移動)の項目と同じ意味|
|||
|dd|現在の行を削除(改行含む)|
|10dd|現在の行から10行削除|
|**:10,20d\<enter>**|**10行目から20行目を削除**|
|||
|d/"*hoge*"|現在のカーソルから"*hoge*"の手前までを削除|
||"/"は検索を意味する。*hoge*は|
|dt.|現在のカーソル位置から次の.までを削除<br>(.は好きな一文字でOK)|
||tが現在の行の次の "." の1つ手前のカーソル位置を指す|
|||
|das|現在カーソルが置かれている1文を削除|
||sがsentenseを表す<br>aがallみたいな意味。つまりdelete all sentence->1文を削除|
|dap|1パラグラフを削除|
||pがparagraphを表す|
|||
|di] (or[)|[...]の中を削除(カーソルは括弧の中に置いておく) |
|ci] (or[)|[...]の中を削除後insert modeへ|


###削除後にInesrt modeにしたい場合: Cコマンド
|キー|やりたい事|
|:-:|--------|
|c|削除後にinsert modeに入る。<br>dと同じようにコマンドを使用することができる|
||例えばci[なら、[]内の文字を削除してその後insert modeに|
|C|現在の位置から行末までを削除してInsert mode <br> (D が現在の位置から行末まで削除するのと対応)|
|cc|現在の行を削除してInsert modeへ<br>(dd が現在の行を削除するのと対応)|
|cw|現在のカーソル上の単語を削除してInsertmodeへ|
|cD, c$|現在のカーソルより後ろの文字を削除してInsert mode|

###上書きモード
|キー|やりたい事|
|:-:|--------|
|R(shift + r)|文字を打つと、現在のカーソルの位置の文字が、タイプした文字と置換される|
||\<esc>でコマンドモードへ戻る|

#3. 表示の調整
|キー|やりたい事|
|:-:|--------|
|z\<enter>|カーソルが画面上部になるように移動|
|zz|カーソルが画面中心になるよう移動|

#4. 編集
### 基本動作 [コマンドモード]
|キー|やりたい事|
|:-:|--------|
|.|直前の編集を繰り返す|
|u|直前の編集の取り消し(WindowsのCtrl+z)|
|Ctrl + r|ReDo (WindowsのCtrl+y)|
|||
|p|現在のカーソルから**右側**にペースト|
|P (shift + p)|現在のカーソルから**左側**にペースト|

### Insert modeへの色々な入り方 (Cコマンドも参照)
|キー|やりたい事|
|:-:|--------|
|i|現在の文字の位置でInsert modeへ|
|I|現在の行の先頭に移動してInsert modeへ|
|a|一文字進んでInsert modeへ|
||ex) $で移動した後に文末にInsertしたい時にはこれを使う|
|A|現在の行末に移動してInsert modeへ|
|||
|o|現在の1行下に改行してInsert modeに変更|
|5o "*hoge*" \<esc>|現在の行から下に "*hoge*" を5行追加|
|O (shift + o)|1行上に改行してInsert mode|
|||
|**J** (shift + j)|**現在の行末の改行を削除して1つspaceを挿入。**|
||つまり現在の行と次の行をspace1つ追加して合体させる。|
|gJ|spaceの挿入なしで改行を削除|

### マクロ(複雑な作業の記録&再生)
|キー|やりたい事|
|:-:|--------|
|qa|aレジスタにマクロを記録の開始<br>(aの部分はb,c,d,...とレジスタ名なら何でもOK)|
|q|マクロの記録を停止|
|@a|aレジスタのマクロを再生|
|**:10,30 normal @a \<enter>**|**aレジスタのマクロを10-30行目に適用**|
||":10,30"は10-30行目を意味する|

#5. 検索と置換
###行内の文字を検索して移動
|キー|やりたい事|
|:-:|--------|
|f + *c* (1文字)|現在の行の次*c*まで移動|
||;で同行の次の文字, ","で前の文字へ|
|t + *c* (1文字)|現在の行の次*c*の**手前まで**移動|
|*|現在のカーソル上の単語が次に現れる位置まで移動(単語の完全一致で検索)|

###文章全体を検索して置換(検索範囲は絞ることも可能)
|キー|やりたい事|
|:-:|--------|
|:%s/*hoge*/*fuga*/g|文章全体の*hoge*を*fuga*に変換。<br>1行で複数回*hoge*が出てきても置換<br>(/gがないと行の最初の*hoge*だけが置換)|
|:1,5s/*hoge*/*fuga*/|1-5行目までの*hoge*を置換で。なお、%は1,$を表す|
|||
|:/*cat*/,/*dog*/s/*hoge*/*fuga*/g|*cat*と*dog*の間の行の*hoge*を*fuga*に置換|
|:/*cat*/,$s/*hoge*/*fuga*/g|*cat*以降の*hoge*を*fuga*に置換|

 - 特殊文字(/ & ! . ^ * $ \ ?)のエスケープにはバックスラッシュ(\\)を使用する。
    - 例えば、"INCL\hoge.txt"をfuga.mdに置換したい場合、:%s/INCL\\\hoge/fuga\\.md/g と入力してenter
    - [補足] \は￥と同じ
 - 選択範囲については、[範囲指定(@Link in Page)](#7-範囲指定)を参照ください。


#6. 保存と終了
|キー|やりたい事|
|:-:|--------|
|:wq|保存してvimを終了|
|:q!|保存せず終了。変更は無視。|
|:w|保存(vimは終了しない)|

#7. 範囲指定
- :%sのように別のコマンドと組み合わせて使用

|キー|やりたい事|
|:-:|--------|
|:10,20|10-20行目まで|
|:%|文章全体|
|:.,$|現在の位置から文末まで|
||.が現在のカーソル位置の行、$が文末を意味する|

#8. VISUALモード
###基本操作
|キー|やりたい事|
|:-:|--------|
|v|Visualモード(文字単位で選択)|
|Shift + v|Visual Lineモード(行単位で選択)|
|ctrl + v|Visual Blockモード(矩形で選択)|
|gv|前回の選択範囲を再現|

###複数行にコメントアウトを追加 (文頭に文字を挿入)
1. shift+v(もしくはctrl+v)でコメントアウトしたい範囲を選択
2. I\$\<esc>で先頭に$を追加 (I: shift + i)

###複数の行末に文章を追加
1. ctrl+vで文章を追加したい範囲の文頭を選択
2. \$で選択した複数行の文末まで移動
3. A(shift+a) *hogehoge* で文末に*hogehoge*を挿入