enh-ruby-mode対応のruby-block.elを作った


今日はEmacsの話をします.

Enhanced-ruby-modeのすすめ


Emacsrubyのコードを書いてみると,結構よくシンタックスハイライトしてくれています.
これはデフォルトで付属するruby-modeによるものです.

しかし,ruby-modeだとインデントに難があるというのが,一番悲しいところです.

ruby-mode のインデントをいい感じにする - willnet.in



これを施してもいいのですが,それでもなお足らない部分があります.



Railsのコードですが,例えば

class SomeModel < ActiveRecord::Base
  has_one :user,
    foreign_key: :account_id,
    class_name: "Account"

こういうインデントを自動で実現したい(というかこれがruby的には正しい)のですが,ruby-modeだと

class SomeModel < ActiveRecord::Base
  has_one :user,
          foreign_key: :account_id,
          class_name: "Account"

となってしまうのです.

これがどうにもハックできなくて…….



というわけで最近はEnhanced-ruby-modeというのを使うようにしています.

zenspider/enhanced-ruby-mode · GitHub




こちらはシンタックスハイライトや,インデントが独自にカスタマイズされており,上記のようなインデントを(特にカスタマイズなく)しっかりと実現してくれます.


そしてruby-modeの代わりとして使えるので,今まで

(add-hook 'ruby-mode-hook '(lambda () (ruby-electric-mode t)))

となっていたところを

(add-hook 'enh-ruby-mode-hook '(lambda () (ruby-electric-mode t)))

と変えてやるだけでOK.


ちなみにenhを使っている時のdeep-indent-paren-styleはちょっとだけ変わっていて,

(setq enh-ruby-deep-indent-paren nil)

としてやる必要があります.ちなみに閉じカッコの位置については,この設定だけでいい位置に来ます.

Enh用のruby-block


大体のものはEnhanced-ruby-modeでも使えるのですが,ruby-blockだけが使えない.
hookをenh-ruby-modeに書き換えても上手くハイライトしてくれません.

これ,実はruby-block.elのソース内で,ruby-modeがrequireされているからなんですね.

adolfosousa/ruby-block.el · GitHub



だからenhanced-ruby-modeを使っているときは当然ながら動かないんですね.


というわけで,enhanced-ruby-mode用にruby-block.elを拡張してみました.


github.com




まぁ実際requireを書き換えてみたら,案外なにもせずに上手く言っちゃったので,上げてみただけなんですけどね.






Emacs使いの方は是非,Enhanced-ruby-modeとセットで使ってみてください.便利ですよ.

参考

qiita.com


d.hatena.ne.jp