Vimの基本操作

# はじめに
vimの操作方法が分からないという人向けにvimの基本的な操作方法についてまとめてみました。
今回ご紹介するvimの操作はvimでもneovimでもどちらでも使えますので
そのあたりは特に気になさらず読んでもらえたらなと思います。

# モード切り替え
vimには下記の4つのモードがあります。
- インサートモード
- ノーマルモード
- コマンドモード
- ビジュアルモード

#### モードの概要
- インサートモード：タイプした文字を入力できる編集モードです。
- ノーマルモード：編集モードから抜けて、移動やコピー等の様々な操作をする時に使うモードです。今回ご紹介する操作のうち、ほとんどはノーマルモードで使います。vimを起動した時、最初はノーマルモードになります。
- コマンドモード：コマンドを実行したい時に使います。
- ビジュアルモード：範囲選択したい時に使います。

#### モード切り替え操作
- `i`: インサートモード
- `esc`: ノーマルモード
- `:`: コマンドモード
- `v`: ビジュアルモード

# 基本的な移動
基本的な移動の操作です。

- `j`: 下↓に移動
- `k`: 上↑に移動
- `l`: 右→に移動
- `h`: 左←に移動

# 保存・終了
`w`は、writeの頭文字で、`q`はquitの頭文字なので覚えやすいかと思います。
- `:w`: 上書き保存
- `:w ファイル名`: 名前をつけて保存
- `:q`: 編集終了
- `:q!`: 保存しないで編集終了
- `:wq`: 保存して終了

# 削除
- `x`: 1文字削除
- `dd`: 1行削除
- `dw`: 単語単位で削除
- `数値 dd`: 数値に入力した分の行を削除
    - 例）`2 dd`: 2行削除

##### 注意点
`dw`を使う際、カーソルの位置を削除したい単語の先頭にする必要があります。
例えば、`apple`という単語を削除したいとします。
その場合は、カーソルの位置を「a」のところに持ってきた上で`dw`を入力してください。
先頭ではなく例えば、「l」の位置で入力しても単語全体が削除できません。

# Undo
- `u`: Undo（Macのショートカットで言う`command + z`）
- `Control + r`: Undoした操作を再度実行（Macのショートカットで言う`command + shift + z`）

# ビジュアルモード
冒頭でビジュアルモードについて少し触れましたが、もう少し説明します。
ビジュアルモードを使う時は範囲を選択したい時です。
`v`でビジュアルモードに切り替えられます。
`v`で切り替えた後に、`j`、`k`、`l`、`h`を使って移動すると移動前から移動後の範囲を選択できます。

# コピー、ペースト
コピーをする際は行ではなく単語単位でコピーしたい時もあるかと思います。
そういう場合は、ビジュアルモードに切り替えて、範囲を選択した上でコピーをしてみてください。
- `y`: 選択されている範囲をコピー
- `yy`: 1行コピー
- `数値 yy`: 入力した数値分の行をコピー
    - 例）`2 yy`: 2行コピー
- `P`: 現在行にペースト

# コマンド実行
冒頭にコマンドモードへ切り替えるには`:`を入力するとお伝えしました。
なので下記は`:`の後に入力します。
- `!コマンド`
    - `!ruby test.rb`: test.rbを実行
    - `!ls`: lsコマンドを実行
- `!!`: 1つ前のコマンドを実行（1つ前と同じコマンドを実行したい時に便利です）

# 応用的な移動
基本的な移動は紹介したので、いくつか便利な移動操作をご紹介します。

- `:set number`: 行番号を表示する
- `:数値`: 入力した数値の行に移動
- `$`: 行末に移動
- `0`: 行の先頭に移動
- `{`: 段落ごとに上に移動
- `}`: 段落ごとに下に移動
- `gg`: ファイルの先頭に移動
- `G`: ファイルの最後に移動
- `Control + o`: 移動前の位置に戻る

##### 補足
- `{`と`}`について、段落ごとに移動と説明しましたが、これは簡単に言うと、次の空行がある行に移動する、といった動きになります。
- `Control + o`について、これは例えば、実装をしていて何か使いたいライブラリやモジュールがあったとします。そういう時に`gg`でファイルの先頭に移動してimport文を書きます。その後、元々いた位置に戻りたい時に`Contorol + o`で戻ることができます。ファイルの先頭から実装途中の箇所を探す手間が省けます。

# 検索・置換
- `/検索したい文字列`: 検索（スラッシュの後に検索したい文字列を入れる）
- `n`: 次の検索結果に移動
- `N`: 一つ前の検索結果に移動
- `:%s/検索文字列/置換後の文字列/g`: 一括置換
- `:%s/検索文字列/置換後の文字列/gc`: 一つ一つ確認しながら置換

##### 注意点
スラッシュで検索したい文字列を入力した後にenterを押すと`n`や`N`が使えるようになります。

# 様々なインサートモード切り替え
冒頭でインサートモードへの切り替えは`i`を使うと説明しましたが、その他にもいくつか方法があります。
- `a`: カーソルのある文字の直後からインサートモード
- `o`(小文字のオー): 選択している行の下に空白を入れ、インサートモード
- `O`(大文字のオー): 選択している行に空白を入れ、インサートモード

##### 補足
1. 冒頭で紹介した`i`と`a`の違いを説明します。

- `i`: カーソルにある文字の**直前**からインサートモード
- `a`: カーソルにある文字の**直後**からインサートモード


例えば、行末に何か追記したいとします。
下記の場合、「テスト」の後に何か書きたいので、テストの「ト」の位置にカーソルを持っていきます。

```html:index.html
<div>テスト
</div>
```
もし「ト」の位置で`i`を入力したら「ト」の直前の「ス」から入力が始まります。
そのまま入力すると「テスxxxxト」となります。
これは意図した動きではないので、このような場合は`a`を使います。
`a`を使うと「ト」の直後から書き始めることができます。

2\. `o`と`O`については似ていますが、コーディングをする時は選択している行に空白を入れて何かを書きたいケースの方が多いと思うので、大文字の`O`だけ覚えていても良いかもしれません。

# インデントの調整
これを使う際はビジュアルモードで範囲を選択した上でインデントを調整することが多いかと思います。
`v`でビジュアルモードに切り替えて、`j`でカーソルを下に持っていくことで移動させたい行を選択します。
行を選択した上で以下を入力すると右や左に行全体を移動できます。
- `>`: 右にインデントを移動
- `<`: 左にインデントを移動

# その他
少し番外編ということで一つ紹介します。
- `.`: 直前の操作をリピート

一つ前の操作がもし押しづらいとか長いとかであれば、ドットを入力することで直前のvim操作を繰り返すことができます。

# 終わりに
今回ご紹介したvimコマンドは45個でした。
もちろんまだまだありますが、最初のうちはたくさん覚えられないと思うので今回はいくつか厳選して紹介しています。
他のvim操作も気になりましたら是非調べてみてください。

# 参考文献
[現役シリコンバレーエンジニアが教える NeoVim(VIM) + Tmux + Zsh 入門](https://www.udemy.com/course/vim-tmux-zsh)