Ruby
Gem

Rubyの高速フォーマッター ` rufo ` を導入してみた

More than 1 year has passed since last update.

前から少し気になっていたrufoというRubyのフォーマッターを試してみました。チームやリポジトリのコード規約によっては結構使えそうな感じです。

ruby-formatter/rufo

Ruby formatter の短縮形で rufo という名前になっています。
Rubocopのように文法などのチェック機能はなく純粋なフォーマッターです。

個人的には Unobtrusive by default という思想が好きで、基本的に設定しないとフォーマットしないよというスタンスが良いと思ってます。

vimの保存時にrufoでフォーマットをかける

vimのプラグインはruby-formatter/rufo-vimを利用します。

$ gem install rufo

rufoをインストールした後にrufo-vimを導入します。
dein.vimを使って *.toml でプラグインを管理している場合は、以下のような感じになります。

.dein.toml " dotfileとして管理したかったため、僕は ` .dein.toml ` という名前で管理しています
+# Formatter
+[[plugins]]
+repo = 'ruby-formatter/rufo-vim'

https://github.com/tackeyy/dotfiles/commit/d2d17be434412f1233f2ea57121df018517f7158#diff-1eca284d55b906ce2ca538f3c53e335cR118

.vimrc
+" --------------------------------
+" ruby-formatter/rufo-vim
+" --------------------------------
+" Enable rufo (RUby FOrmat)
+let g:rufo_auto_formatting = 1

https://github.com/tackeyy/dotfiles/commit/d2d17be434412f1233f2ea57121df018517f7158#diff-1eca284d55b906ce2ca538f3c53e335cR118

:w すると以下のような感じでフォーマットされます。

https://gyazo.com/c117a76bb5d3d1457f155e62c850dafa

上記のように = の位置を合わせるのは場所によっては微妙なのですが、以下のようにハッシュの中は : の後の位置を合わせたい派です。今のところ =: の後の位置を合わせるオプションが同じなのでちょっと困っています。

     {
 -      site: Settings.title,
 -      reverse: true,
 -      title: Settings.title,
 +      site:        Settings.title,
 +      reverse:     true,
 +      title:       Settings.title,
        description: Settings.description,
 -      keywords: Settings.keywords,
 -      canonical: request.original_url,
 +      keywords:    Settings.keywords,
 +      canonical:   request.original_url
      }

https://github.com/tackeyy/blog/commit/3cbe1b6a4c9d6950c081e294ab45f0d7ee43f2e4#diff-127a850b7d7b20173ad3fba88f8a25e3R3

ちなみに最初にvimのプラグインを入れてみたところまったく動かず「動作確認してないやろ・・・」ってなりましたが、issueをあげたらちゃんと対応してくれました。(コードをforkしたのですが、vim script初心者でぐぬぬとなったので修正までは至りませんでした)

https://github.com/ruby-formatter/rufo-vim/issues/10

rufoでフォーマットするときの設定

.rufo をプロジェクトを配置します。READMEを読むとどこのフォルダにあっても良いみたいですが、プロジェクトのルートフォルダにおくのが良いと思います。

rufoのリポジトリの .rufo をベースにしてrubocopの設定をみながらひとまず以下のような設定で導入してみました。
https://github.com/ruby-formatter/rufo/blob/master/.rufo

チームやリポジトリのコード規約やrubocopとの調整が少し時間がかかりそうな印象があります。

.rufo
indent_size                 2
spaces_inside_hash_brace    :always
spaces_inside_array_bracket :never
spaces_around_equal         :one
spaces_in_ternary           :one
spaces_in_suffix            :one
spaces_in_commands          :dynamic
spaces_around_block_brace   :one
spaces_after_comma          :dynamic
spaces_around_hash_arrow    :one
spaces_around_when          :one
spaces_around_dot           :no
spaces_after_lambda_arrow   :no
spaces_around_unary         :no
spaces_around_binary        :one
parens_in_def               :yes
double_newline_inside_type  :no
visibility_indent           :align
trailing_commas             :never
align_comments              true
align_assignments           true
align_hash_keys             true
align_case_when             true
align_chained_calls         true

https://github.com/tackeyy/blog/commit/3cbe1b6a4c9d6950c081e294ab45f0d7ee43f2e4#diff-041767c2b17cfda46ea18b2e5c2ee756

最後に

まだ若いフォーマッターということもあってもう少しプライベートで触ってみながら業務で携わっているプロダクトに入れたいな、と思いました。
また、チームに導入する上でメンバーが使用しているエディタのプラグインがあることが重要だと思っているのですが、今のチームでは僕以外はRubyMineを使っており、まだRubyMineのプラグインはないので今すぐには導入できなそうな気がしてます。

参考

https://github.com/ruby-formatter/rufo
https://github.com/ruby-formatter/rufo-vim