weblog of key_amb

主にIT関連の技術メモ

Ruby コード中の "=" や "=>" を整列してくれる "ruby-align" というツールを作った

こちらになります。

github.com

使い方・動作例

ruby-align [-f] ファイル で結果を標準出力に吐きます。
README には vim の設定例を書いてますが、エディタから呼んでその場でコード整形すると捗るかと。

動作例としては、README に挙げたものをこちらにも貼っておきます:

## before
a = 1
dddd ||= (1..3)
bb -= 20
e = { foo: 1, bar: 'Bar' }

stash = {
  foo: 123,
  'bar' => 'Bar',
  "bazz" => %w[ x y z ]
}

## after
a      = 1
dddd ||= (1..3)
bb    -= 20
e      = { foo: 1, bar: 'Bar' }

stash = {
  foo:      123,
  'bar'  => 'Bar',
  "bazz" => %w[ x y z ]
}

一応、ネストしたハッシュや制御構文でのインデント変更も、テストケースに書いたものは対応できているはずです。(CI も通っています。)

これを作ったきっかけ

Perl でコードを書く場合、私はフォーマットのツールとして Perltidy を使っています。
この記事で紹介されているような Vim の設定をして、ハッシュ定義の => 等を揃えるのに多用しています。

…で、Ruby でそういうの無いの、と思って探したところ、どうも RuboCop に行き着くようです。*1

が、実際に試してもみたのですが、どうも思った通りに動いてくれない*2し、求めてもいない警告をたくさん出してくれます。

で、ついカッとなって作ってしまった感じです。

最初は VimScript で書こうとしてみたのですが、初心者すぎてつらかったのと、perltidy のようなインタフェースのものを作った方が他のエディタにも組み込みやすかろうということで Ruby に方向転換しました。*3

また、Ruby で書くにあたっては、始め RuboCop でも使われている whitequark/parser を使おうとしました。 が、求めている機能に対して牛刀感がして、やめてしまいました。

…で、結局ゴリゴリと正規表現を書いてます。

これはこれで、やはりつらみはある*4のですが、ある程度のパターンについてはテストを書いたので、ぶっ壊れることはそんなに無いかと思います。

自分のために作ったという部分が大きいですが、もしお気に召しましたらご自由にお使いくださいというところです。

(ただし、コードが壊れても責任は負えませんので、バックアップはお忘れなく。。)

参考

Vim で使える汎用の整列ツールとしては、昔から Align を使っているのですが、調べ直してみたところ Aligntavim-easy-align というのが見つかりました。

こういう整列ツールでも、だいたいやりたいことはできそうだなと思いました。

key: "value" 形式のエントリと "key" => "value" のものが混ざってるとつらそうですが、まあ、両者が混ざったハッシュってそんなに無い(?)のかなと思ったりもします。

*1:あと ruby-beautifyを試したと思います。

*2:特に key: "value" なパターンを揃えるオプションは見つかりませんでした。

*3:VimScriptの残骸がここにあります。

*4:1ヶ月後には書いた正規表現の意図を忘れてそう。