RubyMotionアプリ開発に、motion-mode + Rubocop を導入


この記事ではmotion-modeとrubocopをEmacsに導入してRubyMotionアプリ開発で活用する方法について扱います。motion-modeについては作者の[ainame](http://qiita.com/ainame)さんが何か書いてくださるそうなので期待しましょう。

[Rubocop](https://github.com/bbatsov/rubocop)はアプリがsnake caseとcamel caseが入り乱れていないかなど、一貫したルールでコードが記述されているかチェックしてくれるツールです。チームで開発する際はもちろん一人でコードを記述する際にも一貫したコードは、可読性が向上し将来的にメンテナンスが容易になることでしょう。

## 1. Rubocopをインストール
RubocopはRubyGems経由でインストールするできます。

```
% gem install rubocop
```

## 2.  Emacsのパッケージをインストール
MELPA経由で以下のパッケージをインストールします。flycheckを導入しておくことで、Rubocopのチェック結果をよりわかりやすく表示できるようになります。

- [motion-mode](https://github.com/ainame/motion-mode)
- [flycheck](https://github.com/flycheck/flycheck)
- [rubocop](https://github.com/bbatsov/rubocop-emacs)


## 3.  Emacsの設定

```el
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; motion-mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'load-path "~/.emacs.d/elisp/motion-mode")
(require 'motion-mode)
;; following adding of hook is very important.
(add-hook 'ruby-mode-hook 'motion-recognize-project)
(add-to-list 'ac-modes 'motion-mode)
(add-to-list 'ac-sources 'ac-source-dictionary)
;; set keybindings as you like
(define-key motion-mode-map (kbd "C-c C-c") 'motion-execute-rake)
(define-key motion-mode-map (kbd "C-c C-d") 'motion-dash-at-point)
(define-key motion-mode-map (kbd "C-c C-p") 'motion-convert-code-region)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; rubocop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'rubocop)
(add-hook 'ruby-mode-hook 'rubocop-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; flycheck-mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; (add-hook 'after-init-hook #'global-flycheck-mode)
(require 'flycheck)
(add-hook 'ruby-mode-hook 'flycheck-mode)
(flycheck-define-checker ruby-rubocop
  "A Ruby syntax and style checker using the RuboCop tool.

See URL `http://batsov.com/rubocop/'."
  :command ("rubocop" "--format" "emacs" "--silent"
            (config-file "--config" flycheck-rubocoprc)
            source)
  :error-patterns
  ((warning line-start
            (file-name) ":" line ":" column ": " (or "C" "W") ": " (message)
            line-end)
   (error line-start
          (file-name) ":" line ":" column ": " (or "E" "F") ": " (message)
          line-end))
  :modes (enh-ruby-mode motion-mode))
```

RubyMotionプロジェクトのファイルを開くと`rubocop`が動作するように`flycheck-define-checker`を追加しています。(Rubyのコードを開いたときにも`rubocop`が動作するようにしています)

![131128-0001.png](https://qiita-image-store.s3.amazonaws.com/0/2075/c33ff190-7337-2d59-0272-c39d43ec51b5.png "131128-0001.png")

`rubocop`で指定されているコーディング規約に沿っていない箇所があれば、上の画像のように`?`が行頭に表示されるようです。

## 4. .rubocop.yml

いくつか`rubocop`のルールをカスタマイズしました。`.rubocop.yml`というファイルを`~/`やプロジェクトのルートに置くと良さそうです。

メソッド名、シンボル名がsnake caseになっているか、コメントがASCII文字だけか、1行あたりの文字数をチェックする機能を外しています。

```yaml:.rubocop.yml
# disable to check whether method name use camel case.
MethodName:
  Enabled: false

# disable to check whether symbol name use camel case.
SymbolName:
  Enabled: false

# disable to check whether only ascii symbols in comments.
AsciiComments:
  Enabled: false

# disable to check whether lines is less than 80 characters.
LineLength:
  Enabled: false
```

ほかのカスタマイズ項目については[https://github.com/bbatsov/rubocop/tree/master/config](https://github.com/bbatsov/rubocop/tree/master/config)の[default.yml](https://github.com/bbatsov/rubocop/blob/master/config/default.yml)を参考にすると良さそうです。