0. はじめに
ここは Carbon Emacs 関連のメモページである。
1. 使用環境
OS | Mac OS X 10.4.11 |
emacs | GNU Emacs 22.2.1 (2008年春版) |
APEL | 10.7 |
2. ruby-mode と日本語
2.1 エラーメッセージ
ruby-mode で日本語を含むスクリプトを保存しようとすると以下のエラーが出る。
2.2 エラー発生箇所
エラーを辿っていくと、ruby-mode.el 内の ruby-mode-set-encoding() で
上記の関数を使って変数を定義しようとして未定義のエラーを吐く事が分かる。
これが before-save-hook に設定されているので保存時にエラーになる。
(defun ruby-mode-set-encoding () (save-excursion (widen) (goto-char (point-min)) (when (re-search-forward "[^\0-\177]" nil t) (goto-char (point-min)) (let ((coding-system (coding-system-to-mime-charset (or coding-system-for-write buffer-file-coding-system)))) 以下略 |
2.3 原因
coding-system-to-mime-charset() は APEL の mcs-e20.el で定義されていたのだが
バージョンが 10.6 から 10.7 になった時に無くなってしまったようだ。
代替手段があるかどうかは調べていないので不明。
eval-when-compile で以下のような対策は施されているので byte-compile を
やり直してみたが、結局文字コード情報を正しく取得する事はできないようだ。
(eval-when-compile (unless (fboundp 'coding-system-to-mime-charset) (defun coding-system-to-mime-charset (coding-system) (coding-system-change-eol-conversion coding-system nil)))) |
-- 2008/08/19 追記 --
Emacs をインストールし直したら文字コード情報は正しく取れるようになった。
何かが修正されたのかも知れない。
ただし、ファイルの先頭に自動で文字コードを埋める処理自体は行われるので
それが邪魔なら 2.4 の対策を施す必要がある。
-- 2008/08/19 追記 --
2.4 対策
実は ruby-mode-set-encoding() を実行しなくても特に問題は無いので以下のサイトでは
ruby-mode.el の before-save-hook をコメントアウトして対応している。
おもしろWEBサービス開発日記: lisp入門 (2008/04/16)
STBBS.NET blog: Carbon Emacsで ruby-modeと日本語 (2008/04/01)
ruby-mode.el をいじりたくないのなら ruby-mode-hook で before-save-hook を
上書きして ruby-mode-set-encoding() を無効にしてしまうのがお手軽。
以下を .emacs.el にでも書いておけば OK。
(add-hook 'ruby-mode-hook
(lambda () (setq before-save-hook nil)))
|
remove-hook() という関数があるらしい。
こっちを使う方が単純に上書きをするより賢い気がする。
(remove-hook 'before-save-hook 'ruby-mode-set-encoding) |
ruby-mode.el や before-save-hook を変更せずに ruby-mode-set-encoding() だけを
無効にしたいのなら advice を使う。
(add-hook 'ruby-mode-hook (lambda () (defadvice ruby-mode-set-encoding (around ruby-mode-set-encoding-disable activate) nil))) |