block_given?

ジャングル ブロック ナイ アルノハ jump ダケ。CC-BY-SA 3.0

モダンなEmacsを求めて (6) Rubyについて

今回のモダンなEmacsを求めてRubyの開発環境について。

rbenv.el

rbenvへの実行パスを通してくれたりする。

package-install rbenv

で入る。

(require 'rbenv)
(global-rbenv-mode)

rbenvを入れた場所の設定も必要。 brewで入れたのならbrew info rbenvで場所がわかる。 echo $RBENV_ROOTでもよい。

(setq rbenv-installation-dir "/usr/local/var/rbenv")

追加しておく。

electric-pair-mode

{と打つと}"と打つと"のように対応する文字を自動で入力する。 Emacs 24からはデフォルトで入っている。有効にする。

(electric-pair-mode t)

ブロック引数の|も自動で閉じてほしいので次のような設定を追加する

(add-to-list 'electric-pair-pairs '(?| . ?|))

electric-indent-mode

括弧を閉じたときなどいい感じでインデントしてくれる。 確認したところ既に有効になっていた。 特に設定していない。

有効になっているモードの確認方法

以下の式を評価すると確認できる。 とじ括弧のところでC-x eしよう。

(describe-mode)

electric-layout-mode

括弧を入力したときいい感じで改行を挿入してくれる。 ただし、以下のような設定が必要に見えた。 このモードtにしていてelectric-layout-rules設定していない人は何に使っているんだろう。

(add-to-list 'electric-layout-rules '(?{ . after))

ruby-block

endに対応する宣言の位置をハイライトしてくれる。 ハイライトの仕方をruby-block-hilight-toggleで設定できる。

(package-install ruby-block)
(require 'ruby-block)
(setq ruby-block-highlight-toggle t)

ruby-end

doclassdefなどに反応して自動でendを入力する。 package.elで入る。

(package-install ruby-end)
(require 'ruby-end)

inf-ruby

M-x inf-rubyirb/pryが起動。 Pryで使う設定はるびきちさんのブログを参考に設定する

(package-install inf-ruby)
(require 'inf-ruby)
(setq inf-ruby-default-implementation "pry")
(setq inf-ruby-eval-binding "Pry.toplevel_binding")
(add-hook 'inf-ruby-mode-hook 'ansi-color-for-comint-mode-on)
  • リージョンを選択してC-c C-rRubyのコードをpryで実行できる。
  • メソッド定義のendの位置でC-c C-xするとpryでメソッド定義を実行できる。

quickrun

SmartCompileとどっちがいいんだろう。

M-x package-install quickrun

する。helmに出ていて欲しいのでdefault-sourcesに追加しておく。

(custom-set-variables
 '(helm-mini-default-sources '(helm-source-buffers-list
                   helm-source-recentf
                   helm-source-buffer-not-found
                   helm-quickrun-source)))

Ruby以外も実行できるのがよさそう。

タグジャンプ

安定のtmm1さんプロダクト、ripper-tagsを使う。

gem installしたときに生成してくれるgem-ripper-tagsも合わせていれる。

プロジェクト内のファイルはguardを使おうと思う。 ~/.guard.rbを用意しておくとすべてのプロジェクトで勝手に読みこまれる。 詳しくはShared configurations · guard/guard Wikiを読んでほしい。

$ gem install guard guard-shell

これでguardは入った。次のような設定でプロジェクト内のファイルを監視する。

~/.guard.rb:

guard :shell do
  watch(%r{^(?:app|lib)/.+\.rb$}) { `ripper-tags -e -R -f TAGS` }
end

プロジェクトにGuardfileが無いとおこられないように~/.Guardfileも追加しておく。

$ touch ~/.Guardfile

あとは$ guardで起動すれば、自動でTAGSが更新される。

rcodetools

$ gem install rcodetools

どこにrcodetoolsが保存されているのか調べてinit-loaderが読める場所に置く

$ gem which ruby_toggle_file
$ cd /usr/local/var/rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rcodetools-0.8.5.0
$ cp rcodetools.el ~/.emacs.d/inits/01_rcodetools.el

とりあえず便利そうなxmpを呼べるだけの最小限の設定をする。

(require 'rcodetools)
(define-key ruby-mode-map (kbd "C-c x") 'xmp)

もっと便利に使いたくなったらまた検索する。

robe

Dependenciesに書かれているpry/pry-docを入れる。

$ gem install pry pry-doc

packageをいれる

package-install robe

最小限の設定をする

(require 'robe)
(add-hook 'ruby-mode-hook 'robe-mode)

M-x robeまで入れると候補がいくつかでる。 使い方はあとで覚える。 rbenv.elを入れていない場合、rbenvで入れたrubyに入れたpryなどが使えず、エラーが発生する恐れがある。 あとGemfileにpry/pry-docが入っていないときは足しておくこと。

robeの補完を便利に使うためにはhelm-robeもいれる

設定は書かれている通りなのだが

package-install helm-robe

あとは

(require 'helm-robe)
(custom-set-variables '(robe-completing-read-func 'helm-robe-completing-read))

試してみたけどrobeをまず最初に入れるべきだと思った。すごく便利。

C-M-iすると補完が動く。C-M-dで定義が見れる。

まとめ

Emacsは副作用が強い薬みたいなもので、鎮痛剤依存症みたいに処方薬を服用してるつもりが、いつの間にか依存症になったりします。 新しく導入するのは1日1パッケージのみにとどめて30日毎日違うパッケージを服用するとよさそう。 わたしはRubyのためのEmacsの設定を調べるためにRubyを書くのを3日サボった。 用法用量を守って楽しいEmacsライフを。

参考