CBcloud Advent Calendar 2020 の5日目の記事です。
vimのマクロとは、キーストロークを記録してそれを好きなタイミングで再生できるという機能です。
マクロ記録中にミスをして修正したいときや、複雑なマクロを組むときにプレーンテキストでマクロを組みたいときに使える方法を説明します。
マクロの基本操作
- ノーマルモードでqa(aは任意のキー)を押すと記録開始。画面左下に"recording @a"と出る
- 記録したい操作をする
- qを押して記録を終了。画面左下の"recording @a"が消える
- ノーマルモードで@aを押すと記録したマクロを再生する
マクロの記録
例を使って説明していきます。
下記のようなテキストがあり、param_typeとdescの位置を内容ごと入れ替えたいとします。
(単純な入れ替えならマクロ使うまでもないというツッコミは無しで...)
params do
requires :foo_id, documentation: { param_type: 'body', type: 'integer', desc: 'fooのID' }
requires :hoge_note, documentation: { param_type: 'body', type: 'string', desc: 'hogeに関する備考' }
requires :is_fuga, documentation: { param_type: 'body', type: 'boolean', desc: 'fugaかどうか' }
# ...
任意のrequiresの行にカーソルを合わせ、qaで記録を開始していきます。
記録したい内容は下記です。
0/param_type # 行頭にカーソルを移動してparam_typeを検索
vt,d/desc # 検索した位置から「,」の1文字手前を選択して削除後、descを検索
vf';p0/{ # 検索した位置から2個目の「'」までを選択して↑の操作で削除した文字列をペーストして行頭に戻り「{」を検索
lpj # 検索した位置から1つ右にカーソル移動して↑で削除した文字列をペーストして次の行へ
マクロ記録中に操作ミス発生
ところが、fによる検索の繰り返しキーを「;」ではなく間違えて「n」を押してしまいました。
そこで、qキーを押して一旦記録を終了します。
記録したマクロはレジスタに入っているだけなのでレジスタからペーストすることができます。
挿入モードでCtrl + r、<任意のキー>でマクロ内容をテキスト貼り付け
適当な場所で挿入モードにして、Ctrl + r、a(aはマクロを記録したキー)でレジスタaの内容を貼り付けします(ノーマルモードからの"apによる貼り付けだとわかりにくい形式になっちゃいます)
すると、下記テキストが貼り付けされます。
0/param_type
vt,d/desc
vf'n
あとはこれを編集して正しい形にします。
マクロ記録と貼り付けを繰り返せば少しずつマクロを作っていけます。
0/param_type
vt,d/desc
vf';p0/{
lpj
テキストをレジスタにヤンクしてそのレジスタを指定してマクロ実行
前述のように、マクロはレジスタに記録されているので、この正しい形になったテキストをレジスタaにヤンクして@aでマクロ呼び出しができます。
ノーマルモードでこのテキストを選択後、"ayをしてレジスタaにヤンク、@aで実行します。
params do
requires :foo_id, documentation: { desc: 'fooのID', type: 'integer', param_type: 'body' }
requires :hoge_note, documentation: { param_type: 'body', type: 'string', desc: 'hogeに関する備考' }
requires :is_fuga, documentation: { param_type: 'body', type: 'boolean', desc: 'fugaかどうか' }
# ...
1行だけ入れ替えができました。後は10@a(10回@aを実行)のようにして一気に実行するだけです。
注意点としてはヤンクするときShift + vでヤンクすると最後の行の改行もヤンクされてしまい、jとその改行で2行分下に移動していまいますので選択はvで初めてjで止めてやる必要があります(最後のjを消してShift + vによるコピーでもいいです)