EmacsでのRails開発にprojectile-railsを使ってみる。

rinariを使っていたんだけど、こちらはrenderで指定されたビューのパーシャルを自動でたどってくれるみたいなので、試しに使ってみることに。

M-x list-packagesからのインストールで依存パッケージもインストールしてくれるんだけど、他にdash.elも必要みたい。M-x list-packagesで最新のdashをインストールしておく。インストールできたら、初期化ファイルに、

(require 'projectile)
(projectile-global-mode)

(require 'projectile-rails)
(add-hook 'projectile-mode-hook 'projectile-rails-on)

と書くことで、Railsのプロジェクト内のファイルやディレクトリを開いている時に有効にできる。

定評のあるプロジェクト管理ライブラリのprojectileを使っていて、今までrinariで重宝していた機能は殆ど使えるみたいなのでしばらくこちらを使ってみる。

まずはキーバインドをいじるところからです・・。

[追記:2014-03-01]

ちょっと設定をいじってみた。projectile-rails-goto-file-at-pointでファイルをいい感じに推測して開いてくれるのがすごく便利。

;; rirariと同様のキーバインドを使う
(define-key projectile-rails-mode-map (kbd "C-c ; f m") 'projectile-rails-find-current-model)
(define-key projectile-rails-mode-map (kbd "C-c ; f c") 'projectile-rails-find-current-controller)
(define-key projectile-rails-mode-map (kbd "C-c ; f v") 'projectile-rails-find-current-view)
(define-key projectile-rails-mode-map (kbd "C-c ; f s") 'projectile-rails-find-current-spec)
(define-key projectile-rails-mode-map (kbd "C-c ; c") 'projectile-rails-console)

;; evilの`gf`で`projectile-rails-goto-file-at-point`を使うように
(evil-define-key 'normal projectile-rails-mode-map (kbd "gf")
  'projectile-rails-goto-file-at-point)
;; fix above keybind can't be applied til state changes
;; https://bitbucket.org/lyro/evil/issue/301/evil-define-key-for-minor-mode-does-not
(add-hook 'find-file-hook
          #'(lambda ()
              (when projectile-rails-mode
                  (evil-normalize-keymaps))))

;; `app/views/application`と`app/views/shared`のビューも探す候補に入れる
(defun projectile-rails-goto-template-at-point ()
  (interactive)
  (let* ((template (projectile-rails-filename-at-point))
         (dir (projectile-rails-template-dir template))
         (name (projectile-rails-template-name template))
         (format (projectile-rails-template-format template)))
    (if format
        (loop for processor in '("erb" "haml" "slim")
              for template = (s-lex-format "${dir}${name}.${format}.${processor}")
              for partial = (s-lex-format "${dir}_${name}.${format}.${processor}")
              for partial-2 = (expand-file-name
                               (s-lex-format "_${name}.${format}.${processor}")
                               (projectile-expand-root "app/views/application"))
              for partial-3 = (expand-file-name
                               (s-lex-format "_${name}.${format}.${processor}")
                               (projectile-expand-root "app/views/shared"))
              until (or
                     (projectile-rails-ff template)
                     (projectile-rails-ff partial)
                     (projectile-rails-ff partial-2)
                     (projectile-rails-ff partial-3)))
      (message "Could not recognize the template's format")
      (dired dir))))

[修正:2014-03-03]キーバインドを修正しました。fを忘れてた。