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

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

* この記事は個人ブログでも掲載しています。 -> http://tackeyy.com/blog/tried-rufo-as-a-ruby-formatter

# [ruby-formatter/rufo](https://github.com/ruby-formatter/rufo)

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

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

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

vimのプラグインは[ruby-formatter/rufo-vim](https://github.com/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](https://i.gyazo.com/c117a76bb5d3d1457f155e62c850dafa.gif)](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