Saturday, January 05, 2008

Running RSpec in Emacs

This article is originally posted at my main blog (Mostly Chinese) :

RSpec is a Behaviour Driven Development framework for Ruby. It’s output format can be customized. However, the default format works well in Emacs’s compilation-mode. Type M-x compile and input spec file_name_spec.rb. The result will be prompted at a new buffer.

Some useful information are colorized. You can even use your mouse to click on the failures to go directly to the line where spec fails (Of course there’re shortcuts like C-` available). However, we can still make it better.

More highlighting

By default the cursor is at the beginning in the newly prompted buffer with the spec results. We want it to be at the end so that we can see how many examples failed. That’s easy, in fact, it is the default behavior before Emacs 20.3:

;; keep scrolling in compilation result buffer
(setq compilation-scroll-output t)

That’s simple and cool! But I want the number be highlighted! And more highlighted when the number of failures is not zero. That’s also easy, we can add some rules to achieve this:

(add-to-list 'compilation-mode-font-lock-keywords
'("^\\([[:digit:]]+\\) examples?, \\([[:digit:]]+\\) failures?\\(?:, \\([[:digit:]]+\\) pendings?\\)?$"
(0 '(face nil message nil help-echo nil mouse-face nil) t)
(1 compilation-info-face)
(2 (if (string= "0" (match-string 2))
(3 compilation-info-face t t)))

And here’s a screenshot:


Yeah! Cool! :D

Smart Compile

smart-compile.el is an extension for Emacs to guess the compilation command for different type of files. Customization is simple. Here’s my customization (I use Emacs to edit a lot of files):

(require 'smart-compile)
(setq smart-compile-alist
'(("/programming/guile/.*c$" . "gcc -Wall %f `guile-config link` -o %n")
("\\.c\\'" . "gcc -Wall %f -lm -o %n")
("\\.[Cc]+[Pp]*\\'" . "g++ -Wall %f -lm -o %n")
("\\.java$" . "javac %f")
("_spec\\.rb$" . "spec %f")
("\\.rb$" . "ruby %f")
(emacs-lisp-mode . (emacs-lisp-byte-compile))
(html-mode . (browse-url-of-buffer))
(html-helper-mode . (browse-url-of-buffer))
("\\.skb$" . "skribe %f -o %n.html")
(haskell-mode . "ghc -o %n %f")
(asy-mode . (call-interactively 'asy-compile-view))
(muse-mode . (call-interactively 'muse-project-publish))))
(global-set-key (kbd "") 'smart-compile)

I set the global shortcut to f9. Now just name your spec files with foo_spec.rb (this is the convention). When you are in the buffer, just press f9. It will prompt you the correct command to run your specs.

Wish you enjoy it! :)