Vimでは、マクロを一連の行に適用するにはどうすればよいですか?


222

たくさんの行があるファイルがあります。1行で操作を実行するマクロを記録しました。ファイル内の残りのすべての行でそのマクロを繰り返したいのですが。これを行う簡単な方法はありますか?

私はCtrl + Qを試し、一連の行を強調表示し、@@を押しましたが、それでうまくいかなかったようです。


オフトピックの質問:VIMマクロに気づかなかった(または気になりたくなかった:P)VIMマクロに「怠惰なリーダー」向けの素敵なリンクがありますか?
OscarRyz 2008

確かに、これはoreillynet.com/mac/blog/2006/07/…でかなりよくまとめられています。
ジョーダンパーマー

vim内から:he-complex-repeatを確認することもできます
Sam

回答:


354

Exモードで通常のコマンドを使用して、複数/すべての行でマクロを実行します。

レジスタaに格納されているマクロを5行目から10行目で実行します。

:5,10norm! @a

レジスタaに格納されているマクロを、ファイルの最後から5行目まで実行します。

:5,$norm! @a

レジスタaに格納されているマクロをすべての行で実行します。

:%norm! @a

patternに一致するすべての行で、レジスタaのマクロストアを実行します

:g/pattern/norm! @a

視覚的に選択された行でマクロを実行するには、目的の領域が選択されるまでVjまたはkを押します。次に:norm! @a、次の入力行が表示されることを入力して確認します。

:'<,'>norm! @a

詳細については、vimで:help normalと入力してください。


1
はい、:vimで通常のヘルプまたは先ほど追加したリンク。
Maygarden裁判官、2008

1
非emacsの仲間のユーザーを助ける何か!
Maygarden裁判官、2008

48
いいね!初心者向けのヒント:Vを押してからj / kを使用して必要な行を強調表示し、次のように入力します:norm! @a
Kevin Bourrillion

7
@KevinBourrillionからの非常に役立つヒントに追加するには:、行を強調表示した後にを押すと、代わりにEx入力行が読み取ら:'<,'>れ、Kevinが提案した残りの部分が追加されます。これにより、最後のコマンドが読み込まれます:'<,'>norm! @a
Deiwin

3
@GabeMoothart !ユーザーによるキーの再マッピングを回避します。あなたはそれを必要としないかもしれませんが、誰にとってもうまくいく答えはそれを必要とします。
Maygarden裁判官、2016年

60

グローバルを使用して、「パターン」を含むすべての行でマクロ「a」を実行します

:g/pattern/normal! @a

ヘルプについては、次を確認してください:help global


4
将来のユーザーのために明確にするために:これはグローバルExコマンドです。
atp 2013

39

これを行うこともできます:

通常モード:

[number of times to apply the macro] @ [register]

例えば:

1000@q

レジスタqのマクロを次の1000行までリンゴします。

更新:受け入れられた答えははるかに優れています

更新:@kevinliuが指摘しjたように、次の行に進むためにマクロをaで終わらせたくなるでしょう。


4
これは最終行で停止し、恐れていた最終行で複数回実行されません。
Hubro、2015

@Hubro、他のユーザーからのこれらの答えは私のために働いていた::%norm! @avGG :norm! @a
マックスHeiberを

2
何らかの理由で、これは驚くほどうまくいきましたが、受け入れられた答えはうまくいきませんでした。私のマクロには、新しい行の挿入、作業、次の行への移動が含まれていました。
jasonszhao

@jasonszhaoはい、同じです。とにかく1000とは言いませんが、最後まですべての行を表示します。それでも、新しい行の処理、
何かの処理

2
マクロjは次の行に移動するコマンドで終了する必要があることを指摘しておく必要があります。そうしないと、同じ行にマクロを適用しようとします。
Kevin Liu

2

RangeMacroと呼ばれるプラグインもあり、まさにあなたが望むことをします!名前で推測できないすべての人のために、それは何をしますか:視覚的な選択によるか、:40,50 /:+10によるかに関係なく、指定された範囲の各行に対して記録されたマクロを繰り返します

http://www.vim.org/scripts/script.php?script_id=3271を参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.