EmacsでRuby on Railsを快適に書きたい

とりあえず一発でいけるruby-elispだけ

$ sudo apt-get install ruby-elisp

rails.el他はまた今度いれよう。

$ wget http://rubyforge.org/frs/download.php/20976/emacs-rails-0.5.99.5.tar.gz
$ tar xvfz emacs-rails-0.5.99.5.tar.gz
$ cd emacs-rails
$ cp *.el ~/elisp

$ cd ~/elisp
$ wget http://www.emacswiki.org/cgi-bin/emacs/download/ruby-block.el

$ wget http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt -O find-recursive.el

$ wget http://www.kazmier.com/computer/snippet.el

追記:Emacs-rails

$ svn co http://emacs-rails.rubyforge.org/svn/trunk/ emacs-rails-trunk

svnから持ってきたほうが色々新しいかもしれん(詳細未確認)

.emacsに追加

;; ~/elisp をライブラリパスに追加
(setq load-path
(append
(list
(expand-file-name “~/elisp/”)
)
load-path))

;; ruby-mode
(autoload ‘ruby-mode “ruby-mode”
“Mode for editing ruby source files” t)
(setq auto-mode-alist
(append((”\\.rb$” . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append((”ruby” . ruby-mode))
interpreter-mode-alist))
(autoload ‘run-ruby “inf-ruby”
“Run an inferior Ruby process”)
(autoload ‘inf-ruby-keys “inf-ruby”
“Set local key defs for inf-ruby in ruby-mode”)
(add-hook ‘ruby-mode-hook
‘(lambda () (inf-ruby-keys)))

;; ruby-electric
(require ‘ruby-electric)
(add-hook ‘ruby-mode-hook ‘(lambda () (ruby-electric-mode t)))

;; rubydb
(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.” t)

;; rails
(defun try-complete-abbrev (old)
(if (expand-abbrev) t nil))
(setq hippie-expand-try-functions-list
‘(try-complete-abbrev
try-complete-file-name
try-expand-dabbrev))
(setq rails-use-mongrel t)
(require ‘cl)
(require ‘rails)

;; ruby-block
(require ‘ruby-block)
(ruby-block-mode t)

(setq ruby-block-highlight-toggle t)

Rails2.0からViewTemplateの拡張子がrhtmlからhtml.erbがデフォになってるので、ファイルをうまく認識しない。
rails.el のL149に”html.erb”を追加
(defvar rails-templates-list ‘(”html.erb” “erb” “rhtml” “rxml” “rjs” “haml” “liquid”))

・↑と思ったらEmacs-railsのTrunkでは修正済み

・ターミナルからだとSnippetsが効かない(-nwオプションをつけたり、Puttyからのとき)

M-x abbrevs-mode

で効くようになるけど、自動的にならない←いまここ

さらに追記

.emacs

Ruby-ModeとHTML-modeにAddrev-modeをHookさせる?

(add-hook ‘ruby-mode-hook
(function (lambda ()
(abbrev-mode))))

(add-hook ‘html-mode-hook
(function (lambda ()
(abbrev-mode))))

これだけだと、単体のRubyスクリプトでは有効になるけども、RoRモードでは無効化される。

rail.elの

(define-minor-mode rails-minor-mode
“RubyOnRails”
nil
” RoR”
rails-minor-mode-map
;;(abbrev-mode -1)
(make-local-variable ‘tags-file-name)
(make-local-variable ‘rails-primary-switch-func)

(addrev mode -1)をコメントアウト

結果、RubyとHTMLのときに自動でAddrev-modeが開始される

スペースで静的補完発動(ex Rubyのときrqスペース→require “”、Railsのとき rtスペース render :text = “”、view→%スペース→<% -%>)

GTK版のemacs(上記設定をしなくてもTabで補完発動)と同じように・・・ではないけどもとりあえずOKな感じで。

さらに追記:

スペースキーがトリガになっていると、意図しないところで補完が発生してイライラがとまりません。空気読めなさすぎ。

それと動的補完(dabbrev)はM-/でキーが違う。僕が望んでいたのはタブを押せば、静的動的両方補完してくれる状態。

デフォルトではC-x a ’ がabbrev M-/がdabbrevなんだけど、上にコピペした.emacsの;;Railsのところにhippie-expandなんとかって設定があって、そこで補完方法のリストを作成しているらしい。

で、これに対してキーを設定すればいいらしくて

(global-set-key “\C-o” ‘hippie-expand)

でAbbrev-modeを開始しなくてもいつでも静的な補完と動的な補完が可能になった。

C-oは好きなキーを指定できるので、Tabを指定したいのだけども、
ruby-mode.elのRuby-indent-commandと競合しているせいか使えない。

C-oもわりといい位置にあるので、しばらくそれで使ってみようと思います。

参考:

http://d.hatena.ne.jp/yuko1658/20071213/1197517201
http://d.hatena.ne.jp/higepon/20061222/1166774270
http://www.aise.ics.saitama-u.ac.jp/~gotoh/RoRonandLinux.html
http://w.koshigoe.jp/study/?[Ruby]+emacs-ruby#l0
http://d.hatena.ne.jp/gan2/20080630/1214838780