[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

cookies



こんにちは山岡です。三つの場所に spam しています。ごめんなさい。

以前から何度か私は XEmacs がファイルの第一行目にある以下のような
coding-system magic cookie を参照してくれない、と申しました。

-*- mode: text; coding: iso-2022-7bit -*-

しかし実際には正しく動作することを昨日確認しました。ChangeLog に
よればこの機能は XEmacs 21.1.9 で登場し、21.2.21 以降では完全に
仕上がっているようです。間違った情報を流してしまいまして、申し訳
ありませんでした。

加えて、XEmacs 21.4 と 21.5 が coding-system magic cookie を正し
く参照できるようにするパッチと称するものを紹介してもいましたが、
本来そんなものは必要がありません。パッチを当ててインストールして
しまったみなさまには深くお詫び申し上げます。幸いにしてパッチが当
たったままでも実害はありませんが、次回インストールするときには使
わないで下さい。

以下に私がなぜそんな誤解をしてしまったかの言い訳を書きます。

私はよく、XEmacs だけでなく FSF Emacs や Mule 2 でも共用できる
elisp のソースプログラムを書きます。以下は coding-system を指定
して find-file する関数の例です。

(defun code-find-file (file &optional codesys)
  (let ((coding-system-for-read codesys);; for XEmacs and FSF Emacs
	(file-coding-system-for-read codesys));; for Mule 2
    (find-file file)))

ここで使っている変数 `file-coding-system-for-read' は XEmacs と
Mule だけに存在し、FSF Emacs にはありません。また、XEmacs では
`buffer-file-coding-system-for-read' を使うべきなのですが、前者
は obsolete な alias 変数として残されています。

私はこのようなプログラムを何度も書いているうちに、この変数の振る
まいは `coding-system-for-read' と同等、ただし XEmacs においては
優先度が低いだけのものと、いつからか誤解していたようです。したがっ
て上記の関数のオプショナル引数を省略した場合の動作として私が期待
していたのは、ファイルを読む際に自動デコードが行なわれることで、
その動作には coding-system magic cookie の参照も含まれます。

そのような予断を持ったまま引数無しでこの関数を使って各国語のテキ
ストが書かれたファイルを読んでみると、第一行目に cookie があるに
も関わらず XEmacs は無変換でファイルを読んでしまうのに対して、
FSF Emacs では正しくデコードが行なわれます。このことから私は
XEmacs が各国語のテキストのデコードができずに処理を放棄してしまっ
た、しかもそのような事態に備えて cookie を付加してあるのにそれを
参照してくれない、と判断したのでした。悪いことは重なるもので、先
に紹介したパッチを当てて XEmacs を作ると、私が期待している通りの
動作になるのです。

正しくは XEmacs における `buffer-file-coding-system-for-read' は
ファイルを読むときのデコードをどの coding-system で行なうかを指
定するもので、デフォルト値は `undecided' すなわち自動デコードで
す。Mule も同様なので、当然ながら上記の関数は Mule でも意図した
通りには動作しません。それを、古い Mule には cookie を参照する機
能が備わっていないからだと判断したため、私はさらに深い誤解の泥沼
に沈んでいったのでした。

長くなってしまいました。最後に XEmacs とそれを開発して下さってい
るみなさまの名誉を傷付けてしまったことを、改めてお詫びいたします。
-- 
Katsumi Yamaoka <yamaoka@jpl.org>