> [!code]- Markdown原文 (こちらをVimに貼り付けて進めましょう)
> ~~~
> テキストを選択して操作するモードを[[ビジュアルモード]]と言います。
>
> ## 思想の違い
>
> [[ノーマルモード]]とは思想が違います。
>
> | モード | 思想 |
> | -------------------- | ------------------------------- |
> | [[ノーマルモード]] | [[オペレータ]] + [[モーション]] |
> | [[ビジュアルモード]] | 範囲指定 + [[オペレータ]] |
>
> [[Vim]]に慣れていない場合は[[ビジュアルモード]]の方が直感的かもしれません。
>
> ### 2行削除してWelcomeを入力する例
>
> [[ノーマルモード]]の場合は`cjWelcome`ですね。
>
> ```txt
> ▼
> moyasu
> tagayasu
> okoshiyasu
> ```
>
> [[ビジュアルモード]]の場合は以下のフローです。
>
> 1. `Vj`で範囲選択
> 2. `c`で選択範囲を編集(削除して文字を入力)
> 3. `Welcome`
>
> `VjcWelcome`と入力してみましょう。
>
> ```txt
> ▼
> moyasu
> tagayasu
> okoshiyasu
> ```
>
> ## サブモード
>
> [[ビジュアルモード]]には選択範囲の種類によって3つのサブモードがあります。
>
> * 文字
> * 行
> * 矩形
>
> ### 文字
>
> 文字単位で範囲を指定します。`v`でスタート。
>
> `vwwhhgU`と入力してみましょう。
>
> ```txt
> ▼
> moyasu tagayasu okoshiyasu
> ```
>
> ### 行
>
> 行単位で範囲を指定します。`V`でスタート。
>
> 冒頭の例はこのサブモードです。 もう少し高度な例を試してみましょう。
>
> [[Markdown]]の見出しを挿入する例です。 `yypVr-`と入力してみてください。
>
> ```txt
> ▼
> Header2
> * aaa
> * bbb
> ```
>
> [[ビジュアルモード]]と置換[[オペレータ]]の相性は抜群ですね😄
>
> ### 矩形
>
> 矩形で範囲を選択します。`<C-v>`でスタート。
>
> 選択することより、その後の一斉編集で使うことが多いです。 特にテーブルの編集と相性がいいです。
>
> `ww<C-v>4jI<space>|<space><ESC>`
>
> ```txt
> ▼
> | name age |
> | -------- |
> | Tom 18 |
> | Merry23 |
> | Yasu 33 |
> ```
>
> 2行目以降が遅れて反映されるのは仕様です。
>
> ## [[ノーマルモード]]との使い分け
>
> 得意分野が違うため、以下のケースに合致する場合だけ[[ビジュアルモード]]を使います。
>
> * 視覚的フィードバックが欲しいとき
> * 特定の範囲を[[ヤンク]]されたデータで置換したいとき
> * 矩形で編集したいとき
>
> 特に2つ目は大事なので例を示します。
>
> 箇条書きの`Yasu`を`Tagayasu`に変更したいケースです。
>
> ```txt
> ▼
> Students
>
> * Tom
> * Merry
> * Yasu
> --
> Todo: Yasu -> Tagayasu
> ```
>
> 以下のコマンドを実行してみましょう。
>
> * `/Ta<CR>yw`でテキストをyank
> * `4kh`で移動
> * `viwp`で貼り付け
>
> ```txt
> ▼
> Students
>
> * Tom
> * Merry
> * Yasu
> --
> Todo: Yasu -> Tagayasu
> ```
>
> [[ノーマルモード]]で同じことをやる場合は最後のコマンドを`diwp`にすれば良いと思うでしょうか。是非やってみてください。
>
> ```txt
> ▼
> Students
>
> * Tom
> * Merry
> * Yasu
> --
> Todo: Yasu -> Tagayasu
> ```
>
> 実は`diw"0p`とやらなければダメなんですね😈 興味がある方は[[レジスタ (Vim)|レジスタ]]について調べてみてください。
>
> ## おまけ
>
> 覚えておくと便利な範囲選択ショートカットです。
>
> | キー | 意味 | 覚え方 |
> | --------------------------- | ---------------------------- | ---------- |
> | [[ビジュアルモード]]中に`o` | 範囲の反対側を拡張する | Opposite |
> | [[ノーマルモード]]中に`gv` | 最後に選択した範囲を指定する | God Visual |
>
> 以下の順にコマンドを打って試してみましょう。
>
> 1. `vwobgUG`
> 2. `gvgu`
>
> ```txt
> "ari" "ori" "haberi" "imasugari"
> ▼
> "moyasu" "tagayasu" "yatagarasu"
> "hoge" "hoga" "hogu" "hoho" "homi"
> ```
> ~~~
テキストを選択して操作するモードを[[ビジュアルモード]]と言います。
## 思想の違い
[[ノーマルモード]]とは思想が違います。
| モード | 思想 |
| -------------------- | ------------------------------- |
| [[ノーマルモード]] | [[オペレータ]] + [[モーション]] |
| [[ビジュアルモード]] | 範囲指定 + [[オペレータ]] |
[[Vim]]に慣れていない場合は[[ビジュアルモード]]の方が直感的かもしれません。
### 2行削除してWelcomeを入力する例
[[ノーマルモード]]の場合は`cjWelcome`ですね。
```txt
▼
moyasu
tagayasu
okoshiyasu
```
[[ビジュアルモード]]の場合は以下のフローです。
1. `Vj`で範囲選択
2. `c`で選択範囲を編集(削除して文字を入力)
3. `Welcome`
`VjcWelcome`と入力してみましょう。
```txt
▼
moyasu
tagayasu
okoshiyasu
```
## サブモード
[[ビジュアルモード]]には選択範囲の種類によって3つのサブモードがあります。
* 文字
* 行
* 矩形
### 文字
文字単位で範囲を指定します。`v`でスタート。
`vwwhhgU`と入力してみましょう。
```txt
▼
moyasu tagayasu okoshiyasu
```
### 行
行単位で範囲を指定します。`V`でスタート。
冒頭の例はこのサブモードです。 もう少し高度な例を試してみましょう。
[[Markdown]]の見出しを挿入する例です。 `yypVr-`と入力してみてください。
```txt
▼
Header2
* aaa
* bbb
```
[[ビジュアルモード]]と置換[[オペレータ]]の相性は抜群ですね😄
### 矩形
矩形で範囲を選択します。`<C-v>`でスタート。
選択することより、その後の一斉編集で使うことが多いです。 特にテーブルの編集と相性がいいです。
`ww<C-v>4jI<space>|<space><ESC>`
```txt
▼
| name age |
| -------- |
| Tom 18 |
| Merry23 |
| Yasu 33 |
```
2行目以降が遅れて反映されるのは仕様です。
## [[ノーマルモード]]との使い分け
得意分野が違うため、以下のケースに合致する場合だけ[[ビジュアルモード]]を使います。
* 視覚的フィードバックが欲しいとき
* 特定の範囲を[[ヤンク]]されたデータで置換したいとき
* 矩形で編集したいとき
特に2つ目は大事なので例を示します。
箇条書きの`Yasu`を`Tagayasu`に変更したいケースです。
```txt
▼
Students
* Tom
* Merry
* Yasu
--
Todo: Yasu -> Tagayasu
```
以下のコマンドを実行してみましょう。
* `/Ta<CR>yw`でテキストをyank
* `2kh`で移動
* `viwp`で貼り付け
```txt
▼
Students
* Tom
* Merry
* Yasu
--
Todo: Yasu -> Tagayasu
```
[[ノーマルモード]]で同じことをやる場合は最後のコマンドを`diwp`にすれば良いと思うでしょうか。是非やってみてください。
```txt
▼
Students
* Tom
* Merry
* Yasu
--
Todo: Yasu -> Tagayasu
```
実は`diw"0p`とやらなければダメなんですね😈 興味がある方は[[レジスタ (Vim)|レジスタ]]について調べてみてください。
## おまけ
覚えておくと便利な範囲選択ショートカットです。
| キー | 意味 | 覚え方 |
| --------------------------- | ---------------------------- | ---------- |
| [[ビジュアルモード]]中に`o` | 範囲の反対側を拡張する | Opposite |
| [[ノーマルモード]]中に`gv` | 最後に選択した範囲を指定する | God Visual |
以下の順にコマンドを打って試してみましょう。
1. `vwobgUG`
2. `gvgu`
```txt
"ari" "ori" "haberi" "imasugari"
▼
"moyasu" "tagayasu" "yatagarasu"
"hoge" "hoga" "hogu" "hoho" "homi"
```