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

Re: w3m-display-hook の破綻



From: TSUCHIYA Masatoshi <tsuchiya@pine.kuee.kyoto-u.ac.jp> さん曰く
Subject: [emacs-w3m:03833] Re: w3m-display-hook の破綻
Message-ID: <20020828213827N.1000@pine.kuee.kyoto-u.ac.jp>
Date: Wed, 28 Aug 2002 21:38:27 +0900

白井> なんか Emacs 21 で w3m-display-hook が変だなぁと思って調べたので

白井> (defcustom w3m-display-hook nil

白井> (add-hook 'w3m-display-hook 'w3m-history-highlight-current-url)
白井> (add-hook 'w3m-display-hook 'w3m-move-point-for-localcgi)
白井> (add-hook 'w3m-display-hook 'w3m-select-buffer-update)

白井> にしちゃって良いですか?それとも、他に良い方法はあるでしょうか?

土> これなんですけど,

土> (1) M-x customize-variable RET w3m-display-hook RET で,どれかの処理を
土>     取り除くように設定しても有効にならない
土> (2) 実際のデフォルト値が分かり難い

土> ので,もっと泥臭い方法に修正しました.

## あぁぁ、これじゃダメなんですってば。

(setq hoge 1)
(defvar hoge 2 "hoge だよ")
hoge => 1

と同じことが add-hook と defcustom にも当てはまる(らしい)ので、

(1) (add-hook 'hoge-hook 'forward-char)
(2) hoge-hook => (forward-char)
(3) (defcustom hoge-hook
      (nconc '(backward-char delete-char))
      "*Hook だよ"
      :group 'w3m
      :type 'hook)
(4) hoge-hook => (forward-char)

となるのです。そのため、~/.emacs で独自に add-hook していると
defcustom で設定されるべき初期値が無効になります。

例えば、ぼくの w3m-display-hook は ~/.emacs で add-hook している
ので、

w3m-display-hook
 => (w3m-ftp-delegate-remove (lambda (url) (when (fboundp (quote lsdb-hide-buffer)) (lsdb-hide-buffer))) w3m-frame-view)

となっています。
(中身は気にしないでね ^^;)

だけど、hook の設定で必ず customize-variable を使う人には土屋
さんの変更後の方法がわかりやすくて良いのですが。。。

# けど、いちいち customize-variable 使うのはイヤだ :-<
## ついでに w3m-mode-hook もだめになってしまった。

......

で、提案なのですが、ぼくの考えた限りでは上記の二通りの人を満足さ
せるのは無理だと思うので、現状 w3m-*-hook の初期値をソース内で設
定しているものは、w3m-*-functions にして、すべての w3m-*-hook の
初期値は nil にするのはどうでしょうか? 必要だから初期値を設定し
ているわけですし。

例えば、

(defcustom w3m-mode-hook nil
  "*Hook run before `w3m-mode' called." <= after の様な気がする。
  :group 'w3m
  :type 'hook)

(defcustom w3m-mode-funcitions
  (when (featurep 'w3m-e21)
    '(w3m-setup-header-line
      w3m-setup-widget-faces
      w3m-update-tab-line))
  "*Functions run before `w3m-mode' called."
  :group 'w3m
  :type '(repeat function))


(defun w3m-mode (..)
 ...
 (w3m-call-functions 'w3m-mode-funcitions)
 (run-hooks 'w3m-mode-hook)
 ...)

(defun w3m-call-functions (funcs &rest args)
  (dolist (func funcs)
    (funcall func args)))
  
みたいに。(冗長?)

-- 
白井秀行@動作はまったく確認していませんけど。