> [!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。 少し前の履歴を探したいときは便利です👍