Vim でのマクロ使い方まとめ
マクロの記録
- qa (a 〜 z のどれでもよい)で記録開始。ステータス行に「recording」と表示されることを確認
- 操作を行う
- q で記録終了
マクロの実行
- マクロの実行に失敗した時点で、処理は中断される
- @a (a 〜 z の記録したものをタイプ)
- @@ ← 前回と同じマクロを実行
- 10@a ← 10回「a」マクロを実行。マクロを直列に実行する。
マクロを並列に実行
- V でビジュアルモードに入り、マクロを実行したい行を選択する。
- :'<,’>normal @a を実行。「'<,’>」は「:」をタイプした時点で自動的に入力される。
Vim マクロの使い方実践!
次のテーブル HTML のゴミ部分を削除したいですの!ゴミ部分とは、たとえば「data-sheets-value=”[null,2,"2:"]”」ですわ。
<table dir="ltr" border="1" cellspacing="0" cellpadding="0"><colgroup> <col width="100" /> <col width="100" /> <col width="100" /> <col width="100" /></colgroup> <tbody> <tr> <td data-sheets-value="[null,2,"2:"]">2:</td> <td data-sheets-value="[null,3,null,2]">2</td> <td></td> <td></td> </tr> <tr> <td data-sheets-value="[null,2,"3:"]">3:</td> <td data-sheets-value="[null,3,null,3]">3</td> <td></td> <td></td> </tr> <tr> <td data-sheets-value="[null,2,"5:"]">5:</td> <td data-sheets-value="[null,3,null,5]">5</td> <td></td> <td></td> </tr> <tr> <td data-sheets-value="[null,2,"7:"]">7:</td> <td data-sheets-value="[null,3,null,7]">7</td> <td></td> <td></td> </tr> </tbody> </table>
他の部分とも比べてみますと、次の条件を満たす行を削除したいと言い換えられますの♪
- 「 data-sheets-value」(先頭は半角スペース)が含まれる行
- 「 data-sheets-value」から「”」で閉じられた部分までがゴミ
- 「”」は同じ行に2つあるため、1つ目までと早合点しないように注意
上記条件を満たすマクロを考え、記録し、対象を選択して実際に実行してみますの♪
マクロにゴミ削除の操作を記録いたします♪
次のようにマクロに記録させますわ♪ポイントは、ビジュアルモードで選択するときは左から右に記録するのではなく、逆に右から左へ選択することで「”」の検索を1回だけに抑えたところでしょうか。
※追記:あとでよくよく考えてみますと、最初に「”」を検索しますので、「”」が有り、かつ「data-sheets-value」が無い行でマクロを実行しますとバッファ全体の最後から後方検索されますの。結果意図しない部分が選択されてしまいますわ><。バグのあるマクロ。。。><。
ゴミが含まれる行にカーソルを移動してから記録開始ですの♪
- qa
- $F”v?data-sheets-value<CR>hx
$ → 行末へ移動
F” → 左方向の「”」へ移動
v → ビジュアルモード開始
?data-sheets-value<CR> → 「data-sheets-value」を後方検索
h → 左へカーソル1つ移動
x → ビジュアルモードで選択した部分を削除 - q
これで「a」にマクロが記録されましたと同時に、マクロの記録のために操作した行でゴミが削除されましたの。
コードの対象行を選択してマクロを並列に実行!
ゴミの対象行を選択いたしましてからマクロを実行しますと選択した行全てが対象となりますの♪一気に処理できますので、大変楽ですわ♪
しかも!、間にゴミが含まれない行を選択してしまっても大丈夫!ゴミの無い行だけマクロが実行されず、前後のゴミのある行だけマクロが実行されますの!
例の2行目にカーソルを移動しまして次の操作を実行ですの!
- VG
-
:'<,’>normal @a
ですから、マクロの処理が実行される行をこちらで決める必要がないようにできる点が、並列にマクロを実行する時の利点と言えますわね。
逆に、対象となる行が無くなったら以降の処理を止めたい場合はマクロの並列処理は使ってはいけませんわね!
おわりに
Windows のサクラエディタで初めて「マクロ」というものを知りました。
それまでエクセルマクロなどの名前やそれでできることなどを風の便りに聞きましたので、何かのログファイルから必要な物を抽出し、不要な部分を削除するのに使ってみましたのが始まりでしたわね。
感動いたしましたの!
13インチ MacBook Pro Retina にしてからは、予めインストールされている Vim を使用しております。。。マクロってあるのかしら?いいえ、きっとございますわね!という気持ちで探しましたらやっぱり!
この本には大変助けられましたの♪ありがとう存じます。
- TIP64: マクロの記録と実行 P212
- TIP67: 連続する行に対して変更を繰り返す P222 マクロを並列に実行する
- 実践Vim【委託】 – 達人出版会
複数行を選択して、一度に各行に対してマクロを実行!なんてこともできますのね♪サクラエディタにはなかった(もしくはわたくしたちは気づけなかった)機能ですの♪素敵!
以上です。