Vimを操作していると、左下の操作ウィンドウに「記録中 @a」や「recording @a」など表示されたことがないでしょうか。
この記事ではその意味と、それ(マクロ)の使い方について解説します。
記録中 @qaとは
実は「記録中 @a」とはマクロの記録中という意味です。Excelでマクロと聞いたことがあるかもしれませんが、そのマクロと同じです。
Vimにもマクロという機能があり、Vimの操作中に知らぬ間にマクロの記録を実行しており、左下の操作ウィンドウに「記録中 @a」や「recording @a」などが表示されていたのです。
マクロ概要
マクロとは複数の操作を一つにまとめて記録しておき、それを呼び出して繰り返し実行させる機能の事です。
マクロの使うシチュエーションとしては、例えば以下のように、複数行に英単語が書かれているテキストがあるときに、それぞれの単語の前後の空白を削除し、単語シングルクォテーションで囲みたいと器などです。
Apple
Banana
Grape
Orange
4行くらいなら、愚直に手動で編集して、それぞれの単語をシングルクォテーションで囲むことが出来ると思います。でもこれが100行や1000行になったらどうでしょうか。手動でできないこともないですが、正直やりたくないですね。
このような場合に一行目の操作をマクロとして記録しておき、それを必要な分だけ繰り返し実行すれば数秒ですべての単語を処理することが出来ます。具体的な方法は次章以降で解説します。
マクロ記録方法
マクロを実行するにはまずは記録する必要があります。記録するにはq{register}で指定したレジスタに記録することが出来ます。{register}の部分には、例えばaとすればaレジスタにマクロをが記録されます。レジスタとは保存領域に事で、詳しくは以下の記事を見てみてください。
実際にVimでノーマルモードにしてから、qaと押してみると、左下に「記録中 @a」と表示され、マクロの記録が開始されました。
この状態の操作が、指定したレジスタ、この場合aレジスタに記録されていきます。
終了するときはqを押すことでマクロの記録が終了し、その間の操作が指定したレジスタに記録されます。
マクロ実行
マクロを実行する方法はいくつかあります。
1回実行
@{register}で{register}に記録されているマクロを1回実行することが出来ます。
例えば@aとすることで、aレジスタに記録されているマクロを1回実行することが出来ます。
直近のマクロを実行
@@とすると、直近実行したマクロを再度実行することが出来ます。
複数回実行
マクロを複数回実行したい場合はn@{register}とします。nには繰り返したい回数、{register}にはレジスタを指定します。
例えば100@bとすると、bレジスタに記録しているマクロを100回実行します。
具体的にやってみる
具体的な例を用いた方がわかりやすいので、以下のテキストを使います。
Apple
Banana
Grape
Orange
Apple
Banana
Grape
Orange
複数行の渡った書かれている英単語の前の空白を削除し、それぞれの単語をシングルクォテーションで囲むマクロを考えます。
1行目にカーソルを移動させ、「Apple」の前後の空白を削除し、それをシングルクォテーションで囲む操作を記録します。2行目以降の単語は記録したマクロを複数回実行することで、自動的に処理します。
ggで1行目に移動し、qaでaレジスタにマクロの記録を開始します。あとは以下のキーストロークで1行目に行った処理をマクロとして記録します。
- 0:行頭に移動
- ciw:単語前のスペースを削除し、インサートモードに切り替え
- ‘:シングルクォテーション入力
- <Esc>:ノーマルモードに切替
- e:単語末尾にカーソル移動
- a:インサートモードに切替
- ‘:シングルクォテーション入力
- <Esc>:ノーマルモードに切替
- j:一行下に移動
最後にqを押下して、マクロの記録を終了します。
最後にjで一行下に移動しているのは繰り返しマクロを実行したときに、1回目の実行が終わったら次の行に移動しておくためです。そうすることで、マクロを繰り返し実行したときに、上から下に順番に処理されていきます。
最後に7@aで先ほど、aレジスタに記録したマクロを7回繰り返すことで、2行目以降の単語の処理をマクロで自動的に実行します。
実際にやってみるとこんな感じになります。
まとめ
- 「記録中 @q」はマクロの記録中という意味
- マクロの記録はq{register}で開始、qで記録終了
- @{register}でマクロを実行できる
- n@{register}でn回マクロを実行できる