今日はEmacsの話をします.
Enhanced-ruby-modeのすすめ
Emacsでrubyのコードを書いてみると,結構よくシンタックスハイライトしてくれています.
これはデフォルトで付属する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を拡張してみました.
まぁ実際requireを書き換えてみたら,案外なにもせずに上手く言っちゃったので,上げてみただけなんですけどね.