Posted at

Vim と マクロ

More than 1 year has passed since last update.

この記事は株式会社ネクスト(Lifull) Advent Calendar 2016 の12日目です。


この記事の対象とゴール

対象

Vim を使ってるけど マクロ とかいまいち使ってない人、どう使うか迷う人。

ゴール

なんとなくマクロを使っていこうかなという気になる。

注意

なお、この記事はエディタ宗教戦争を助長するものではありません。


わたしとVim

丸5年くらい Vim を使っています。

そこまで長いわけじゃないけど、 Vim は好きです。

2こくらいですが、 プラグイン も書いたりしてます。

最近は go で CLIツール を書いたりしているのですが、これも Vim で書いてます。

そんなふうに プログラムを書いているときなど、 Vim のマクロはちょっとした時に便利です。

私の使い方を書こうと思います。


マクロとは

タイプした文字をレジスタ{0-9a-zA-Z"}に記録できます。

詳しくは、

:h complex-repeat

をご覧ください。


効率的に利用する

マクロの開始は q{0-9a-zA-Z"} で実行できますが、押しやすいので qq をよく使っています。

これを、

a = data['name']

b = data['age']
aa = data['weight']
bb = data['height']

こんな感じにしたいとします。

name = data['name']

age = data['age']
weight = data['weight']
height = data['height']

ハッシュのキーと変数名を揃えたいみたいな感じのときですね。

正直、このケースは以下で置換すれば一発です。

:%s/\v^[^ ]+(.+\['(.+)'\])$/\2\1/g

ただ、そういう場合だけでもないと思うので、今回はマクロを作るバージョンでやってみます。

実際問題、正規表現作るよりもマクロでやってしまったほうが早いケースも多いです。


マクロを作るときに意識していること3つ

A. 行単位の処理を意識する

B. 登録開始直後に最初に決まったポジション(だいたい先頭)に移動するコマンドを入力する

C. 登録終了時は次に処理したい行に移動してから終了する

というところです。


実際に作ってみる

まず、ファイルの始めに行ってからスタートするので、 gg ですね。



  1. qq でマクロの登録を開始します。

  2. 上記の B を意識して、 0 で先頭に行きます。(^でもいいですが、この場合どちらでも構いません、場面によって使い分けて下さい)


  3. dt␣ で左辺の文字列を消します。

  4. ハッシュのキーの部分に移動して内容をコピーしたいので、 2t' で移動、そして yi' でヤンクします。

  5. また 0 で先頭に戻り、P でペーストします。

  6. 最後に C を意識して j で下の行に移動し、q を押してマクロの登録を終了します。
    3@q で完了です。


デモ

上記の操作をしたgifがこちら。

macro.gif

今回はシンプルな例ですが、いろんな発展も上記の、3つ を意識すれば使い勝手良く、色々と効率化できると思います。


最後に

ネクストは Vim が好きなエンジニアも好きじゃないエンジニアも募集しています。

明日は リモートワークの話みたいです。