EmacsでのRails開発にrinariを使い始めた

emacs-railsを捨てて,rinariを使い始めた.
理由はコードネームにnariが入っていて,好感をもったから.

emacs-railsのココが好き

  • flymakeが使える
  • riが引ける
  • rdocが引ける
  • emacs上でテストが実行できる
  • TAGが作れる

emacs-railsのココが嫌い

  • デカイ
  • 読み込むだけでruby-modeを汚染する
  • メソッド単位のテストができない
  • もはや開発者にやる気がない

そこでrinariの登場

  • メソッド単位のテストができる
  • 検索が賢い
  • flymakeは自分で設定すればいける
  • 開発者にやる気がありそう
  • もしやる気をなくしても,githubで開発されているので誰かが簡単に引き継いでくれそう

素晴らしい紹介があるので,あとはこちらで.
emacsとRinariで快適Rails開発! - おもしろwebサービス開発日記

設定など

;; C-c ' がprefixキー
(setq rinari-minor-mode-prefixes (list "'"))
(require 'rinari)

;;; rhtml-mode
(require 'rhtml-mode)
(add-hook 'rhtml-mode-hook
    (lambda () (rinari-launch)))

ido-modeもやるといいよーと公式サイトには書いてあるが,そんな変な物はいれません.

.rhtmlにしか対応してねーじゃねーか

お約束なのでgrepして修正しましょう.
3箇所くらいしかないよ.
 

追記

okkezさんからの指摘で
eschulte/rhtml · GitHub
だと対応してるよーとの事でした.

flymakeの設定

gan2さんの日記を参考にした.
ruby-mode の flymake の設定をした - gan2 の Ruby 勉強日記
 

riを引けるようにしたり,TAGを生成したり

emacs-railsのコードを参考に

;; rinari-extend-by-emacs-rails.el
(defvar rails-ri-command "fri"
  "ri command"
)

(defvar rails-tags-dirs '("app" "lib" "test" "db" "vendor")
  "make tag target directories"
)

(defvar rails-tags-command "etags %s"
  "make tag target directories"
)

;; helper functions/macros
(defun rails-search-doc-at-point (&optional item)
  (interactive)
  (setq item (if item item (thing-at-point 'sexp)))
  (rails-search-ri item)
)

(defun rails-search-doc (&optional item)
  (interactive)
  (setq item (read-string "Search symbol: " (if item item (thing-at-point 'sexp))))
  (rails-search-ri item)
)

(defun rails-search-doc-for-ri (&optional item)
  (interactive)
  (setq item (thing-at-point 'filename))
  (setq item (if (string-match "," item)
                 (replace-match "" nil nil item)))
  (rails-search-doc item)
)

(defun rails-search-ri (&optional item)
  (if item
      (let ((buf (buffer-name)))
        (unless (string= buf "*ri*")
          (switch-to-buffer-other-window "*ri*"))
        (setq buffer-read-only nil)
        (kill-region (point-min) (point-max))
        (message (concat "Please wait..."))
        (call-process rails-ri-command nil "*ri*" t item)
        (local-set-key [f1] 'rails-search-doc)
        (local-set-key [return] 'rails-search-doc-for-ri)
        (ansi-color-apply-on-region (point-min) (point-max))
        (setq buffer-read-only t)
        (goto-char (point-min)))))

(defun rails-create-tags()
  "Create tags file"
  (interactive)
   (message "Creating TAGS, please wait...")
   (let ((tags-file-name (concat (rinari-root) "TAGS")))
     (shell-command
      (format rails-tags-command tags-file-name
        (mapconcat (function (lambda (s) (concat (rinari-root) "" s)))
                   rails-tags-dirs " ")))
     (visit-tags-table tags-file-name)))

(provide 'rinari-extend-by-emacs-rails)
;; .emacs
(setq rails-tags-dirs '("app" "lib" "test" "db" "vendor"))
(require 'rinari-extend-by-emacs-rails)
(defun ruby-mode-hooks-rinari-extend ()
  (define-key ruby-mode-map (kbd "<C-f1>") 'rails-search-doc)
  (define-key ruby-mode-map [f1] 'rails-search-doc-at-point)
)
(defun rinari-mode-hooks-rinari-extend ()
  (define-key rinari-minor-mode-map "\C-c\C-t" 'rails-create-tags)
)
(add-hook 'ruby-mode-hook 'ruby-mode-hooks-rinari-extend)
(add-hook 'rinari-mode-hook 'rinari-mode-hooks-rinari-extend)

riを引くのは割と便利で気に入ったのでruby-modeでも使うようにしている.