Posted at

Rails プロジェクトでファイル保存時に自動的に rubocop --autocorrect してもらおう

この記事は、グロービス Advent Calendar 2018 の9日目の記事です。

こんにちは。3月から Globis の末席を汚しております motchang と申します。SAML とか OAuth2 とか OpenID Connect とかのサンプル実装の記事を書いていたのですが、ネタが被っていることに気が付いてしまったので軽い Tips 的な内容で失礼します。


はじめに

みなさんの担当されている Rails プロジェクトには Rubocop が導入されているでしょうか? Globis のプロジェクト Rails プロジェクトにはもちろん全プロジェクトに Rubocop が導入されており、CIで違反を検出する仕組みが動いています。

エディタの設定をすればインラインでスタイル違反を表示することが可能ですが、 go fmt を知ってしまっている我々にとっていちいち rubocop の警告に合わせたコードを書いたり、または手動で rubocop を実行したりスタイルを合わせるなんて世界には住みたくないですね。ですので、ファイルを保存するついでに rubocop --autocorrect をエディタにやってもらいましょう。


パッケージのインストール

みなさんお使いのパッケージマネージャがあると思うので、ここでは一般的な方法だけ。パッケージマネージャに melpa を読み込ませます。


init.el

(require 'package)

(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(package-initialize)

あとは M-x package-list-packages して rubocopfmt パッケージをインストールしましょう。

スクリーンショット 2018-12-09 16.12.17.png


初期設定

インストールが終わったら init.el に 以下の hook を登録して、M-x eval-buffer しましょう。


init.el

(add-hook 'ruby-mode-hook #'flymake-mode)

(add-hook 'ruby-mode-hook #'rubocopfmt-mode)

この状態で ruby のファイルを編集して save-buffer すると以下のコマンドが実行されます。開発中に違反すると思われる Lint/Debugger などのルールがあらかじめ無効になっているのがニクいですね。

bundle exec rubocop --stdin identity_provider_sample.rb 

--auto-correct
--format emacs
--except
Lint/Debugger,Lint/UnusedBlockArgument,Lint/UnusedMethodArgument,Style/EmptyMethod

out.gif


まとめ

flymake で頑張ろうと思っていたけどパッケージ入れたら全部終わった。


その他

昔は「起動が重い」「メモリ食い過ぎ」などと言われて忌避されていた面もある Emacs ですが、2018年現在、Emacs を使っていて重いと感じるパソコンはあまり無いのではないでしょうか。また、Rails プロジェクトでの開発に限定した話では、 robe-mode というオムニ保管ツールがあり、これは裏で Rails console が動いているので Ruby の癖にしっかりメソッドや定数の定義位置にジャンプできるので RubyMine に匹敵するくらい便利です。ctag や gtag のタグジャンプでは味わえない利便性で、一度味わったらやめられません。重いから普段は使わないけど。みなさんも是非 Emacsian になりましょう :grinning: