Subject: bug#79106: [PATCH] Add new optional keywords to use-package

From: Eli Zaretskii <[email-masked]>
Date: Thu, 07 Aug 2025 16:56:23 +0300

> From: Elijah Gabe Pérez <[email-masked]>
> Cc: Eli Zaretskii <[email-masked]>,  [email-masked],
>   [email-masked],  [email-masked],  [email-masked]
> Date: Sat, 02 Aug 2025 19:42:24 -0600
> 
> Karthik Chikmagalur <[email-masked]> writes:
> 
> >>> From my POV, we can install these changes in core, assuming that
> >>> you
> >>> can post a patch that incorporates the relevant parts of the
> >>> discussions.
> >>
> >> Sounds good to me, I've updated the patch for include *only* the
> >> keywords that people may find useful.
> >>
> >> The rest can be kept in my use-package-x repository.
> >
> > Since support for :hook+ is being added, I have a suggestion to make
> > its
> > syntax more in-line with add-hook, so the user does not have to learn
> > new syntax.  This might not be possible (or lead to ambiguous
> > parsing),
> > so feel free to ignore it if this is the case.
> >
> > add-hook takes the arguments (HOOK FUNCTION DEPTH LOCAL), so perhaps
> > :hook+ can do the same?
> >
> > -------------------------------------
> >
> > Suggestion 1: allow many hooks to be specified in a list
> >
> > :hook+ (foo-mode . (bar baz quux))
> >
> > adds functions bar, baz and quux to foo-mode-hook.  (To disambiguate
> > between a list of hook functions and a lambda, you can look at the car
> > of the list maybe?)
> 
> It is not possible because (foo-mode . (bar baz quux)) is expanded as
> (foo-mode bar baz quux), and this can be misinterpreted by :hook+ as a
> list of hooks.
> 
> The only workaround i found is making a kind of separator (:multi),
> which tells :hook+ the cdr is a list of functions, not part of a list of
> hooks.
> 
> I know that :multi can look weird (even i was thinking in rename it [1]
> or use a better separator), but it was the only solution i found and
> worked.
> 
> > Suggestion 2: allow many hooks to be added to.  (:hook already does
> > this)
> >
> > :hook+ ((foo-mode cor-mode) . (bar baz quux))
> >
> > Adds the three functions to both foo-mode-hook and cor-mode-hook.
> 
> Similar problem as previous.
> 
> > Suggestion 3: Allow DEPTH and LOCAL to be optionally specified with
> > the functions,
> > in the same order as add-hook.
> >
> > :hook+ (foo-mode . ((bar 90 t)
> >                     baz
> >                     (quux -30)
> >                     (cor nil t))
> >
> > will install 
> > - bar at depth 90, to be run buffer-locally when foo-mode-hook runs
> > - baz without special accommodations, and
> > - quux at depth -30.
> > - cor buffer-locally with default depth
> 
> I like this, i think i can implement only the "local" part.
> But of course, only part of :multi.
> 
> If i can get rid of `:multi` i can implement this, but it will look
> somewhat ugly:
> 
>   :hook+ (foo-mode . '((bar 90 t)))

So what is the outcome of this discussion?  Are you working on an
updated patch, or should I install the last one you posted?