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

define-minor-mode and autoload (was Re: w3m-session-save|select)



>>>>> In [emacs-w3m : No.09224] Hideyuki SHIRAI (白井秀行)さん wrote:

> (1) (warning/warning) Autoload error in:
>     /usr/local/lib/xemacs/site-packages/lisp/w3m/auto-autoloads:
> 	Symbol's function definition is void: define-minor-mode

この件が気になったのは昨年末に Gnus でも似た話があったからなんで
すが、実は関係ありませんでした (ちょっとあるので読んで→[1])。

このエラーが出るまでの経緯を考えてみました。

1.
w3m-fb.el では define-minor-mode を使って定義する w3m-fb-mode に
;;;###autoload クッキーがあります。このこと自体はまっとうです。
それは w3m-load.el に登録され、これが w3m/auto-autoloads.elc を
介して読み込まれます。XEmacs 21.4 が w3m-load.el に登録するやり
方が問題で、ご覧になるとわかりますが、単に w3m-fb-mode の定義を
ソースからコピーしただけのものが入っています。一方 XEmacs 21.5
と Emacs 21 以上では、w3m-fb-mode コマンドのために w3m-fb.elc を
autoload する設定 (など) に料理されたものが登録されます。

2.
上記の理由により、XEmacs 21.4 が w3m-load.el を読み込むときに
define-minor-mode のマクロ定義が必要なのですが、それは
xemacs-base/easy-mmode.elc にあって、同ディレクトリの
auto-autoloads.elc に autoload の設定があるはずです。

ちょっと古い XEmacs package でそれが欠落していたことがあるのかと
思って調べてみたのですが、そういう事実は無いようでした。では
xemacs-base/auto-autoloads.elc より早い時刻に
w3m/auto-autoloads.elc が読み込まれてしまうのかと考えて、XEmacs
の起動後に以下をやってみたのですが、

ls -lut xemacs-packages/lisp/xemacs-base/auto-autoloads.elc\
        site-packages/lisp/w3m/auto-autoloads.elc

少なくともぼくの環境では xemacs-base/auto-autoloads.elc の方が先
に読み込まれていました。

と、ここまでしか噛み砕くことができなかったんですが、これに沿って
白井さんも調べてみていただけますか? (それ以前にいろいろ問題があ
るようですが ;-)

XEmacs 21.4 が define-minor-mode を auto-autoloads に登録するや
り方の改善は、やってみたい気が少しします。

[1] Gnus は XEmacs で make するときに -no-autoloads オプションを
使うので、すべての auto-autoloads.elc ファイルを読み込みません。
そのため Gnus で初めて使うようになった define-minor-mode がマク
ロ展開されないという問題が起きたのでした。一方 emacs-w3m では
-vanilla オプションを使っているだけなので問題ありません。
-no-autoloads を使う利点は build 時の環境に真に依存しないことの
他に、XEmacs 21.5 が Lisp shadows をうるさく報告しないことです。
ぼくは同じ名前でバージョンが違う大量の Lisp ファイルをインストー
ルしてあるので、XEmacs 21.5 で emacs-w3m を make するときは非常
にやかましく怒られます。^^;;
-- 
山岡