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で管理できます。