xxxcaqui.log

ツッコミお待ちしています

EmacsをRuby/Rails/RSpec向けに設定してみる

動機

RailsRSpecを使っていて、「アプリケーションコードとspecファイルを行き来するのめんどくせー!」ってなった。*1

そこで、調べてみたところ、emacsにはrspec-modeなるものがあり、上記の不満を解決してくれそうだったので設定してみることにした。

ちなみに、emacs noobなので、modeを追加したりするのは今回が初めて。*2

環境

はじめに

ユーザーごとのEmacsの設定ファイルは~/.emacsにあります。*3

また、拡張機能*4のインストール先はどこでもいいのですが、今回は~/.emacs.d/elispを使うことにし、Emacsからのload-pathを通しておきます。

$ mkdir ~/.emacs.d/elisp
;; ~/.emacs
(setq load-path (cons "~/.emacs.d/elisp" load-path))

ELPA

EmacsにはELPAEmacs Lisp Package Archive)が存在します。*5

Emacsのカスタマイズを簡単に行うために、まずはELPAを入れていきます。*6

auto-installのインストール

ELPAがauto-installという拡張機能に依存しているので、まずはauto-installを入れます。*7

$ cd ~/.emacs.d/elisp
$ curl -O http://www.emacswiki.org/emacs/download/auto-install.el

次に、今入れたauto-install関連の設定をします。
ところどころ、シングルクォートが閉じられてなくて気持ち悪いですが、動きます。*8

;; ~/.emacs

;;auto-installの設定
(when(require 'auto-install nil t)
  ;;インストールディレクトリを設定する
  (setq auto-install-directory "~/.emacs.d/elisp/")
  ;;EmacsWikiに登録されているelispの名前を取得する
  (auto-install-update-emacswiki-package-name t)
  ;;install-elispの関数を利用可能にする
  (auto-install-compatibility-setup)
)

ここまででauto-installのインストール及び設定ができたはずです。

ELPAのインストール

それでは、ELPAを入れていきます。

Emacsを起動して、

M-x install-elisp RET http://bit.ly/pkg-el23 RET

すると、冒頭に

;;; package.el --- Simple package system for Emacs

;; Copyright (C) 2007-2011 Free Software Foundation, Inc.

とか書かれた長いElispファイルが表示されるので、C-c C-cで保存します。

さっきと同じように設定します。

;; ~/.emacs

;;package.elの設定
(when (require 'package nil t)
  ;;パッケージリポジトリを追加
  (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
  (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
  (add-to-list 'package-archives '("ELPA" . "http://tromey.com/elpa/"))
  ;;インストールするディレクトリを指定
  (setq package-user-dir(concat user-emacs-directory "elpa"))
  ;;インストールしたパッケージにロードパスを通して読み込む
  (package-initialize)
)

以上でELPAのインストールが完了します。

拡張機能のインストール

さて、さっき入れたELPAを使って、拡張機能を入れていきます。

ELPAの使い方

M-x list-packages RET

ELPAが起動します。

基本的な操作は以下の通り。

i インストール候補を選択
u iで選んだチェックを外す
x インストール
? パッケージの詳細を見る
h ヘルプ
q 終了

iでインストール候補を選んでxでインストールというのが基本的な流れ。

インストール後は、.emacsへのaut-loadの代わりにEmacs

M-x package-initialize RET

します。

基本的には、これで使えるようになるようです。

便利な拡張機能たち

カッコ内はmode-lineに表示されるmode名。

ruby-mode(ruby

ruby-modeはデフォルトで入っていますが、Rakefileruby-modeが適用されないのでそれを修正。

;; ~/.emacs

(add-to-list 'auto-mode-alist '("Rakefile$" . ruby-mode))

ruby-electric(REl)

do endや{}などのブロックを閉じる要素を保管してくれます。

rspec-mode(RSpec

今回の動機となったelisp

公式サイトいわく、mode-compileに依存しているらしいので、mode-compileも入れる。

このelispによって、

C-c , t

でspecファイルからテスト対象のファイルへと飛べるようになる。*9

課題

逆向きジャンプ

rspec-modeの導入によって、specファイルからテスト対象のファイルへ飛ぶことはできるようになった。

しかし、現状では逆向きのジャンプができない。

正規表現"app/.+\.rb$"に一致するファイルでrspec-modeを有効に出来れば逆向きのジャンプも実現できる気がする。

Emacs上でのspecの実行

rspec-modeの公式ページによると、rspec-modeを導入すると「C-c , a」などのキーバインドでspecファイルからspecを実行できるようになるらしい。

しかし、

Symbol's function difinition is void: compilation--ensure-parse

と表示されてspecが実行できない。

*1:C-x C-fやC-x bは使ってますが、それでもapp/models/user.rbとspec/models/user_spec.rbを往復するのは割とめんどい。

*2:ツッコミお待ちしています。

*3:少なくともUbuntu 12.04では。

*4:そもそもこの呼び名でいいのかすらわからない。

*5:RubyでいうところのRubyGems

*6:Emacs24だとデフォルトで入ってるらしい。

*7:curlのオプションは「ラージ オー」です。

*8:Lispにおいて「'」はシングルクォートではなく、シンボルを生成する記号らしい。Rubyでいうと「:」ですね。

*9:「C-c , t」のcommaは区切りではなく、コマンドの一部なので注意。