From: Drew Adams <drew.adams@oracle.com>
To: Lars Ingebrigtsen <larsi@gnus.org>
Cc: 25581@debbugs.gnu.org
Subject: bug#25581: 25.1; Incorrect statement in (elisp) `Hooks'
Date: Mon, 24 Aug 2020 09:01:59 -0700 (PDT) [thread overview]
Message-ID: <36b5b868-29b0-4592-92aa-83f19fbff1c3@default> (raw)
In-Reply-To: <87k0xo83ww.fsf@gnus.org>
> > The second sentence here is incorrect:
> >
> > If the variable’s name ends in ‘-function’, then its value is just a
> > single function, not a list of functions. ‘add-hook’ cannot be used to
> > modify such a _single function hook_, and you have to use ‘add-function’
> > instead (*note Advising Functions::).
> >
> > You CAN use `add-hook' to modify such a single-function hook.
> > Nothing prevents you from doing so. And nothing even suggests
> > that you should not. And you have always been able to do so.
>
> Well, the name -function suggests that you shouldn't.
No, I don't think so. Nothing suggests you shouldn't.
Because it's not true that you shouldn't. It all
depends on whether the variable is a hook. If it is,
then it's fine to use `add-hook' on it - in fact, it's
advisable.
> I think the confusing thing here is that foo-function isn't a hook at
> all -- variables ending with -function are normally not executed with
> run-hooks at all, so using add-hook on such a variable will normally
> break.
This isn't true. `add-hook' works fine with a variable
named `*-function'. What it does is treat the variable
as a hook (since you called `add-hook' on it). It turns
the value into a singleton list with the given function
as element.
`add-hook' does what it's supposed to with any variable.
What's wrong is to use `add-hook' on a variable (whatever
the name) that's not intended to be used as a hook.
Using `add-hook' on a variable treats it like a hook:
it adds the argument function as an element in the
variable's list value.
If you use `add-hook' on a var that's NOT intended as a
hook, in particular, a variable whose value should NOT
be a list of functions, then that's on you.
Some variables named `*-function' are not intended as
hooks. For those, it makes no sense to use `add-hook'
(and `run-hooks'). Others _are_ intended as hooks.
The latter case is legacy, AFAIK. Such vars would be
better named `*-hook' or `*-functions', depending on
whether they are normal or abnormal hooks.
> So I'm not sure what that section is doing in the Hooks node at all. It
> origin starts here, where unfortunately vc-region-history gives up.
I don't understand that last sentence, and I'm not
sure what you mean by "that section". The text of
node `Hooks' is longstanding, and though not perfect,
it is generally accurate.
The problem is the change that someone made by adding
this paragraph, fairly recently (presumably when
`add-function' came into being):
"‘add-hook’ cannot be used to modify such a single
function hook, and you have to use ‘add-function’
instead (*note Advising Functions::)."
That's what this bug is about - that text.
> My preference here would be just to remove the paragraph,
> which is pretty confusing.
If you mean the paragraph I mentioned just above then
yes, that was the suggestion.
There's a lot of careful consideration in this thread,
and there's a lot of info in node `Hooks'. Let's not
throw out the baby with the bathwater. A variable
named `*-function' can be a hook, but it need not be.
Such a name doesn't tell us whether the variable is a
hook, unfortunately.
Yes, that's a point of confusion. The right change,
if one is needed in this regard, is to rename any
such hooks.
Note that Emacs has, in some cases, tried to make
clear when a `*-function' variable is not a hook.
For example, `C-h v auto-fill-function' says, among
other things:
NOTE: This variable is not a hook;
its value may not be a list of functions.
That makes the purpose and allowable value of that
variable pretty clear.
More recently, there's been addition of more non-hook
variables with names `*-function', and _without_ such
caveats in their doc strings. It's maybe time to
rename the hook variables with names `*-function'.
But as long as such exist the doc should cover them.
prev parent reply other threads:[~2020-08-24 16:01 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-30 16:51 bug#25581: 25.1; Incorrect statement in (elisp) `Hooks' Drew Adams
2017-01-31 3:05 ` npostavs
2017-01-31 3:36 ` Mark Oteiza
2017-01-31 4:06 ` Drew Adams
2017-01-31 3:55 ` Drew Adams
2017-01-31 4:16 ` npostavs
2017-01-31 16:02 ` Drew Adams
2017-02-01 3:35 ` npostavs
2017-02-01 17:01 ` Drew Adams
2017-02-04 21:00 ` npostavs
2017-02-05 2:11 ` Drew Adams
2017-02-10 1:42 ` npostavs
2017-02-10 3:00 ` Drew Adams
2020-10-11 2:26 ` Lars Ingebrigtsen
2020-10-11 14:12 ` Drew Adams
2020-08-24 15:22 ` Lars Ingebrigtsen
2020-08-24 15:54 ` Stefan Kangas
2020-08-24 15:58 ` Lars Ingebrigtsen
2020-08-24 16:20 ` Drew Adams
2020-08-24 16:13 ` Drew Adams
2020-08-24 16:18 ` Drew Adams
2020-08-26 1:50 ` Richard Stallman
2020-08-26 18:27 ` Drew Adams
2020-08-24 16:01 ` Drew Adams [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=36b5b868-29b0-4592-92aa-83f19fbff1c3@default \
--to=drew.adams@oracle.com \
--cc=25581@debbugs.gnu.org \
--cc=larsi@gnus.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.