emacsでのrubyの環境構築系の記事は沢山あるが、自身の備忘としてまとめておく。
導入したもの
・ruby-block:endに対するdoやwhileなどをハイライト
・ruby-electric:do endなどの自動補完
・robe:ruby-mode用オムニ補完ツール
・company:コード補完用パッケージ
・pry:rubyインタプリタ
ruby-blockの設定
endにフォーカスしたらすぐにdoをハイライトしたいのでdelayを0にした。
; ruby-block-delay を0.50 → 0に設定
(defcustom ruby-block-delay 0
"*Time in seconds to delay before showing a matching paren."
:type 'number
:group 'ruby-block)
ruby-block-delay 0
導入に関する手順などは他に充実しているサイトが沢山あるため割愛。ただ自身の環境で試したところ、すんなりいかなかったところがあったため、ハマりどころをまとめておく。
【参考】
auto-complete + rsense の代わりに auto-complete + robe をつかう
ハマったところ
すんなり設定できなかったところを中心にまとめていく。
emacsにrubyのパスを通す
rubyのバージョンをrbenvで管理しているため、emacsにパスを明示的に通してあげないといけない。
;; rbenvパス設定
(setenv "PATH" (concat (expand-file-name "/usr/local/var/rbenv/shims/ruby") (getenv "PATH")))
(require 'rbenv)
(setq rbenv-installation-dir "/usr/local/var/rbenv")
【暫定対応】M-x inf-rubyで呼び出されるirb(pry)の設定について
rubyのオムニ補完を有効化するには
M-x inf-ruby
M-x robe-start
をする必要があるが、このときinf-rubyで起動されるirbが認識しているrubyのバージョンが古いままだった。
irbが認識しているrubyのバージョンは次のように確認する。
irb(main):001:0> RUBY_VERSION
=> "2.0.0"
rbenvで管理しているアクティブなrubyを認識させたかったのだが、これに手こずった。
というか結局パスの通し方がよくわからず、ゴリ押しで設定した。
【分かったことと対応】
・デフォルトでM-x inf-rubyで呼ばれているirbは/usr/bin/irb
であり、これはデフォルトで導入されている古いバージョンのものである。
・色々調べたが、どのようにすればinf-rubyで呼び出されるirbの向け先を変更できるかが分からなかった。
・仕方がないので、/usr/bin/irb
を退避させ、irb -> /usr/local/var/rbenv/shims/pry
とシンボリックリンクを貼って強制的に読ませた。
init.el設定
;; rbenvパス設定
(setenv "PATH" (concat (expand-file-name "/usr/local/var/rbenv/shims/ruby") (getenv "PATH")))
(require 'rbenv)
(setq rbenv-installation-dir "/usr/local/var/rbenv")
;; do endなどの補完
(require 'ruby-electric)
(add-hook 'ruby-mode-hook '(lambda ()
(ruby-electric-mode t)))
(setq ruby-electric-expand-delimiters-list nil)
;; 補完機能
;; robe-modeの有効化とcompanyとの連携
(add-hook 'ruby-mode-hook 'robe-mode)
(autoload 'robe-mode "robe" "Code navigation, documentation lookup and completion for Ruby" t nil)
(eval-after-load 'company
'(push 'company-robe company-backends))
(add-hook 'ruby-mode-hook (lambda()
(company-mode)
(setq company-auto-expand t)
(setq company-transformers '(company-sort-by-backend-importance)) ;; ソート順
(setq company-idle-delay 0) ; 遅延なしにすぐ表示
(setq company-minimum-prefix-length 1) ; 何文字打つと補完動作を行うか設定
(setq company-selection-wrap-around t) ; 候補の最後の次は先頭に戻る
(setq completion-ignore-case t)
(setq company-dabbrev-downcase nil)
(global-set-key (kbd "C-M-i") 'company-complete)
;; C-n, C-pで補完候補を次/前の候補を選択
(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-active-map (kbd "C-s") 'company-filter-candidates) ;; C-sで絞り込む
(define-key company-active-map [tab] 'company-complete-selection) ;; TABで候補を設定
(define-key emacs-lisp-mode-map (kbd "C-M-i") 'company-complete) ;; 各種メジャーモードでも C-M-iで company-modeの補完を使う
))