宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)

この記事のポイント

・viのコマンドを繰り返し実行する仕組みは「カウント数字+コマンド」の前置型
・3jで3行下、d2wで2単語削除のように数値プレフィックスで任意回数を一括指定
・直前操作のドット「.」コマンドで同じ編集を何度でも繰り返し再実行可能
・qa/@a/@@、ノーマルマクロ録音で「複数手順の繰り返し」も自動化できる

viの編集モードコマンドには、「カウント」という機能があり、あらかじめ実行回数を指定することで、その回数繰り返し実行することが出来ます。 基本的に編集モードで利用できるviコマンドは、すべてカウントで繰り返し実行することできます。 「同じ削除や移動を何度も叩いていて手が疲れる」「行を10行下に動かしたいだけなのにjキーを連打している」と感じたことがあるなら、viのコマンドを繰り返し実行する仕組みを覚えると編集速度が大きく変わります。本記事ではカウント・ドット繰り返し・qaマクロ・@レジスタなど、viで繰り返しを実現する4系統の方法を順に整理します。
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解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  ←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

viで繰り返し回数を指定できる主要コマンド一覧

カウントを併用できる代表的なコマンドを役割別にまとめます。
カテゴリコマンド例動作
カーソル移動3j/5k/8h/10lN行下/上/左/右へ移動
単語単位移動3w/3b/3eN単語進む/戻る/単語末尾
削除5x/3dd/d3wN文字削除/N行削除/N単語削除
ヤンク(コピー)3yy/y3wN行ヤンク/N単語ヤンク
貼り付け3p/5P直前ヤンク内容をN回貼り付け
文字置換5rA5文字を一気にAへ置換
挿入3iText[Esc]Textを3回繰り返し挿入
行末・行頭移動3$/3^3行下の末尾/頭
検索3n/3N直前検索の3つ目次/前ヒット
ジャンプ25G25行目へ直接ジャンプ
3iText[Esc]のように「挿入+繰り返し」も可能で、テンプレ文字列を一発でN回展開できます。dやcとの組み合わせは「コマンド+数値+オペランド」のいずれの順でも受け付けるので、3dwでもd3wでも結果は同じです。

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か所同じ修正をする」程度の作業ならマクロより速いです。

ただし、ドットが拾うのは「単一の編集コマンド」までです。検索(/)や移動(j)は記憶されません。「移動も含めて繰り返したい」場合は次節のマクロを使います。

viで複数手順を繰り返し実行するqaマクロと@レジスタ

「カーソル移動+編集+移動+編集」のように複数操作をまとめて繰り返したい場合は、qaマクロを使います。これがviで繰り返しを自動化する最強の機能です。

マクロを記録する

ノーマルモードでqの後にレジスタ名(a〜z)を打つと録音が始まり、qで停止します。
qa        ←レジスタaへ録音開始
0i# [Esc]j    ←行頭に「# 」を挿入して次行へ
q         ←録音終了
これでレジスタaに「行頭にコメント記号を入れて次の行へ進む」という一連の動作が保存されます。

マクロを呼び出して繰り返し実行する

@aでレジスタaのマクロを実行、@@で直前に実行したマクロを再実行します。さらにカウントと組み合わせると、N回連続で繰り返し実行できます。
@a       ←1回実行
@@       ←もう1回
10@a      ←10回連続で実行
「ログを10行コメントアウトする」「設定ファイル20行を一気に書き換える」といった作業もワンキーで終わります。

マクロをファイル全体に適用する

行範囲指定とコマンドラインからの呼び出しを組み合わせると、ファイル全体に対する一括マクロ実行も可能です。
:%normal @a   ←全行にマクロaを実行
:5,20normal @a  ←5〜20行目にマクロaを実行
sedで書くと冗長になる「複雑な置換」や「条件付き整形」も、viマクロなら録音→範囲指定で一発反映できます。

viのexコマンドモードで繰り返しと一括処理を組み合わせる

カウントやマクロのほかに、exコマンドモード(:から始まるコマンド)でも繰り返し処理は実現できます。

:gコマンドで条件マッチ行に対して繰り返し実行する

:g/^#/d     ←#で始まる行を全て削除
:g/ERROR/normal A <-- check ←ERROR行末に注記を追加

:sコマンドの繰り返し

:%s/old/new/g  ←ファイル全体で一括置換
&         ←直前の:s置換を現在行で再実行

:rangeで範囲指定して繰り返し実行する

:10,30s/foo/bar/g ←10〜30行目で一括置換
:'a,'bnormal dd  ←マークaからbまで全行削除を繰り返す
カウント・ドット・マクロ・exコマンドの4本柱を覚えると、viで「同じ作業を手動で何度も繰り返す」場面はほぼ撲滅できます。

viで繰り返し実行するときの注意点とトラブル対処

繰り返し実行は強力ですが、誤操作で意図しない大量変更が走るリスクもあります。
症状原因対処
数字キーを押しても何も起きない直後にコマンドを叩いていない3jのように直後に動作コマンドを必ず入力
3jが30jに化けた数字を連続入力u(アンドゥ)で復元、慣れるまでは小さい数値で確認
.コマンドで意図しない編集が走る直前操作が「最後の編集」と違う「最後の編集」を意識して直前操作を制御
マクロが途中で止まるマッチしないパターンでエラー:set noerrorbells で続行 or マクロを修正
10@aで暴走したマクロ内のj移動が末尾を越えたCtrl+Cで中断後、uで戻す
繰り返しで暴走したと感じたら、まずEsc→u(アンドゥ)で1ステップずつ戻すのが鉄則です。大量繰り返しを叩いたあとは:eX!で保存前状態に戻すことも検討します。

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回展開
viのコマンドを繰り返し実行する仕組みを使いこなすと、「同じ作業をひたすら叩く時間」が消えます。まずはカウント、次にドット、慣れたらqaマクロ、最後に:gコマンドの順で習熟していくと、テキスト編集の生産性が体感で2〜3倍上がります。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。