Rubyに関するEmacsの設定を晒してみる

こんばんは。
ブログを自鯖でうごかそうと思っていたらずるずるの更新できない状態のだったのですが、EmacsでのRubyの設定を整理したので晒します。
できる限りに丁寧にかくつもり。
Railsに関連する設定は別記事することにしましたのですこしけずりました。

前提条件

  • gitが導入済
  • auto-installが導入済

本記事で導入するもの

gitからcloneしたものに関して

本記事の例では

~/.emacs.d/from_git

に配置していることを前提にします。

ELPAからのインストール

ELPAのインストール

以下を評価
(scratchバッファなどにコピーして閉括弧の後ろにカーソルを移動してC-xC-eなど)

(install-elisp "http://tromey.com/elpa/package-install.el")

以下のコマンドを実行でELPAを起動できます。

M-x package-list-packages

ruby開発に関連するファイルは以下のとおり。
必要なものの行で i を入力でインストール候補を選択。
x を入力するとインストールを開始します。

ruby-mode
inf-ruby
ruby-electric
ruby-compilation
rspec-mode
rvm
yari

ruby-mode

ruby用のメジャーモードです

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

Rakefileは自動ruby-modeに入らないのでその設定をしています。

inf-ruby

emacsからirbを使うためのelispです。
ruby-modeで C-cC-sで起動することができます。

ruby-elecrtric

ifなどを入力した際にendを補完してくれるelsipです。

(defun ruby-mode-hook-ruby-elecrtric ()
  (ruby-electric-mode t))
(add-hook 'ruby-mode-hook 'ruby-mode-hook-ruby-elecrtric)
flymake

個人的にはRubyを書いてる際にはflymakeは必要ではないと思いますが、
一応設定を書いておきます。

(require 'flymake)

(defun flymake-ruby-init ()
  (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
         (local-file  (file-relative-name
                       temp-file
                       (file-name-directory buffer-file-name))))
    (list "ruby" (list "-c" local-file))))
(push '(".+\\.rb$" flymake-ruby-init) flymake-allowed-file-name-masks)
(push '("Rakefile$" flymake-ruby-init) flymake-allowed-file-name-masks)
(push '("^\\(.*\\):\\([0-9]+\\): \\(.*\\)$" 1 2 nil 3) flymake-err-line-patterns)

(defun ruby-mode-hook-flymake-init ()
 "Don't want flymake mode for ruby regions in rhtml files and also on read only files"
  (if (and (not (null buffer-file-name))
           (file-writable-p buffer-file-name))
      (flymake-mode-on)))
(add-hook 'ruby-mode-hook 'ruby-mode-hook-flymake-init)
ruby-compilation

emacsから実行結果を取得できます。rakeのpcompleteもついてきます。
あまり使いどころはないですが、標準出力を確認することに関してはxmpfilterより使いやすいです。(C-x t)

rspec-mode

対応するrspecファイルへ移動したり、実行することができます。
mode-compile.elに依存しています。

;; (install-elisp "http://perso.tls.cena.fr/boubaker/distrib/mode-compile.el")
(autoload 'mode-compile "mode-compile"
  "Command to compile current buffer file based on the major mode" t)
;; (global-set-key "\C-cc" 'mode-compile)
(autoload 'mode-compile-kill "mode-compile"
  "Command to kill a compilation launched by `mode-compile'" t)
;; (global-set-key "\C-ck" 'mode-compile-kill)
rvm.el

emacsからrvmを利用するelispです。すごく便利です。
M-x rvm-use を使用すると利用するrubyを変更できます。

(defadvice ido-completing-read (around invaild-ido-completing-read activate)
  "ido-completing-read -> completing-read"
  (complete-read))
(rvm-use-default)

anythingを使用しているとidoの補完機能が邪魔してうまくうごいてくれないので、これをごまかすコードと
rvmでデファルトに設定しているrubyをあらかじめ変更する設定をしています。
記述しない場合はシステムのRubyが使われる場合があります。(環境変数次第だと思います)

yari

yet anther ri modeです。emacsからriをひくelispです。
速度面で難がありますがri-emacsより設定が楽です。
anything.elに対応しています。一覧取得が遅いのでキャッシュさせたいですね。

ELPAを使わないもののinstall

githubなどgitを使ってダウンロードする場所の準備

~/.emacs.d/from_git にダウンロードすると仮定します。

EMACS_FROM_GIT="~/.emacs.d/from_git"
mkdir -p $EMACS_FROM_GIT
rubydb

ruby-debug gemと連携するelisp
M-x rubydb で実行します。 ソースコードにもどり C-x SPC でブレークポイントを指定できたり C-cC-s でステップイン

(install-elisp "http://svn.ruby-lang.org/repos/ruby/trunk/misc/rubydb3x.el")
(autoload 'rubydb "rubydb3x" "Run rubydb on program FILE in buffer *gud-FILE*.
The directory containing FILE becomes the initial working directory
and source-file directory for your debugger.")
ruby-block

マッチするブロックをハイライトする
以下を評価

(install-elisp-from-emacswiki "ruby-block.el")
(require 'ruby-block)
(setq ruby-block-highlight-toggle t)
(defun ruby-mode-hook-ruby-block()
  (ruby-block-mode t))
(add-hook 'ruby-mode-hook 'ruby-mode-hook-ruby-block)
RSense
  • auto-complete

http://cx4a.org/software/auto-complete/index.ja.html
なくてもよいのですが、あるほうがよいのでいれます。
補完候補をpopup表示するelispです。

cd $EMACS_FROM_GIT
git clone git://github.com/m2ym/auto-complete.git
# release versionを利用したい場合
git checkout v1.3
(require 'auto-complete)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/dict")
(require 'auto-complete-config)
(ac-config-default)

auto-completeはかなり趣味の問題なので細かい設定は マニュアルを。
個人的にはac-source-words-in-same-mode-buffersがお気に入りです。

  • RSense

http://cx4a.org/software/rsense/index.ja.html
RSenseは単純にelisp以外のもの多いのでマニュアルに従い
~/opt にインストールしています。

mkdir ~/opt
cd ~/opt
git clone git://github.com/m2ym/rsense.git
git checkout v0.3

マニュアルがとても丁寧にかかれているのでそちらを参照すること。
http://cx4a.org/software/rsense/manual.ja.html
るりまは ~/opt/ruremaに配置していますが、そのままだと文字化けしてしまったので、
~/opt/rurema/refe_1_8_7を以下のようにしています。

#!/bin/sh
cd "`dirname "$0"`"
exec ruby -Ke -I bitclust/lib bitclust/bin/refe.rb -e utf-8 -d db-1_8_7 "$@"

変更点は -e utf8 を追加しているだけです。

(setq rsense-home (expand-file-name "~/opt/rsense/"))
(setq rsense-rurema-home "~/opt/rurema")
(add-to-list 'load-path (concat rsense-home "/etc"))
(require 'rsense)
(define-key ruby-mode-map "\C-c\C-i" 'ac-complete-rsense)
(define-key ruby-mode-map "\C-ct" 'rsense-type-help)
(define-key ruby-mode-map "\C-cj" 'rsense-jump-to-definition)

直にac-sourcesに追加してしまうと重かったのでC-cC-iに割り当ててつかっています。
キーバインドに関しては各々の趣味に合わせてください。
auto-completeの細かい設定については省いています。

ri-emacs

https://github.com/pedz/ri-emacs
emacsからriをひくのにはyariでもできますが、rcodetoolsの補完の機能がこれを使用します。機能が少々同じでもいろいろいれておくのが個人的なポリシーです。

cd $EMACS_FROM_GIT
git clone https://github.com/pedz/ri-emacs
(setq ri-ruby-script
      (expand-file-name "~/.emacs.d/from_git/ri-emacs/ri-emacs.rb"))
(autoload 'ri "ri-ruby.el" "Execute `ri'." t)
rcodetools

xmpfilterが一番有名ですが、Rubyのコードを扱うツール群です。
rct-completeなど補完機能もあります。

gem install rcodetools

elispファイルはgemの中についてくるのでload-pathがとおったところにおく必要があります。gem env などでインストール先を探してload-pathをとおしてるところにコピーしましょう。たどるのがめんどくさい場合は gem unpack rcodetools するとカレントディレクトリに展開できます。

(require 'rcodetools)
(require 'anything-rcodetools)
(define-key ruby-mode-map "\C-cl" 'rct-complete-symbol)
(define-key ruby-mode-map "\C-cx" 'xmpfilter)

fastriを利用したほうがよいのですが、1.9には対応してなかったように思うので設定していません。

おまけ

個人的には以下のような

# -*- coding: utf-8 -*-

エンコーディングの指定が自動で挿入されると困ることがあるので、これは停止させています。変りに C-ceで 挿入できるようにしています。

(defun ruby-mode-hook-init ()
  "encodingを自動挿入しないようにする"
  (remove-hook 'before-save-hook 'ruby-mode-set-encoding))
(add-hook 'ruby-mode-hook 'ruby-mode-init)

(defun my-ruby-mode-set-encoding ()
  "set-encoding ruby-mode"
  (interactive)
  (ruby-mode-set-encoding))
(define-key ruby-mode-map "\C-ce" 'my-ruby-mode-set-encoding)


結局あまり丁寧にかけてないように思いますが、参考になれば。