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

Re: w3m-display-hook の破綻



>>>>> In [emacs-w3m : No.03850] 白井秀行さん wrote:

白井さん> うーーん、add-hook がそういう仕様だということはわかるのです
白井さん> が、運用上は、ほとんどの場合はなにも考えないで ~/.emacs で
白井さん> add-hookしてもいいものだと思うのです。

うーーん。^^;;
話が堂々めぐりになりそうですが、それを保証できるのはユーザオプショ
ンである hook にシステムが使う有意の値を持たない場合だけですよね。
しかし現実にはシステムがそういう使い方をしている例は多いし、それ
らの場合に .emacs で add-hook してはいけない例も見られます。

;; Gnus は .gnus を load するときに message.elc が load 済みです
;; が、そのときはまだ load されない gnus-sum.elc には non-nil な
;; デフォルト値を持つユーザオプションの hook がいくつかあります。

白井さん> また、eval-after-load や defadvice は『それしか手段が無いと
白井さん> きの逃げ道』だと思うので、積極的にそれを推奨するのはさけたほ
白井さん> うが良いと思います。

eval-after-load の利用を相手を選ばずに勧めるには、かなり注意しな
いといけないことを思い出しました。

(setq xxx 0)
(eval-after-load "w3m-xmas" '(setq xxx (1+ xxx)))

(progn (load "w3m-xmas") xxx)
 =>1
(progn (load "w3m-xmas.elc") xxx)
 =>1
(progn (load "/usr/local/lib/xemacs/packages/lisp/w3m/w3m-xmas.elc") xxx)
 =>1

えーと、すなわち `load' に渡る名前は `eval-after-load' を使った
ときと string-equal な "w3m-xmas" である必要があります。
それから、詳細は長くなるので自作のパッチの所在だけ書きますが、

ftp://ftp.jpl.org/xemacs/packages/efs-1.29-pkg-after-load.patch.gz

XEmacs の efs にはそれを load しただけで `eval-after-load' の設
定が無視されてしまうという致命的なバグがあります。ange-ftp は問
題無いようですが。

白井さん> (add-hook 'w3m-init-hook
白井さん> 	  (lambda ()
白井さん> 	    (add-hook 'w3m-hoge-hook 'foo)))

白井さん> だったらまだ良いと感じるのですが。。。

昔はいろんな xxx.el ファイルの最後に書かれていた xxx-load-hook
が、`eval-after-load' があるからという理由でどんどん消されました
よねえ。ぼくもそういう xxx-load-hook の利は認めます。一つ例を出
すと、

(add-hook 'foo-hook (lambda (arg) (...)))

と書かれた .el ファイルを byte-compile すると lambda 式も
compile されますが、普通の `eval-after-load' に単に Lisp フォー
ムを与えただけではそういう効果は得られません。

;; で山岡氏はどうしたら良いと言いたいのか....はて?  ^^;;
-- 
Katsumi Yamaoka <yamaoka@jpl.org>