filename.el to support Japanese filename.

Katsumi Yamaoka yamaoka @ jpl.org
2002年 7月 11日 (木) 08:32:24 JST


>>>>> In [apel-ja : No.00683]
>>>>>	batta @ beige.ocn.ne.jp (KAWABATA, Taichi) wrote:

幡> 個人的にはもちろん.emacsで自分にしたいようにfilterを設定しているの
幡> ですが…

山岡> えーと file-name-coding-system はデフォルトでは nil なので、いつ
山岡> load されるかわからない filename.el にそういうものを仕込むのは無
山岡> 理があると思います。それに safe-charset の値が得られる Emacsen
山岡> は限られていますし。

幡> たとえば、safe-charsetが得られるemacsenに限るようにして(それをどうす
幡> ればいいのかは自信はないのですが)、

最初に考えたのはそれをどうするかで、手持ちの Emacs 18,19,20,21
と XEmacs 20,21 (with/without Mule) を総動員して検証しながら作業
すればできるだろう、でも超メンドくさいなあ、というのが正直な感想
でした。でも APEL の開発というのはそれに尽き、それは開発者に課せ
られた枷であり、それがまた APEL の面白さでもあると思っています。

;; 個人的な志向としては、新たに作る何かのプログラムでは APEL を
;; 使わないことを枷にしていますが、それにはまた逆の面白さがあり
;; ます。:)

幡> かつ file-name-coding-system の値がnilでない時に限るようにチェック
幡> するのならどうでしょうか?

一般的に defvar で定義される変数のデフォルト値は、それが使われる
地域や Emacs の性格によって変化するものだと思います。ユーザが別
の変数に対して行なった変更が *デフォルト値* の決定に際して影響を
与えるのは変な感じがします。川幡さんのお望みのような機能を持たせ
るならば、汎用モジュールである filename.el は、何らかの形で言い
訳をしなければならないのではないでしょうか。それは例えばこういう
ことでも良いかもしれません。

  filename.el を使う人はかならず .emacs ファイルの第一行目で
  file-name-coding-system の値を設定し、第二行目で load して下さ
  い。そうすることによって、あなたが file-name-coding-system の
  値を設定する前に、他のプログラムが filename.el を load してし
  まうことを避けなければなりません。

しかし、これを書いた時点で filename.el は汎用モジュールではなく
なってしまいませんか?

filename-filters は doc-string が "*" で始まっていないので、これ
は形式としてはユーザオプションではありませんが、そもそも defvar
というのは後で値を変更する/されるかもしれない変数を定義するもの
です。ですからデフォルト値を決めるときではなく、*後* でユーザが
値を変えるのはユーザの自由であり、もしそれで不具合を生じたとして
も責任はユーザに帰するという観点から、前回のメールでは delq でユー
ザが要らないものを削る例を書きました。

ぼくがこだわっているのはそれが変数のデフォルト値の決定方法だから
で、別のやり方ならば良いと思うのです。例えばこんなふうに、ダイナ
ミックに filename-filters の値 (に相当するもの) を変化させること
ができるようにしたら良いのではないでしょうか。

(defvar filename-filters-hook nil
  "*Hook used for modifying the value for `filename-filters' temporary.
When it is evaluated, the non-global variable `filename-filters' will
be bound for the copy of `filename-filters'.  For instance, if you do
not want to use kakasi to convert Japanese filenames, you may use the
following function for Emacs 20/21:

\(add-hook 'filename-filters-hook
	  (lambda ()
	    (if (and file-name-coding-system
		     (memq 'japanese-jisx0208
			   (coding-system-get file-name-coding-system
					      'safe-charsets)))
		(setq filename-filters
		      (delq 'filename-japanese-to-roman-string
			    filename-filters)))))")

で、関数 replace-as-filename は以下のように改造する、と。

(defun replace-as-filename (string)
  "Return safety filename from STRING.
It refers variable `filename-filters' and default filters refers
`filename-limit-length', `filename-replacement-alist'."
  (and string
       (let ((filename-filters (copy-sequence filename-filters)))
	 (run-hooks 'filename-filters-hook)
	 (poly-funcall filename-filters string))))

守岡さん> ところで、提案なんですが、いっそのこと filename-filters の既
守岡さん> 定値を nil にしちゃうってのはいかがでしょうか?

幡> 昨今のsambaの普及など、Unixで日本語ファイル名を使う機会が増加して
幡> いることを考えたら、kakasiは余計なお世話かもしれません。ただ、一時
幡> 期重宝していたのは間違いないので…

デフォルト値は nil、だけど custom で自由に変更できるというのは良
いかもしれませんね。
-- 
Katsumi Yamaoka <yamaoka @ jpl.org>




More information about the APEL-ja mailing list