この記事のポイント
・viのコマンドを繰り返し実行する仕組みは「カウント数字+コマンド」の前置型
・3jで3行下、d2wで2単語削除のように数値プレフィックスで任意回数を一括指定
・直前操作のドット「.」コマンドで同じ編集を何度でも繰り返し再実行可能
・qa/@a/@@、ノーマルマクロ録音で「複数手順の繰り返し」も自動化できる
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 /
詳細はこちら
viのコマンドを繰り返し実行するカウントの基本
viのコマンドを繰り返し実行する カウントの書式は「回数→コマンド」の順です。jなら下方向移動、wなら次単語移動、xなら1文字削除なので、3j・5w・10xのように前に数値を置くと、その回数だけ同じ動作が一気に走ります。編集モードで使えるほぼすべてのコマンドがカウント対応です。dやcのようなオペレータと組み合わせる場合は、d3wで3単語削除、c2tで「2回tの動作」のように二段ネストできます。 ■カーソルを3行下に移動する
[pakira@Tiger ~]$ vi test.txt
This is Test ←3jと入力する
This is Test
This is Test
This is Test
This is Test
↓
This is Test
This is Test
This is Test ←カーソルが3行目に移動する
This is Test
This is Test
■2単語カットする
This is Test ←3jと入力する
This is Test
This is Test
This is Test
This is Test
↓
This is Test
This is Test
This is Test ←カーソルが3行目に移動する
This is Test
This is Test
This is Test ←d2wと入力する
This is Test
This is Test
This is Test
This is Test
↓
Test ←2単語がカットされる
This is Test
This is Test
This is Test
This is Test
This is Test
This is Test
This is Test
This is Test
↓
Test ←2単語がカットされる
This is Test
This is Test
This is Test
This is Test
viで繰り返し回数を指定できる主要コマンド一覧
カウントを併用できる代表的なコマンドを役割別にまとめます。| カテゴリ | コマンド例 | 動作 |
|---|---|---|
| カーソル移動 | 3j/5k/8h/10l | N行下/上/左/右へ移動 |
| 単語単位移動 | 3w/3b/3e | N単語進む/戻る/単語末尾 |
| 削除 | 5x/3dd/d3w | N文字削除/N行削除/N単語削除 |
| ヤンク(コピー) | 3yy/y3w | N行ヤンク/N単語ヤンク |
| 貼り付け | 3p/5P | 直前ヤンク内容をN回貼り付け |
| 文字置換 | 5rA | 5文字を一気にAへ置換 |
| 挿入 | 3iText[Esc] | Textを3回繰り返し挿入 |
| 行末・行頭移動 | 3$/3^ | 3行下の末尾/頭 |
| 検索 | 3n/3N | 直前検索の3つ目次/前ヒット |
| ジャンプ | 25G | 25行目へ直接ジャンプ |
viで直前のコマンドを繰り返し実行するドット「.」コマンド
カウント以外にも、「直前と同じ編集をもう一度」という形で繰り返し実行する方法があります。それがノーマルモードのドット「.」コマンドです。直前に行った編集系コマンド(挿入・削除・置換・ヤンクなど)をその場でもう一度実行します。「同じ修正を別の場所にも当てたい」とき、検索でジャンプ→ドット→検索→ドット…で一気にこなせます。
[pakira@Tiger ~]$ vi /etc/hosts
192.168.1.10 host01 ←dwで「host01」を削除
192.168.1.11 host02
192.168.1.12 host03
↓ /host02[Enter] で次行に移動して「.」
192.168.1.11 ←host02も同様に削除
192.168.1.12 host03
↓ /host03[Enter] で次行に移動して「.」
192.168.1.12 ←host03も同様に削除
ドット繰り返しはマクロを記録しなくても直前操作を即座に再利用できる点が強みで、「3か所同じ修正をする」程度の作業ならマクロより速いです。192.168.1.10 host01 ←dwで「host01」を削除
192.168.1.11 host02
192.168.1.12 host03
↓ /host02[Enter] で次行に移動して「.」
192.168.1.11 ←host02も同様に削除
192.168.1.12 host03
↓ /host03[Enter] で次行に移動して「.」
192.168.1.12 ←host03も同様に削除
ただし、ドットが拾うのは「単一の編集コマンド」までです。検索(/)や移動(j)は記憶されません。「移動も含めて繰り返したい」場合は次節のマクロを使います。
viで複数手順を繰り返し実行するqaマクロと@レジスタ
「カーソル移動+編集+移動+編集」のように複数操作をまとめて繰り返したい場合は、qaマクロを使います。これがviで繰り返しを自動化する最強の機能です。マクロを記録する
ノーマルモードでqの後にレジスタ名(a〜z)を打つと録音が始まり、qで停止します。
qa ←レジスタaへ録音開始
0i# [Esc]j ←行頭に「# 」を挿入して次行へ
q ←録音終了
これでレジスタaに「行頭にコメント記号を入れて次の行へ進む」という一連の動作が保存されます。
0i# [Esc]j ←行頭に「# 」を挿入して次行へ
q ←録音終了
マクロを呼び出して繰り返し実行する
@aでレジスタaのマクロを実行、@@で直前に実行したマクロを再実行します。さらにカウントと組み合わせると、N回連続で繰り返し実行できます。
@a ←1回実行
@@ ←もう1回
10@a ←10回連続で実行
「ログを10行コメントアウトする」「設定ファイル20行を一気に書き換える」といった作業もワンキーで終わります。
@@ ←もう1回
10@a ←10回連続で実行
マクロをファイル全体に適用する
行範囲指定とコマンドラインからの呼び出しを組み合わせると、ファイル全体に対する一括マクロ実行も可能です。
:%normal @a ←全行にマクロaを実行
:5,20normal @a ←5〜20行目にマクロaを実行
sedで書くと冗長になる「複雑な置換」や「条件付き整形」も、viマクロなら録音→範囲指定で一発反映できます。
:5,20normal @a ←5〜20行目にマクロaを実行
viのexコマンドモードで繰り返しと一括処理を組み合わせる
カウントやマクロのほかに、exコマンドモード(:から始まるコマンド)でも繰り返し処理は実現できます。:gコマンドで条件マッチ行に対して繰り返し実行する
:g/^#/d ←#で始まる行を全て削除
:g/ERROR/normal A <-- check ←ERROR行末に注記を追加
:g/ERROR/normal A <-- check ←ERROR行末に注記を追加
:sコマンドの繰り返し
:%s/old/new/g ←ファイル全体で一括置換
& ←直前の:s置換を現在行で再実行
& ←直前の:s置換を現在行で再実行
:rangeで範囲指定して繰り返し実行する
:10,30s/foo/bar/g ←10〜30行目で一括置換
:'a,'bnormal dd ←マークaからbまで全行削除を繰り返す
カウント・ドット・マクロ・exコマンドの4本柱を覚えると、viで「同じ作業を手動で何度も繰り返す」場面はほぼ撲滅できます。
:'a,'bnormal dd ←マークaからbまで全行削除を繰り返す
viで繰り返し実行するときの注意点とトラブル対処
繰り返し実行は強力ですが、誤操作で意図しない大量変更が走るリスクもあります。| 症状 | 原因 | 対処 |
|---|---|---|
| 数字キーを押しても何も起きない | 直後にコマンドを叩いていない | 3jのように直後に動作コマンドを必ず入力 |
| 3jが30jに化けた | 数字を連続入力 | u(アンドゥ)で復元、慣れるまでは小さい数値で確認 |
| .コマンドで意図しない編集が走る | 直前操作が「最後の編集」と違う | 「最後の編集」を意識して直前操作を制御 |
| マクロが途中で止まる | マッチしないパターンでエラー | :set noerrorbells で続行 or マクロを修正 |
| 10@aで暴走した | マクロ内のj移動が末尾を越えた | Ctrl+Cで中断後、uで戻す |
viコマンドを繰り返し実行するよくある質問
Q. 数字をどこまで指定できますか
A. 32bit整数の範囲(約21億)まで指定可能ですが、現実には数百〜数千以内が目安です。1000jのように極端に大きな値はファイル末尾でクリップされます。Q. iコマンドの繰り返しと、Iコマンドの繰り返しは違いますか
A. iは現在位置への挿入、Iは行頭への挿入で、カウントを付けると挿入文字列がN回連続で展開されます。3iaa[Esc]ならaaaaaaが3行目に挿入されます。Q. マクロの内容を後から編集できますか
A. レジスタの中身は":let @a = '〜'" で文字列として確認・書き換えできます。複雑なマクロは一度ファイルに書き出してから編集すると安全です。Q. VimとviでマクロやカウントのコマンドはVimにしかない機能ですか
A. カウント・ドットコマンド・qaマクロはオリジナルviの時代から存在する基本機能で、ほぼ全てのvi互換クローン(Vim/nvi/elvis/Neovim)で動作します。Q. 繰り返し実行のショートカットを覚えやすくする方法はありますか
A. 「数字キー+単一コマンド」「.」「@」の3パターンに分けて、よく使う3〜5個のコマンドだけまず体に染み込ませると効率的です。慣れてきたら範囲指定マクロへ拡張するのがおすすめです。本記事のまとめ
| 繰り返し方式 | 使いどころ |
|---|---|
| カウント(3j/d2w等) | 単一コマンドをN回まとめて実行 |
| ドット「.」 | 直前編集の即時再現、検索ジャンプとの組み合わせ最強 |
| qaマクロ+@a | 複数手順の自動化、ファイル一括処理 |
| :g/:sのex繰り返し | 条件マッチ行への一括処理 |
| 10@a/:%normal @a | マクロをN回/全行に適用 |
| u/Ctrl+C | 繰り返しの誤爆復旧 |
| 3iText[Esc] | テンプレ文字列のN回展開 |
暗記不要・1時間後にはサーバーが動く
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
Linux無料マニュアル(図解60P)
名前とメールで30秒登録
- 次のページへ:vi/vimのコマンドモードとインサートモードを切り替える方法|ESC・i・a・o操作と保存・終了まで
- この記事の属するカテゴリ:テキスト処理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます