Emacs24 で ruby-electric的なruby-modeを実現するには

ruby-electric-mode

私はrubyを編集する時に、ruby-electric-modeを併用していました。ruby-electricは括弧を補ってくれたり、if や while の end を自動的に入力してくれたりするマイナーモードです。とても便利で手放せないモードの一つです。

Emacs24での問題

Emacs24でruby-electricを使う場合、私の場合、二つの問題に遭遇しました。

ひとつ目は、ruby-electric.elではobsoleteな関数を用いているためにEmacs24 では ruby-electricがうまく動かない時があります。それは ruby-electric.el中で last-command-charを使っている箇所です。last-command-char は obsolete となっています。

(追記 2012/07/29: 上記は不正確でした。 24.1では動くようです。Emacs-snapshot 24.1.50の subr.elから (define-obsolete-variable-alias ‘last-command-char ‘last-command-event “at least 19.34”) が削除されているためエラーになります。 )

もう一つは、ruby-electric.elで参照している関数(ruby-insert-end)が、Emacs24 に標準で含まれている ruby-mode (versionは1.0) 中に無いために(削除されたのでしょうか?)、動かない機能があることです。

Emacs24でruby-electric的なruby-modeを実現するには

last-command-charは last-command-eventに書き換えれば動きます。また、ruby-insert-endも自前で入れると可能です(例えば stackoverflow での workaround 例 )。

そういった方法で対処可能ではあるのですが、Emacs24では新機能としてelectric-pair-mode などがあるので、今回はそちらを利用してみます。

まず、括弧の補完はEmacs24にbuilt-inの機能(electric-pair-mode)を使います。ついでに他の新機能である electric-indet-mode, electric-layout-modeも利用します(Emacs24の新しいmodeについてはA Peek at Emacs 24 の New modesのところにあります。)。

一方の、endの補完は ruby-end.el を使います。

これらをruby-modeで使うために、今までの設定に以下を加えました:

(require 'ruby-end)
(add-hook 'ruby-mode-hook
  '(lambda ()
    (abbrev-mode 1)
    (electric-pair-mode t)
    (electric-indent-mode t)
    (electric-layout-mode t)))

ruby-electricはロードしないようにしました。

おわりに

Emacs24の ruby-mode (version 1.0)は、少なくとも私の環境では、 font-lockに不具合があるようですが、 ELPA で入る1.1では直っているようです(1.0の不具合は私だけかも知れません)。

ruby-endもELPAで管理できます。

Adsense広告