サマリバッファの文字化け (Wanderlustの)
MLに投稿されていた、サマリバッファのキャッシュが正しく保存されない問題についてですが、WanderlustのMLが早めに終了してしまったようなので、 (だいたい) 自分で調べた内容を記録しておきます。 encode-coding-regionの動作がおかしいというところまでが前提です。
src/coding.cにあるCODING_DECODE_CHARマクロのコメントには以下のように書かれています。
/* This wrapper macro is used to preserve validity of pointers into
buffer text across calls to decode_char, which could cause
relocation of buffers if it loads a charset map, because loading a
charset map allocates large structures. */
これによると、charset mapが読み込まれると、bufferのrelocationが生じる可能性があります。 このコメントにはdecode_charについてのみ書かれていますが、encode_charや、char_charsetについてもcharset mapが読み込まれる、すなわち、bufferのrelocationが生じる可能性があります。 しかし、エンコーダ (encode_coding_iso_2022等) はそれを考慮していない為、実際にrelocationが生じると不適切な場所へエンコードした結果を書き込んでしまいます。 このバグを持つ Emacs に関しては、
(defadvice encode-coding-region
(before avoid-relocation (start end coding) activate)
(encode-coding-string (buffer-substring start end) coding))
等のようにして、encode-coding-region内でcharset mapが読み込まれないようにすれば回避できます。
Emacsに対するパッチも一応投稿していますが、反応が無いのでどうなるのかよく分かりません。
(追記) WanderlustのMLは広瀬さんが引き継がれて再開しました。 新しい投稿アドレスはwl@ml.gentei.orgです。
(追記その2) encode-coding-regionのバグはtrunkで修正されました。 半田さんありがとうございます。
タグ:Wanderlust