Carbon Emacs メモ


0. はじめに

ここは Carbon Emacs 関連のメモページである。


1. 使用環境

OSMac OS X 10.4.11
emacsGNU Emacs 22.2.1 (2008年春版)
APEL10.7

2. ruby-mode と日本語

2.1 エラーメッセージ

ruby-mode で日本語を含むスクリプトを保存しようとすると以下のエラーが出る。

Symbol's function definition is void: coding-system-to-mime-charset

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)))


2008/07/07 作成