* add-hook versus custom-set-variables
@ 2005-12-28 23:05 Bill Wohler
2005-12-29 3:24 ` Stefan Monnier
0 siblings, 1 reply; 13+ messages in thread
From: Bill Wohler @ 2005-12-28 23:05 UTC (permalink / raw)
I set mh-folder-mode-hook to bw-mh-folder-mode-hook in my
custom-set-variables stanza.
When I start Emacs, I see that mh-folder-mode-hook is set to
mc-install-read-mode instead. I'd expect to see both
mc-install-read-mode and bw-mh-folder-mode-hook. This reminded me a lot
of the problems we had with the defvar of the hook in
define-derived-mode.
It appears that an add-hook call during the mailcrypt initialization is
binding mh-folder-mode-hook so that the custom-set-variables is losing.
I think Luc's explanation in
http://article.gmane.org/gmane.emacs.pretest.bugs/9993 is germane.
Since users will use the Customization interface to set hooks (at least
166 of them in my instance), I think it is important to figure out a
general resolution to this problem.
Two workarounds which aren't pretty are to insist that the user add a
defvar in .emacs for any hook he customizes or for system libraries to
delay the evaluation of add-hook until after the related
custom-set-variables and defcustom have been evaluated.
When I modified mailcrypt-init.el as follows:
;; MH-E hooks
(eval-after-load 'mh-customize
(progn
(message "Adding mailcrypt hooks to MH-E...")
(add-hook 'mh-folder-mode-hook 'mc-install-read-mode)
(add-hook 'mh-letter-mode-hook 'mc-install-write-mode)))
I found that the eval-after-load form was evaluated during
initialization rather than after I loaded MH-E. From *Messages*:
Loading 50mailcrypt (source)...
Adding mailcrypt hooks to MH-E...
Any thoughts as to why this happened? No, mh-customize had not been
loaded yet.
For the Debian folks, I have the following code in my .emacs so that I
can use Debian Emacs Lisp packages while running CVS Emacs:
(when (eq emacs-major-version 22)
(add-to-list 'load-path "/usr/share/emacs/site-lisp")
(load-library "debian-startup")
(setq debian-emacs-flavor 'emacs-snapshot)
(debian-startup 'emacs-snapshot))
--
Bill Wohler <wohler@newt.com> http://www.newt.com/wohler/ GnuPG ID:610BD9AD
Maintainer of comp.mail.mh FAQ and MH-E. Vote Libertarian!
If you're passed on the right, you're in the wrong lane.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-28 23:05 add-hook versus custom-set-variables Bill Wohler
@ 2005-12-29 3:24 ` Stefan Monnier
2005-12-29 7:44 ` Bill Wohler
2005-12-30 20:52 ` Bill Wohler
0 siblings, 2 replies; 13+ messages in thread
From: Stefan Monnier @ 2005-12-29 3:24 UTC (permalink / raw)
Cc: Davide G. M. Salvetti, Romain Francoise
> Two workarounds which aren't pretty are to insist that the user add a
> defvar in .emacs for any hook he customizes
I don't understand what you're suggesting here.
How could a defvar in .emacs help?
> ;; MH-E hooks
> (eval-after-load 'mh-customize
> (progn
> (message "Adding mailcrypt hooks to MH-E...")
> (add-hook 'mh-folder-mode-hook 'mc-install-read-mode)
> (add-hook 'mh-letter-mode-hook 'mc-install-write-mode)))
eval-after-load is a function, not a macro. I know it's counter
intuitive.
Stefan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-29 3:24 ` Stefan Monnier
@ 2005-12-29 7:44 ` Bill Wohler
2005-12-29 16:14 ` Stefan Monnier
2005-12-30 20:52 ` Bill Wohler
1 sibling, 1 reply; 13+ messages in thread
From: Bill Wohler @ 2005-12-29 7:44 UTC (permalink / raw)
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> Two workarounds which aren't pretty are to insist that the user add a
>> defvar in .emacs for any hook he customizes
>
> I don't understand what you're suggesting here.
> How could a defvar in .emacs help?
Please read Luc's article where he describes the technique and why.
http://article.gmane.org/gmane.emacs.pretest.bugs/9993
>> ;; MH-E hooks
>> (eval-after-load 'mh-customize
>> (progn
>> (message "Adding mailcrypt hooks to MH-E...")
>> (add-hook 'mh-folder-mode-hook 'mc-install-read-mode)
>> (add-hook 'mh-letter-mode-hook 'mc-install-write-mode)))
>
> eval-after-load is a function, not a macro. I know it's counter
> intuitive.
I don't know enough about the internals to know why this would be
counter-intuitive. I read your answer as: macros do what you expect,
functions don't. Please elaborate if this is not what you mean. Why
doesn't eval-after-load do what I expect?
--
Bill Wohler <wohler@newt.com> http://www.newt.com/wohler/ GnuPG ID:610BD9AD
Maintainer of comp.mail.mh FAQ and MH-E. Vote Libertarian!
If you're passed on the right, you're in the wrong lane.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-29 16:14 ` Stefan Monnier
@ 2005-12-29 10:05 ` Bill Wohler
2005-12-29 19:12 ` Stefan Monnier
0 siblings, 1 reply; 13+ messages in thread
From: Bill Wohler @ 2005-12-29 10:05 UTC (permalink / raw)
Cc: Davide G. M. Salvetti, Romain Francoise, emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> >>> Two workarounds which aren't pretty are to insist that the user add a
> >>> defvar in .emacs for any hook he customizes
> >>
> >> I don't understand what you're suggesting here.
> >> How could a defvar in .emacs help?
>
> > Please read Luc's article where he describes the technique and why.
>
> > http://article.gmane.org/gmane.emacs.pretest.bugs/9993
>
> Oh, I see. It's not specific to defvar: setq works just as well.
>
> >>> ;; MH-E hooks
> >>> (eval-after-load 'mh-customize
> >>> (progn
> >>> (message "Adding mailcrypt hooks to MH-E...")
> >>> (add-hook 'mh-folder-mode-hook 'mc-install-read-mode)
> >>> (add-hook 'mh-letter-mode-hook 'mc-install-write-mode)))
> >>
> >> eval-after-load is a function, not a macro. I know it's counter
> >> intuitive.
>
> > I don't know enough about the internals to know why this would be
> > counter-intuitive. I read your answer as: macros do what you expect,
> > functions don't. Please elaborate if this is not what you mean. Why
> > doesn't eval-after-load do what I expect?
>
> The evaluation of a form (A B C) can follow the following two paths:
>
> - if it's a macro:
>
> (eval (macrocall A B C))
>
> - if it's a function
>
> (funcall A (eval B) (eval C))
>
> Note how the function cannot delay the evaluation of its arguments.
Thanks for the explanation. There's a lot of strange things in
elisp--mostly around compilation and evaluation--that I don't understand
and every little bit helps. Maybe another reading of these sections in
the elisp manual will make more sense now.
In any event, I think I get it now. To keep eval-after-load from being
completely useless, the idiom is to quote the form. Right?
This works:
(eval-after-load "mh-e"
'(progn
(add-hook 'mh-folder-mode-hook 'mc-install-read-mode)
(add-hook 'mh-letter-mode-hook 'mc-install-write-mode)))
BUT!
While coming up with a recipe to prove that the semantics had changed
between Emacs 21 and 22, I discovered I was inadvertently performing my
"site-init" *after* I ran custom-set-variables. (Recall that I'm
simulating the Debian site-init from my .emacs while using CVS Emacs.)
Normally, site-init is performed *before* one's .emacs is loaded. After
moving the site-init to the top of my .emacs file, I regained Emacs 21
semantics and all is well.
Sorry about the false alarm; at least I learned a few things.
--
Bill Wohler <wohler@newt.com> http://www.newt.com/wohler/ GnuPG ID:610BD9AD
Maintainer of comp.mail.mh FAQ and MH-E. Vote Libertarian!
If you're passed on the right, you're in the wrong lane.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-29 7:44 ` Bill Wohler
@ 2005-12-29 16:14 ` Stefan Monnier
2005-12-29 10:05 ` Bill Wohler
0 siblings, 1 reply; 13+ messages in thread
From: Stefan Monnier @ 2005-12-29 16:14 UTC (permalink / raw)
Cc: emacs-devel
>>> Two workarounds which aren't pretty are to insist that the user add a
>>> defvar in .emacs for any hook he customizes
>>
>> I don't understand what you're suggesting here.
>> How could a defvar in .emacs help?
> Please read Luc's article where he describes the technique and why.
> http://article.gmane.org/gmane.emacs.pretest.bugs/9993
Oh, I see. It's not specific to defvar: setq works just as well.
>>> ;; MH-E hooks
>>> (eval-after-load 'mh-customize
>>> (progn
>>> (message "Adding mailcrypt hooks to MH-E...")
>>> (add-hook 'mh-folder-mode-hook 'mc-install-read-mode)
>>> (add-hook 'mh-letter-mode-hook 'mc-install-write-mode)))
>>
>> eval-after-load is a function, not a macro. I know it's counter
>> intuitive.
> I don't know enough about the internals to know why this would be
> counter-intuitive. I read your answer as: macros do what you expect,
> functions don't. Please elaborate if this is not what you mean. Why
> doesn't eval-after-load do what I expect?
The evaluation of a form (A B C) can follow the following two paths:
- if it's a macro:
(eval (macrocall A B C))
- if it's a function
(funcall A (eval B) (eval C))
Note how a function cannot delay the evaluation of its arguments.
Stefan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-29 10:05 ` Bill Wohler
@ 2005-12-29 19:12 ` Stefan Monnier
2005-12-30 5:37 ` Tomas Zerolo
0 siblings, 1 reply; 13+ messages in thread
From: Stefan Monnier @ 2005-12-29 19:12 UTC (permalink / raw)
Cc: Davide G. M. Salvetti, Romain Francoise
>> The evaluation of a form (A B C) can follow the following two paths:
>>
>> - if it's a macro:
>>
>> (eval (macrocall A B C))
>>
>> - if it's a function
>>
>> (funcall A (eval B) (eval C))
>>
>> Note how the function cannot delay the evaluation of its arguments.
> Thanks for the explanation. There's a lot of strange things in
> elisp--mostly around compilation and evaluation--that I don't understand
> and every little bit helps. Maybe another reading of these sections in
> the elisp manual will make more sense now.
Actually this difference between macros and functions applies to 99% of
all languages.
Stefan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-29 19:12 ` Stefan Monnier
@ 2005-12-30 5:37 ` Tomas Zerolo
0 siblings, 0 replies; 13+ messages in thread
From: Tomas Zerolo @ 2005-12-30 5:37 UTC (permalink / raw)
Cc: emacs-devel
[-- Attachment #1.1: Type: text/plain, Size: 748 bytes --]
On Thu, Dec 29, 2005 at 02:12:40PM -0500, Stefan Monnier wrote:
[...]
> > Thanks for the explanation. There's a lot of strange things in
> > elisp--mostly around compilation and evaluation--that I don't understand
> > and every little bit helps. Maybe another reading of these sections in
> > the elisp manual will make more sense now.
>
> Actually this difference between macros and functions applies to 99% of
> all languages.
Yes, but for a big proportion of those 99% your theorem applies trivially
(there are no macros), and for the rest... in most of thenm macros look
so utterly different from the rest of the language that this is a
non-issue.
The Lisp way of macros is a very special beast indeed.
Regards
-- tomas
[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
[-- Attachment #2: Type: text/plain, Size: 142 bytes --]
_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-29 3:24 ` Stefan Monnier
2005-12-29 7:44 ` Bill Wohler
@ 2005-12-30 20:52 ` Bill Wohler
2005-12-30 22:25 ` Stefan Monnier
1 sibling, 1 reply; 13+ messages in thread
From: Bill Wohler @ 2005-12-30 20:52 UTC (permalink / raw)
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> eval-after-load is a function, not a macro. I know it's counter
> intuitive.
Perhaps the docstring and manual for eval-after-load should highlight
this pitfall. Maybe it should mention that its form is evaluated
immediately and that the form should be quoted to get expected
behavior.
--
Bill Wohler <wohler@newt.com> http://www.newt.com/wohler/ GnuPG ID:610BD9AD
Maintainer of comp.mail.mh FAQ and MH-E. Vote Libertarian!
If you're passed on the right, you're in the wrong lane.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-30 20:52 ` Bill Wohler
@ 2005-12-30 22:25 ` Stefan Monnier
2005-12-31 19:36 ` Richard M. Stallman
0 siblings, 1 reply; 13+ messages in thread
From: Stefan Monnier @ 2005-12-30 22:25 UTC (permalink / raw)
Cc: emacs-devel
>> eval-after-load is a function, not a macro. I know it's counter
>> intuitive.
> Perhaps the docstring and manual for eval-after-load should highlight
> this pitfall. Maybe it should mention that its form is evaluated
> immediately and that the form should be quoted to get expected
> behavior.
Better would be to kill the beast and replace it with a macro.
Sadly, keeping the same name is not an option for backward
compatibility reasons.
Maybe we could introduce a new macro `do-after-load' or `after-load' or
`eval-after'?
Stefan
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-30 22:25 ` Stefan Monnier
@ 2005-12-31 19:36 ` Richard M. Stallman
2005-12-31 19:47 ` David Kastrup
0 siblings, 1 reply; 13+ messages in thread
From: Richard M. Stallman @ 2005-12-31 19:36 UTC (permalink / raw)
Cc: wohler, emacs-devel
Maybe we could introduce a new macro `do-after-load' or `after-load' or
`eval-after'?
Since this is not a new feature, and the issue is not a bug, let's not
consider changing it now.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-31 19:36 ` Richard M. Stallman
@ 2005-12-31 19:47 ` David Kastrup
2005-12-31 21:00 ` Chong Yidong
0 siblings, 1 reply; 13+ messages in thread
From: David Kastrup @ 2005-12-31 19:47 UTC (permalink / raw)
Cc: emacs-devel, Stefan Monnier, wohler
"Richard M. Stallman" <rms@gnu.org> writes:
> Maybe we could introduce a new macro `do-after-load' or
> `after-load' or `eval-after'?
>
> Since this is not a new feature, and the issue is not a bug, let's not
> consider changing it now.
If it helps getting the release out this year.
--
David Kastrup, Kriemhildstr. 15, 44793 Bochum
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-31 19:47 ` David Kastrup
@ 2005-12-31 21:00 ` Chong Yidong
2005-12-31 21:26 ` David Kastrup
0 siblings, 1 reply; 13+ messages in thread
From: Chong Yidong @ 2005-12-31 21:00 UTC (permalink / raw)
Cc: wohler, rms, Stefan Monnier, emacs-devel
> If it helps getting the release out this year.
We have only a few hours left, so this seems unlikely.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: add-hook versus custom-set-variables
2005-12-31 21:00 ` Chong Yidong
@ 2005-12-31 21:26 ` David Kastrup
0 siblings, 0 replies; 13+ messages in thread
From: David Kastrup @ 2005-12-31 21:26 UTC (permalink / raw)
Cc: wohler, rms, Stefan Monnier, emacs-devel
Chong Yidong <cyd@stupidchicken.com> writes:
>> If it helps getting the release out this year.
>
> We have only a few hours left, so this seems unlikely.
Your name would suggest that you have _quite_ a lot of hours in your
current year left, but maybe some of your relatives are in a better
position.
--
David Kastrup, Kriemhildstr. 15, 44793 Bochum
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2005-12-31 21:26 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-12-28 23:05 add-hook versus custom-set-variables Bill Wohler
2005-12-29 3:24 ` Stefan Monnier
2005-12-29 7:44 ` Bill Wohler
2005-12-29 16:14 ` Stefan Monnier
2005-12-29 10:05 ` Bill Wohler
2005-12-29 19:12 ` Stefan Monnier
2005-12-30 5:37 ` Tomas Zerolo
2005-12-30 20:52 ` Bill Wohler
2005-12-30 22:25 ` Stefan Monnier
2005-12-31 19:36 ` Richard M. Stallman
2005-12-31 19:47 ` David Kastrup
2005-12-31 21:00 ` Chong Yidong
2005-12-31 21:26 ` David Kastrup
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.