LoginSignup
9
11

More than 5 years have passed since last update.

emacsでrubyを快適に書くためにしたこと

Posted at

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.el
; 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.elc
ruby-block-delay 0

導入に関する手順などは他に充実しているサイトが沢山あるため割愛。ただ自身の環境で試したところ、すんなりいかなかったところがあったため、ハマりどころをまとめておく。

【参考】
auto-complete + rsense の代わりに auto-complete + robe をつかう

ハマったところ

すんなり設定できなかったところを中心にまとめていく。

emacsにrubyのパスを通す

rubyのバージョンをrbenvで管理しているため、emacsにパスを明示的に通してあげないといけない。

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")

【暫定対応】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設定

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の補完を使う
      ))
9
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11