> [!code]- Markdown原文 (こちらをVimに貼り付けて進めましょう)
> ~~~
>
> コマンドを打ち込んで操作するモードです。[[ノーマルモード]]で`:`を打つと[[コマンドラインモード]]開始です。`ESC`で終了します。
>
> `:`から始まるコマンド[[Exコマンド]]といいます。
>
> ## [[Exコマンド]]
>
> [[Exコマンド]]はオペレータで代用できるものが多いです。[[Exコマンド]]は[[Vim]]以外のエディタ/[[IDE]]では対応していないリスクがあるため、代用可能なら[[オペレータ]]の使用をお勧めします。
>
> [[オペレータ]]よりも効率がよくなるコマンドを紹介します。
>
> ### 移動と複製
>
> | コマンド(正確な表現ではない) | 動作 |
> | ---------------------------- | ---------------------------- |
> | `:[range]m[address]` | `[range]`を`[address]`に移動 |
> | `:[range]t[address]` | `[range]`を`[address]`に複製 |
>
> 実際に試してみましょう。 以下の順にコマンドを実行してみてください。
>
> 1. `:52m38`
> 2. `:53t.`
>
> ```txt
> ▼
> 100
> 200
> 300
> 400
> 500
> 600
> 700
> 800
> 900
> 1000
> 1100
> 1200
> 1300
> 1400
> 1500
> 1600
> 1700
> 1800
> 1900
> 2000
> ```
>
> 1歩も動かずに移動や複製ができました😄 ただ、`52Gdd38Gp`の方がフィードバックもあり直感的な気はします。
>
> ### 置換
>
> 置換は[[Exコマンド]]でなくてはできません。
>
> `:[range]s/{pattern}/{string}/[flags]`とコマンドを打つと、`[range]`の`{pattern}`を`{string}`に置換します。
>
> ためしに`su`を`Suuuuu!`へ置換してみましょう。`g`フラグは発見した初めの1パターンだけでなく、全てのパターンに処理をするフラグです。 (外すと1つ目しか置換されない)
>
> `:s/su/Suuuuu!/g`と実行。
>
> ```txt
> ▼
> karasu tagayasu yatagarasu
> ```
>
> ### range
>
> 基本的に`:`の直後には`[range]`を指定します。よく使うものは以下。
>
> | 表現 | 意味 | 例 |
> | ---- | ---------------- | ------- |
> | | カーソル行 | `:d` |
> | . | カーソル行 | `:.d` |
> | N | N行目 | `:4d` |
> | N,M | N行目~M行目 | `:4,8d` |
> | N+i | N行目からN+i行目 | `:4+8d` |
> | N-i | N行目からN-i行目 | `:4-8d` |
> | % | ファイル全体 | `:%d` |
>
> また[[ビジュアルモード]]で範囲を選択した状態で`:`を押すと、その範囲が`[range]`になった状態でコマンド入力画面に移動します。
>
> `'<,'>`という表記ですが覚える必要はありません。一応、`'<`が選択範囲開始位置、`'>`が選択範囲終了位置という意味です。
>
> ### [[ノーマルモードコマンド]]
>
> ななななんと..[[ノーマルモード]]のコマンドがそのまま使えちゃいます! やってみた方が早いのでどうぞ。
>
> `V3j:norm ci'Aikawa`
>
> ```txt
> ▼
> Good morning! 'tadashi'
> Oh, sorry 'tadashi'... you are vimmer..
> Therefore, don't you like Emacs?
> By the way 'tadashi', do you know Atsushi?
> ```
>
> 選択範囲の行全てに`norm`のあと入力した[[ノーマルモード]]のコマンドが実行されます。[[ドットコマンド]]を使えば`ci'Aikawa<ESC>+.2+.`と書けますが、範囲が増えるとこちらの方が速いです😄
>
> `norm`では[[ドットコマンド]]そのものも指定できるため、[[ノーマルモード]]で動作確認してから繰り返すこともできます。
>
> 1. `3cWTagayasu<ESC>`
> 2. `jV3j:norm .`
>
> ```txt
> ▼
> 1, 2, 3 is your friend!
> 11, 12, 13 is your friend!
> 21, 22, 23 is your friend!
> 31, 32, 33 is your friend!
> 41, 42, 43 is your friend!
> ```
>
> ### 繰り返し
>
> [[ノーマルモード]]の操作が`.`コマンドで繰り返せるように、Exコマンドも`@:`で繰り返すことができます。
>
> `:<UP><CR>`でも十分ではありますが..。
>
> ## 外部コマンド
>
> `!`から始まるコマンドはシェルとして実行できます。
>
> | コマンド | 意味 |
> | ----------------- | ------------------------------------------------------------------------ |
> | `!{cmd}` | シェルで`{cmd}`を実行 (バッファには影響なし) |
> | `r !{cmd}` | シェルで`{cmd}`を実行した結果をカーソル行下に挿入 |
> | `[range]w !{cmd}` | `[range]`の範囲を標準入力として、シェルで`{cmd}`を実行する |
> | `[range]!{cmd}` | `[range]`の範囲を標準入力として、シェルで`{cmd}`を実行した結果で置換する |
>
> `:r !whoami<CR>`と打てば自分の名前がバッファに挿入されます。
>
> ## [[コマンドラインウィンドウ]]
>
> [[Exコマンド]]や外部コマンドは便利ですが、コマンドを都度入力するのは大変です。
>
> [[コマンドラインモード]]で`<C-r>"`と押せば[[ヤンク]]をputできるため、事前に[[Vim]]で編集したコマンドをyankしておくと少し楽になります。
>
> 1. `y$jj`
> 2. `V}:<C-r>"<CR>`
>
> ```txt
> ▼
> s/.md/.markdown/g
>
> 1. summary.md
> -> 5 min
> 2. warming-up.md
> -> 10 min
> 3. motion.md
> -> 10 min
> 4. operator.md
> -> 15 min
> 5. textobject.md
> -> 10 min
> 6. visual-mode.md
> -> 15 min
>
> ```
>
> それよりも[[コマンドラインウィンドウ]]を使った方が直感的です。[[コマンドラインウィンドウ]]では **[[Vim]]の機能を使ってコマンドを編集できます**
>
> ### [[ノーマルモード]]から開く
>
> [[ノーマルモード]]で`q:`と押してみてください。`:q`と押し間違えたときに馴染みのある画面になりませんか?🤓
>
> [[コマンドラインウィンドウ]]では以下のことができます。
>
> * [[Vim]]の検索/挿入/編集機能
> * Enterでその行に記載されたコマンドが実行される
> * `<C-c>`でその行に記載された内容を[[コマンドラインモード]]に送る
>
> ### [[コマンドラインモード]]から開く
>
> [[コマンドラインモード]]でコマンド入力中に編集したくなったとき便利です。`<C-f>`で開きます。
>
> ### Exコマンド以外のコマンドラインウィンドウ
>
> [[Exコマンド]]だけでなく検索の[[コマンドラインウィンドウ]]もあります。`q:`の代わりに`q/` or `q?`と押せばOK。
>
> 少し前の履歴を探したいときは便利です👍
>
> ~~~
コマンドを打ち込んで操作するモードです。[[ノーマルモード]]で`:`を打つと[[コマンドラインモード]]開始です。`ESC`で終了します。
`:`から始まるコマンド[[Exコマンド]]といいます。
## [[Exコマンド]]
[[Exコマンド]]はオペレータで代用できるものが多いです。[[Exコマンド]]は[[Vim]]以外のエディタ/[[IDE]]では対応していないリスクがあるため、代用可能なら[[オペレータ]]の使用をお勧めします。
[[オペレータ]]よりも効率がよくなるコマンドを紹介します。
### 移動と複製
| コマンド(正確な表現ではない) | 動作 |
| ---------------------------- | ---------------------------- |
| `:[range]m[address]` | `[range]`を`[address]`に移動 |
| `:[range]t[address]` | `[range]`を`[address]`に複製 |
実際に試してみましょう。 以下の順にコマンドを実行してみてください。
1. `:52m38`
2. `:53t.`
```txt
▼
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
1500
1600
1700
1800
1900
2000
```
1歩も動かずに移動や複製ができました😄 ただ、`52Gdd38Gp`の方がフィードバックもあり直感的な気はします。
### 置換
置換は[[Exコマンド]]でなくてはできません。
`:[range]s/{pattern}/{string}/[flags]`とコマンドを打つと、`[range]`の`{pattern}`を`{string}`に置換します。
ためしに`su`を`Suuuuu!`へ置換してみましょう。`g`フラグは発見した初めの1パターンだけでなく、全てのパターンに処理をするフラグです。 (外すと1つ目しか置換されない)
`:s/su/Suuuuu!/g`と実行。
```txt
▼
karasu tagayasu yatagarasu
```
### range
基本的に`:`の直後には`[range]`を指定します。よく使うものは以下。
| 表現 | 意味 | 例 |
| ---- | ---------------- | ------- |
| | カーソル行 | `:d` |
| . | カーソル行 | `:.d` |
| N | N行目 | `:4d` |
| N,M | N行目~M行目 | `:4,8d` |
| N+i | N行目からN+i行目 | `:4+8d` |
| N-i | N行目からN-i行目 | `:4-8d` |
| % | ファイル全体 | `:%d` |
また[[ビジュアルモード]]で範囲を選択した状態で`:`を押すと、その範囲が`[range]`になった状態でコマンド入力画面に移動します。
`'<,'>`という表記ですが覚える必要はありません。一応、`'<`が選択範囲開始位置、`'>`が選択範囲終了位置という意味です。
### [[ノーマルモードコマンド]]
ななななんと..[[ノーマルモード]]のコマンドがそのまま使えちゃいます! やってみた方が早いのでどうぞ。
`V3j:norm ci'Aikawa`
```txt
▼
Good morning! 'tadashi'
Oh, sorry 'tadashi'... you are vimmer..
Therefore, don't you like Emacs?
By the way 'tadashi', do you know Atsushi?
```
選択範囲の行全てに`norm`のあと入力した[[ノーマルモード]]のコマンドが実行されます。[[ドットコマンド]]を使えば`ci'Aikawa<ESC>+.2+.`と書けますが、範囲が増えるとこちらの方が速いです😄
`norm`では[[ドットコマンド]]そのものも指定できるため、[[ノーマルモード]]で動作確認してから繰り返すこともできます。
1. `3cWTagayasu<ESC>`
2. `jV3j:norm .`
```txt
▼
1, 2, 3 is your friend!
11, 12, 13 is your friend!
21, 22, 23 is your friend!
31, 32, 33 is your friend!
41, 42, 43 is your friend!
```
### 繰り返し
[[ノーマルモード]]の操作が`.`コマンドで繰り返せるように、Exコマンドも`@:`で繰り返すことができます。
`:<UP><CR>`でも十分ではありますが..。
## 外部コマンド
`!`から始まるコマンドはシェルとして実行できます。
| コマンド | 意味 |
| ----------------- | ------------------------------------------------------------------------ |
| `!{cmd}` | シェルで`{cmd}`を実行 (バッファには影響なし) |
| `r !{cmd}` | シェルで`{cmd}`を実行した結果をカーソル行下に挿入 |
| `[range]w !{cmd}` | `[range]`の範囲を標準入力として、シェルで`{cmd}`を実行する |
| `[range]!{cmd}` | `[range]`の範囲を標準入力として、シェルで`{cmd}`を実行した結果で置換する |
`:r !whoami<CR>`と打てば自分の名前がバッファに挿入されます。
## [[コマンドラインウィンドウ]]
[[Exコマンド]]や外部コマンドは便利ですが、コマンドを都度入力するのは大変です。
[[コマンドラインモード]]で`<C-r>"`と押せば[[ヤンク]]をputできるため、事前に[[Vim]]で編集したコマンドをyankしておくと少し楽になります。
1. `y$jj`
2. `V}:<C-r>"<CR>`
```txt
▼
s/.md/.markdown/g
1. summary.md
-> 5 min
2. warming-up.md
-> 10 min
3. motion.md
-> 10 min
4. operator.md
-> 15 min
5. textobject.md
-> 10 min
6. visual-mode.md
-> 15 min
```
それよりも[[コマンドラインウィンドウ]]を使った方が直感的です。[[コマンドラインウィンドウ]]では **[[Vim]]の機能を使ってコマンドを編集できます**
### [[ノーマルモード]]から開く
[[ノーマルモード]]で`q:`と押してみてください。`:q`と押し間違えたときに馴染みのある画面になりませんか?🤓
[[コマンドラインウィンドウ]]では以下のことができます。
* [[Vim]]の検索/挿入/編集機能
* Enterでその行に記載されたコマンドが実行される
* `<C-c>`でその行に記載された内容を[[コマンドラインモード]]に送る
### [[コマンドラインモード]]から開く
[[コマンドラインモード]]でコマンド入力中に編集したくなったとき便利です。`<C-f>`で開きます。
### Exコマンド以外のコマンドラインウィンドウ
[[Exコマンド]]だけでなく検索の[[コマンドラインウィンドウ]]もあります。`q:`の代わりに`q/` or `q?`と押せばOK。
少し前の履歴を探したいときは便利です👍