emacsのruby環境をセットアップする

Posted by Tatsuyano on Mon, Sep 1, 2014
In
Tags emacs, ruby, rspec

最近caskに切り替えたので、ruby環境も一から作り直したいと思います。 オムニ補完には、今まではRsenseを使っていましたが、今回はrobeというパッケージと使ってみたいと思います。
対象のEmacsのバージョンは24.3.1になります

今回インストールするパッケージ

  • ruby-mode
  • ruby-end
  • ruby-block
  • inf-ruby
  • robe
  • auto-complete
  • rvenv       # 2015/02/23追記
  • smart-newline # 2015/02/23追記
  • rspec-mode   # 2015/02/23追記

ruby-mode,ruby-end,ruby-blockをインストール

まずは基本的なところから。 Emacs24だとruby-electricがうまく動かなかったので、 今回はインストールしませんでしたが、ruby-endだけで事足りました。

~/.emacs/Cask

;; Ruby
(depends-on "ruby-mode")
(depends-on "ruby-end")
(depends-on "ruby-block")

~/.emacs.d/init_loader/03_ruby.el

;; --------------------------------------------------
;; ruby-mode
;; http://shibayu36.hatenablog.com/entry/2013/03/18/192651
;; --------------------------------------------------
(autoload 'ruby-mode "ruby-mode"
  "Mode for editing ruby source files" t)
(add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
(add-to-list 'auto-mode-alist '("Capfile$" . ruby-mode))
(add-to-list 'auto-mode-alist '("Gemfile$" . ruby-mode))
(add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode)) ;; shebangがrubyの場合、ruby-modeを開く

;; ruby-modeのインデントを改良する
(setq ruby-deep-indent-paren-style nil)
(defadvice ruby-indent-line (after unindent-closing-paren activate)
  (let ((column (current-column))
        indent offset)
    (save-excursion
      (back-to-indentation)
      (let ((state (syntax-ppss)))
        (setq offset (- column (current-column)))
        (when (and (eq (char-after) ?\))
                   (not (zerop (car state))))
          (goto-char (cadr state))
          (setq indent (current-indentation)))))
    (when indent
      (indent-line-to indent)
      (when (> offset 0) (forward-char offset)))))

;; --------------------------------------------------
;; ruby-end
;; endや括弧などを自動挿入する
;; http://blog.livedoor.jp/ooboofo3/archives/53748087.html
;; --------------------------------------------------
(require 'ruby-end)
(add-hook 'ruby-mode-hook
  '(lambda ()
    (abbrev-mode 1)
    (electric-pair-mode t)
    (electric-indent-mode t)
    (electric-layout-mode t)))

;; --------------------------------------------------
;; ruby-block
;; endにカーソルを合わせると、そのendに対応する行をハイライトする
;; --------------------------------------------------
(require 'ruby-block)
(ruby-block-mode t)
(setq ruby-block-highlight-toggle t)

auto-completeのインストール

caskでインストールすると、辞書が格納されるディレクトリ(dict)のパスが ~/.emacs.d/.cask/24.3.1/elpa/auto-complete-20140824.1658/dict"になりました。

~/.emacs/Cask

;; Auto-complete
(depends-on "auto-complete")
(depends-on "fuzzy")
(depends-on "popup")

~/.emacs.d/init_loader/02_auto-complete.el

(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/.cask/24.3.1/elpa/auto-complete-20140824.1658/dict")
(ac-config-default)
(setq ac-use-menu-map t)

robeのインストール

ここからが本題のrobeのインストールです。 robeを使うには、pryというGemが必要になりますが、 pryを使うためには、read-lineライブラリをインストール時にオプション指定したRubyが必要になります。

今回すでに、read-lineが入っていない状態でRubyをインストールしていたので、 再度インストールし直したいと思います。

pryのインストール

$ gem install pry
$ source $HOME/.zshrc

$ which pry
$HOME/.anyenv/envs/rbenv/shims/pry

read-lineライブラリを読み込めないため、pryが実行できない

 $ pry
 Sorry, you can't use Pry without Readline or a compatible library.
 Possible solutions:
  * Rebuild Ruby with Readline support using `--with-readline`
  * Use the rb-readline gem, which is a pure-Ruby port of Readline
  * Use the pry-coolline gem, a pure-ruby alternative to Readline

readlineのインストールとRubyの再インストール

$ sudo yum -y install readline-devel
$ rbenv uninstall 2.1.0
$ rbenv install 2.1.0

注意
Ruby本体の再インストールをしたため、prybundleなども削除されていますので、 再度インストールしてください。

$ gem install pry pry-doc bundler
$ source $HOME/.zshrc

emacsの設定

robeは内部でinf-rubyを使っているので、robeをインストールすると、 inf-rubyも自動でインストールされます。

~/.emacs/Cask

(depends-on "robe")

~/.emacs.d/init_loader/03_ruby.el

;; --------------------------------------------------
;; robe
;; http://codeout.hatenablog.com/entry/2014/02/04/210237
;; --------------------------------------------------
(add-hook 'ruby-mode-hook 'robe-mode)
(autoload 'robe-mode "robe" "Code navigation, documentation lookup and completion for Ruby" t nil)
(autoload 'ac-robe-setup "ac-robe" "auto-complete robe" nil nil)
(add-hook 'robe-mode-hook 'ac-robe-setup)

robeの起動方法

robeを利用するには、

  1. M-x inf-rubyを実行し、裏でirb(pry)を起動させ、
  2. M-x robe-startで初めてrobeが使えるようになります。

Gemfileを用意してirb(pry)を裏で自動に起動させる

編集したいファイルと同じディレクトリにpryのためのGemfileを用意しておけば、 M-x robe-startだけでrobeをつかうことができます。

$ bundle init

Gemfile

source "https://rubygems.org"

gem "pry"
gem "pry-doc",       ">= 0.6.0"
gem "method_source", ">= 0.8.2"

rbenvのパスを通す

2015/02/23 追記

Emacsにrbenvのパスを通してくれます。

~/.emacs.d/initloader/03_ruby.el

 (require ‘rbenv)
 (global-rbenv-mode)
 (setq rbenv-installation-dir “~/.anyenv/envs/rbenv”)

smart-newlineを導入する

2015/02/23 追記

改行をよしなにやってくれます。素敵です。

~/.emacs.d/initloader/03_ruby.el

 (add-hook ‘ruby-mode-hook
   (lambda ()
   (smart-newline-mode t)))

rspec-modeを導入する

2015/02/23 追記

テストとその対象のコードを簡単に切り替えてくれたり、カーソルのある行だけのテストを実行してくれる。 キーバインドにカンマが入っていることに注意。

~/.emacs.d/initloader/03ruby.el

 ;; C-c , v RSpec実行
 ;; C-c , s カ-ソルが当たっているサンプルを実行
 ;; C-c , t Specとソースを切り替える
 (require ‘rspec-mode)
 (custom-set-variables ‘(rspec-use-rake-flag nil))

お疲れ様でした。

参考サイト

関連する記事