Vimよく使うコマンド

VimはLinuxのテキストエディタのひとつで，Windowsのメモ帳みたいなもの．しかし，操作方法が特殊なので，勉強したことをまとめておく．
機能はたくさんあるが，**Vimを使ってソースコードを書いていたときに，よく使った操作**についてのみ書いておく．

#起動
```.sh
#Vimの起動
$ vim <ファイル名>
```
- **vim <ファイル名>**で，Vimが起動し，指定したファイルを編集できるようになる．
- 新規作成するファイルでも保存される．

#保存と終了
```.sh
#作成中のファイルを保存して，Vimを終了
:wq
```
- `:w`と`:q`を合わせたコマンドで，**作成中のファイルを保存して，Vimを終了**する．
- `:w`だけだと上書き保存．Windowsでの[Ctrl]+[s]と同じ．
- `:q!`で，現在の編集内容を破棄してVimを終了．
- `:q`だけだとVimを終了だが，「最後の変更が保存されていません（`!`を追加で変更を破棄）」と警告が出るので結局使うのは`q!`になる．

#Vimのモード
- **`ノーマルモード`，`インサートモード`，`Exモード`**が存在する．
- **ノーマルモードはカーソルの移動や文字列の削除，コピー＆ペースト**ができる．`vim`コマンドで起動したときはノーマルモードになっている．
- **インサートモードはファイルに文字の入力**を行う．
- **exモードは文字列の置換や検索**ができる．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505238/f96eb63d-032e-3660-24f6-a9776f4fbc4a.png">

- **ノーマルモードからインサートモードへは，`a`，`i`，`o`コマンド**で移行できる．戻るときは[Esc]を押す．
- **ノーマルモードからexモードへは，`:`コマンド**で移行できる．戻るときは[Esc]を押す．

|コマンド  |実行内容
|-------- |----------
|i        |カーソル位置の左から入力開始
|I        |行頭から入力開始
|a        |カーソル位置の右から入力開始
|A        |行末から入力開始
|o        |下に１行挿入し行頭に文字を追加
|O        |上に１行挿入し行頭に文字を追加

#カーソルの移動
##1文字or1行での移動
- **文字単位での移動は，`h`, `j`, `k`, `l`**コマンドを使用する．
- 各コマンドでの移動方向は表の通り．ホームポジションから手を動かさずに操作できるようになっている．

|コマンド  |実行内容
|-------- |----------
|h        |左に移動
|j        |下に移動
|k        |上に移動
|l        |右に移動
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505238/69bc48de-0d4e-ba4c-de9b-d4003ac0c270.png" width=30%>

##1単語での移動
- **単語単位での移動は，`w`, `b`**コマンドを使用する．
- **行頭への移動は`0`**コマンド，**行末への移動は`$`**コマンドを使用する．
- 各コマンドの移動は表の通り．`W`,`B`コマンドを使うと`b`,`w`コマンドよりも大きく移動できる．

|コマンド  |実行内容
|-------- |----------
|w        |前方に単語1つぶん移動
|j        |後方に単語1つぶん移動
|W        |スペース区切りで前方に単語1つぶん移動
|B        |スペース区切りで後方に単語1つぶん移動
|0        |行頭に移動
|$        |行末に移動
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505238/0e73e2ba-95d2-3791-9305-24d15d39b351.png" width=75%>

##行番号での移動
- 行単位での移動は，`g`コマンドを使用する．
- **`gg`で先頭行に移動，`G`で最後の行に移動**する
- 各コマンドの移動は表の通り．`<数字>G`で指定した行に移動できる．

|コマンド  |実行内容
|-------- |----------
|gg       |1行目に移動
|G        |最後の行に移動
|<数字>G  |<数字>行目に移動
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505238/d2dd4648-2e0f-9068-ff0e-6069bf1c8761.png" width=50%>

#コピー＆ペースト
##切り取り
- **切り取りは`x`，`d`コマンド**で行う．Windowsの[Ctrl]+[x]と同じ．
- `x`コマンドは1文字ずつ切り取る．
- **`d`+位置移動に使われるコマンド（`0`, `$`, `g` など）で切り取り範囲を指定**できる．

|コマンド  |実行内容
|-------- |----------
|x, dl    |現在位置から1文字を切り取り
|dw       |現在位置から1単語を切り取り
|dd       |現在カーソルのある行を切り取り
|d0       |現在位置から行頭までを切り取り
|d$       |現在位置から行末までを切り取り
|dgg      |現在位置から最初の行までを切り取り
|dG       |現在位置から最後の行までを切り取り

##コピー
- **コピーは`y`コマンド**で行う．Windowsの[Ctrl]+[c]と同じ．
- **`y`+位置移動に使われるコマンド（`0`, `$`, `g` など）でコピー範囲を指定**できる．

|コマンド  |実行内容
|-------- |----------
|yl       |現在位置から1文字をコピー
|yw       |現在位置から1単語をコピー
|yy       |現在カーソルのある行をコピー
|y0       |現在位置から行頭までをコピー
|y$       |現在位置から行末までをコピー
|ygg      |現在位置から最初の行までをコピー
|yG       |現在位置から最後の行までをコピー

##貼り付け
- **`p`コマンドで，`d`，`y`コマンドで切り取りまたはコピーした文字列を貼り付け**られる．Windowsの[Ctrl]+[v]と同じ．

#範囲指定
##ビジュアルモード
複数行を範囲指定で選択したいときは，ビジュアルモードが使える．
1. **[Shift]+[v]**を実行．ノーマルモードからビジュアルモードに移行する．
2. カーソルの移動で範囲を指定．
3. **`d`，`y`**で切り取りまたはコピー．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505238/aad96069-511c-ba30-92c1-b3380f048124.png">


##マーク機能
ある位置からある位置まで範囲指定して選択したいときは，マーク機能が使える．
1. 選択したい範囲の最初の位置に移動．
3. **mm**を入力．
4. 選択したい範囲の最後の位置に移動．
5. **d`m**，**y`m**で指定した範囲を切り取りまたはコピー．

※**`**はバッククォートなので，シングルクォートと間違わないように注意．

#検索と置換
##検索
```.sh
/<検索したい文字列>
```
- ノーマルモードで**`/`を入力し，その後に検索したい文字列を入力**．
- 検索はlessコマンドと同じ操作で行う．

|コマンド  |実行内容
|-------- |----------
|/<検索したい文字列>         |下方向に向かって検索
|?<検索したい文字列>         |上方向に向かって検索
|n                          |次の検索結果に移動
|N                          |前の検索結果に移動

- **<検索したい文字列>の先頭にカーソルを合わせ，#を入力する**と文字列の検索ができる．

##置換
```.sh
:%s /<置換元文字列>/<置換後文字列>/g
```
- ファイル上の全ての<置換元文字列>を<置換後文字列>に置換できる．
- **%**を入力しないと，カーソルがある行のみを対象に置換を行う．

#その他の操作
##結合
- **`J`コマンドで現在の行とすぐ下の行を連結**できる．
- `x`コマンドでは行末の改行を削除することができないため，`J`コマンドを使う必要がある．

##undo
- **`u`コマンドで直前の編集作業を取り消して前の状態に戻す**ことができる．

##redo
- **[Ctrl]+[r]でundoする前の状態に戻す**ことができる．