Vimマクロを使ってないVimmerがいるってマ?

Vimマクロとは

Vimマクロを使ったことが無いという人は意外と多いのではないでしょうか?Vimはエディタの割に学習コストが高いので、普及していない機能が多いです。Vimマクロはその筆頭の機能かもしれません。

例えば次のような状況を想像してみて下さい。これはVue.jsのコードの一部ですが、このコードを理解する必要はありません。仮に各タグにclass="mr-0"を追加しなければいけない時あなたはどうしますか?

<a-item
  v-if="item.variety == 'a'"
  class="mr-0" ← これを後続のタグにも挿入しなければいけないと仮定
/>
<b-item
  v-else-if="item.variety == 'b'"
/>
<c-item
  v-else-if="item.variety == 'c'"
/>
<d-item
  v-else-if="item.variety == 'd'"
/>
<e-item
  v-else-if="item.variety == 'e'"
/>
<f-item
  v-else-if="item.variety == 'f'"
/>
<g-item
  v-else-if="item.variety == 'g'"
/>
<h-item
  v-else-if="item.variety == 'h'"
/>

流石に全部手入力をする人はいないと思いますが、恐らく一行だけ書いてそれを全体にコピペする方法を取るのが一般的なのではないでしょうか。一見問題なく思える方法なのですが、この方法には改善すべき点があります。それを明らかにするために一連の操作を言語化してみます。

  1. 3行目にclass="mr-0"を入力
  2. yyで行ヤンク
  3. 3行下に移動
  4. pで下に行を挿入
  5. 3と4を繰り返す

この程度の行数ならばそれほど時間は掛からないでしょう。しかしタグの数が増えたら途端に工数が増加してしまうという問題があります。Vimマクロはこういった繰り返し作業に効果的です。今回Vimマクロの使い方を覚えた後には、同じ作業を繰り返すシーンに出会ったらVimマクロが使えるのではないかと反応するように心がけましょう。

レジスタ

Vimマクロを説明する前にまずはレジスタを理解する必要があります。レジスタとはVimでヤンクや削除をする際に対象のテキストを格納しておく一時領域のことです。感覚的にはクリップボードに近いです。まずはこの扱いに慣れましょう。レジスタを知っている方は次の章をそのままお読み下さい。

Vimではレジスタをアルファベット分の26個まで保存することが出来ます。Vimのコマンドラインから:regを入力して下さい。レジスタの一覧が出力されます。

レジスタを指定せずに削除すると無名レジスタ("")に格納されます。ヤンクをすると無名レジスタとヤンクレジスタ("0)に格納されます。レジスタを指定して格納する場合は"add"ayyなどレジスタを指定して削除やヤンクをします。貼り付ける時も同じで"apとすればaレジスタの内容を貼り付けます。

Vimマクロの登録・編集・実行

レジスタを理解したらようやくVimマクロを解説します。何故Vimマクロを解説する前にレジスタの話をしたのかと言うと、Vimマクロもレジスタに格納されるからです。実際にVimマクロを操作することでその辺も理解しましょう。

Vimマクロの登録

ノーマルモードでqaを入力して下さい。するとVimのステータスラインにrecoding @aと表示されます。これはaレジスタにマクロを記録しているという意味です。適当に移動したり文字を入力したりした後にqを入力して下さい。ステータスラインが消えてマクロの記録が終了します。

Vimマクロの実行

:reg aでaレジスタの内容を見てみると、Vimマクロの記録を始めてから終わるまでの全ての入力したキーが格納されています。ノーマルモードで@aを入力することでaレジスタに格納したマクロを実行することが出来ますので試して下さい。

Vimマクロの編集

Vimマクロは普通のテキストと同じ様に扱えるので、コマンドラインで:put aを実行して、Vimマクロの中身を現在行の下に挿入して編集を行った後に、先頭から"ay$でaレジスタの内容を上書きすれば編集完了です。

答え

今回の場合だと、

  1. 3行目のclass="mr-0"yyで無名レジスタにヤンクする
  2. qaでaレジスタにVimマクロの記録を開始
  3. 3jで挿入位置に移動、pで貼り付け
  4. qでマクロの記録を終了

最初に挿入した位置から6@aを実行すれば6回aレジスタのVimマクロが実行されて、全てのタグにclass="mr-0"が挿入されるのではないでしょうか。

終わりに

謝罪が遅くなりましたが、この度は釣りのようなタイトルで不快な思いをさせてしまい申し訳ございませんでした。何を隠そう私自身が最近Vimマクロの存在を知りました。

Vimは使いこなせると非常に強力なエディタです。しかし使いこなせている人が(比較的)少ないのも事実です。
ここで説明したレジスタやマクロなどVim標準の機能の他にも、知られていないだけで便利な機能が山程あります。それらを使用することで初めてVimは高いパフォーマンスを発揮するのです。またその様なVim操作をする人たちを、何も知らない人が見たらまるで魔法使いの様に見えてしまうでしょう。

.vimrcの設定や、隠れ良プラグインに関する記事を過去にも書いておりますので、更に知識を深めたいという方はぜひ読んでみて下さい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA