Help us understand the problem. What is going on with this article?

Rubyの高速フォーマッタ-"Rufo"を使ってみる【18/09/30更新】

More than 1 year has passed since last update.

普段はVisualStudioCodeでRailsのコードを書いているのですが、Rubyのフォーマッターがほしいと常々思っていました。

そこで、週間Railsウォッチで紹介されていたRufoというRubyフォーマッターを使ってみたところ、非常に使いやすく、自分の使い方にもマッチしていたので紹介します。

変更点

2018/09/30

Setting.mdに合わせて設定の内容を更新しました。
設定できる項目が減り、いずれ設定をする必要がなくなるようです。
細かく設定したい人にはうれしくない話かもしれませんが、フォーマットは統一できればさほど問題ないので、細かく設定できて差分が生じるより良い話かと思います。

フォーマッターに求めること

自分がフォーマッターに求めることは主に以下の4つです。

  • 保存時に自動でフォーマットがかかること
  • フォーマット設定が容易で、共有できること
  • ストレスなく使えること
  • 自分の好きなエディタで使えること

簡単に説明します。

保存時に自動でフォーマットがかかること

Rails自体は個人の趣味の範囲でしか開発していないので、自分がフォーマットを気をつければ良いだけなのですが、集中して書いているとちょっとしたずれがあるので、保存時に自動的にフォーマットがかけられたり、コマンドで任意に呼び出せたりすると便利です。

フォーマット設定が容易で、共有できること

複数の環境での開発や、複数人での開発となった際は統一したフォーマットの設定が必須なので、簡単にフォーマットの設定ができる必要があります。

ストレスなく使えること

フォーマットの適用に数秒待たされるとなると集中も途切れてしまうので、ある程度ストレス無く使える必要があります。(個人差はあると思いますが、個人的には0.5秒以内が理想)

自分の好きなエディタで使えること

上記3つに比べればさほど重要ではありませんが、いつも使用しているエディタで使えることが望ましいです。

Rufo

Ruby formatterことRufoは上記の自分のフォーマッターに対する要望にしっかり応えてくれます。
フォーマットの適用タイミングはエディタ毎に異なりますが、設定が可能です。
フォーマットの設定に関しては.rufoというドットファイルを用意することで自動的に読み込んで適用してくれます。.rufoで設定できる項目は後述します。
速度に関してはGithubの説明にもある通り高速に動作し、ノンストレスで使用できます。(公式では3000行程度で290ms, 500行程度では180msとなっています。)

インストール

インストールには以下のコマンドを実行するだけです。

$ gem install rufo

使用方法

コマンドラインからフォーマットをかける場合は下記になります。

$ rufo file names or dir names

.rufoを置いていない場合はデフォルト設定でのフォーマットが実行されます。

下記リンク先に各種エディタでのサポートもありますので、確認してみてください。

Editor support - Github

設定

メインとなる.rufoの設定となります。

設定を反映する場合は.rufoファイルをプロジェクトに配置することで自動的に読み込んでくれます。また、複数のプロジェクトで共有したい場合は親のディレクトリに配置すれば読み込んでくれます。

以下、Settings - Githubを日本語で説明したものとなります。元のWikiから説明の補足や間違いの修正をしています。おかしな箇所があったらコメントでご連絡ください。

align_case_when

case文の中のwhen句で縦位置を合わせるかどうか

  • false: (デフォルト) 縦位置を合わせない(既存のコードはそのまま保存される)
  • true: 縦位置を合わせる

コード例

case exp
when foo then 2
when barbaz then 3
end

trueの場合、フォーマットをかけると以下のようになる

case exp
when foo    then 2
when barbaz then 3
end

falseの場合は何も変更されない

align_chained_calls

メソッドチェインの.の縦位置を合わせるかどうか

  • false: (デフォルト) 縦位置を合わせない(既存のコードはそのまま保存される)
  • true: 縦位置を合わせる

コード例

foo.bar
   .baz

foo.bar
  .baz

trueの場合、フォーマットをかけると以下のようになる

foo.bar
   .baz

foo.bar
   .baz

falseの場合は何も変更されない

メモ: falseの時にすでに縦位置がそろっている場合は、その状態が維持される

parens_in_def

メソッド定義で引数の括弧を使用するかどうか

  • :dynamic: (デフォルト) 現状のまま変更しない
  • :yes: 常に括弧を付与する

コード例

def foo x, y
end

def bar(x, y)
end

:yesの場合、フォーマットをかけると以下のようになる

def foo(x, y)
end

def bar(x, y)
end

:dynamicの場合は何も変更されない

trailing_commas

「配列やハッシュにおけるケツカンマ」のフォーマット方法

  • :dynamic: (デフォルト) 現状のまま変更しない
  • :always: 常にケツカンマがあるようにフォーマットする
  • :never: 常にケツカンマがないようにフォーマットする

コード例

[
  1,
  2
]

[
  1,
  2,
]

{
  foo: 1,
  bar: 2
}

{
  foo: 1,
  bar: 2,
}

foo(
  x: 1,
  y: 2
)

foo(
  x: 1,
  y: 2,
)

:alwaysの場合、以下のようになる

[
  1,
  2,
]

[
  1,
  2,
]

{
  foo: 1,
  bar: 2,
}

{
  foo: 1,
  bar: 2,
}

foo(
  x: 1,
  y: 2,
)

foo(
  x: 1,
  y: 2,
)

:neverの場合、以下のようになる

[
  1,
  2
]

[
  1,
  2
]

{
  foo: 1,
  bar: 2
}

{
  foo: 1,
  bar: 2
}

foo(
  x: 1,
  y: 2
)

foo(
  x: 1,
  y: 2
)

:dynamicの場合は何も変更されない

自分の.rufo

自分の設定している.rufoはこんな感じです。

parens_in_def :yes
trailing_commas :always
totto357
JavaScript, TypeScript, Vue.js, Vuetify, Nuxt.js, Almin.js あたりをメインに使っています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away