LGTM

Looks Good To Me

auto-complete + rsense の代わりに auto-complete + robe をつかう

ながらく emacs 上での auto complete に Auto-Complete + RSense を使っていました. べんりでしたが, もうメンテされていないようで代替を探していました.

試しに Robe を RSense の代わりに使ってみようと思います.

  • 2014/07/06 追記: robe パッケージ内のファイル名変更など最新版に対応

そもそも, なんでAuto-Complete + Robe ?

RSense のよくないところ

  • >= ruby 1.9 に未対応
    • 同じファイルに, 新たに導入された記法 ({key: 1} など) があったら動作しない
  • ruby を書いているときに java が起動する違和感

Robe って?

  • 随時, ファイルや書きかけているコンテキストを読んでメソッド名などを絞り込む
    • inf-ruby プロセスと通信して, irb 上で処理しているっぽい
  • Auto-Complete や company-mode などの backend としてつかう
  • inf-ruby なので, 環境に応じた ruby バージョン用の補完候補が出る
  • emacs + ruby だけで事足りる

Auto-Complete vs. company-mode

Auto-Complete を使い続ける強い理由はありませんが, パフォーマンスに満足しているし, インターフェイスに慣れているからですかね.

比較できるほど company-mode を使ってないんですけどね.

比較記事はあまりないかもしれません.

Install

(Emacs24.3)

MELPA を使う

さくっとインストールしたいひとは MELPA つかいましょう.

あまり ELPA を好んで使わないので, 僕は必要になった時点で 以下を eval-region することが多いです.

(require 'package)
(add-to-list 'package-archives
  '("melpa" . "http://melpa.milkbox.net/packages/") t)

その後 M-x package-refresh-contents します.

Auto-Complete, Robe

emacs の mini buffer で

M-x package-install
Install package: auto-complete

で完了. 簡単ですね. Robe も同様にインストールします.

Manual Install

load-path に入れた ~/.emacs.d/site-lisp や, ~/.emacs.d/etc 全体を git で管理している都合で 普段はなるべく手動インストールしています.

Auto-Complete
curl -O http://cx4a.org/pub/auto-complete/auto-complete-1.3.1.tar.bz2
tar jxvf auto-complete-1.3.1.tar.bz2

mkdir ~/.emacs.d/{site-lisp,etc}/auto-complete

cp auto-complete-1.3.1/*.el ~/.emacs.d/site-lisp/auto-complete/
cp auto-complete-1.3.1/dict/* ~/.emacs.d/etc/auto-complete/
inf-ruby

ruby-2.1.0 に含まれるinf-ruby.el (Revision 1.7) だとRobe が動作しないため, 最新版をインストールします.

curl https://raw.github.com/nonsequitur/inf-ruby/master/inf-ruby.el > ~/.emacs.d/site-lisp/inf-ruby.el
Robe
git clone https://github.com/dgutov/robe.git

mkdir ~/.emacs.d/site-lisp/robe

cp -r robe/{*robe.el,lib} ~/.emacs.d/site-lisp/robe
pry

pry も必要なので

gem install pry
.emacs

設定はこんな感じです.

(autoload 'ruby-mode "ruby-mode" "Mode for editing ruby source files" t)
(add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
(add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode))
(add-hook 'ruby-mode-hook '(lambda ()
                             (require 'rcodetools)
                             (require 'anything-rcodetools)
                             (require 'myrurema)
                             (load-auto-complete)  # 追加
                             (define-key ruby-mode-map "\M-c" 'rct-complete-symbol)
                             (define-key ruby-mode-map "\M-d" 'xmp)
                             (setq ruby-deep-indent-paren-style nil)))

; auto-complete
(defun load-auto-complete ()
  (require 'auto-complete-config)
  (ac-config-default)

  (add-to-list 'ac-dictionary-directories "~/.emacs.d/etc/auto-complete")

  (setq ac-use-menu-map t)
  (define-key ac-menu-map "\C-n" 'ac-next)
  (define-key ac-menu-map "\C-p" 'ac-previous)

  (setq ac-auto-show-menu 0.5)
  (setq ac-menu-height 20)

  (robe-mode))

; robe
(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)

使い方

  • ターミナルでも動作します
  • 拡張子 .rb のファイルを開くと, robe-mode に入ります

カレントディレクトリに Gemfile があれば

M-x robe-start

で補完できるようになります.

f:id:codeout:20140207142250p:plain

inf-ruby が起動していないときは

No Ruby console running. Launch automatically?(yes or no)

と聞かれ, ‘yes’ と答えることで自動的に起動します.

注意: pry が必要 なので Gemfile に

gem 'pry'

と書いておいてください.

Gemfile がないときは

M-x robe-start

の前に

M-x inf-ruby

ruby console を起動しておく必要があります.