最近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本体の再インストールをしたため、pry
やbundle
なども削除されていますので、
再度インストールしてください。
$ 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
を利用するには、
M-x inf-ruby
を実行し、裏でirb(pry)
を起動させ、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))
お疲れ様でした。
参考サイト
- emacsのruby環境を整えています
- Emacs24 で ruby-electric的なruby-modeを実現するには
- auto-complete + rsense の代わりに auto-complete + robe をつかう
- Pry起動時にエラーが出る場合の対処法
- Rubyistよ、irbを捨ててPryを使おう
- robe:Dependencies