help-gnu-emacs
[Top][All Lists]
Advanced

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

Re: use-package :after ??


From: Ruijie Yu
Subject: Re: use-package :after ??
Date: Mon, 08 May 2023 12:25:44 +0800
User-agent: mu4e 1.11.3; emacs 30.0.50

David Masterson <dsmasterson@gmail.com> writes:

> Thanks for the followup.
>
> Ruijie Yu via Users list for the GNU Emacs text editor
> <help-gnu-emacs@gnu.org> writes:
>
>> David Masterson <dsmasterson@gmail.com> writes:
>>
>>> 1. If any of the listed packages are not loaded currently, then the
>>> current package will not be loaded. Period.
>>> 2. #1 + "magic" will be done to ensure that, once the listed packages
>>> are loaded, the current package will be (auto?) loaded.
>>>
>>> If #1 is correct, I do not know how the current package will ever be
>>> loaded if ":after" fails.  If #2 is correct, I do not know what the
>>> "magic" could be to safely do this.
>>
>> TL;DR: #2, see below.
>
> I tried to write it to be skimmable. ;)
>
>>> For instance:
>>>
>>> (use-package org-ac :after org)
>>> (use-package org)
>>
>> This is what I get when I `macroexpand' the first `use-package' call
>> with `use-package-always-defer' set to nil.
>
> Which I assumed is the default and goal (defer all packages until you
> need them).
>
>> [ If `u-p-a-defer' is set to t when I `macroexpand', the
>> `eval-after-load' call reduces to nil on expand-time because this
>> package is not installed, nor does `package.el' know how to install it
>> because I only have gnu and nongnu elpa configured. ]
>
> Understood
>
>> (progn
>>   (defvar use-package--warning3
>>     #'(lambda
>>         (keyword err)
>>         (let
>>             ((msg
>>               (format "%s/%s: %s" 'org-ac keyword
>>                       (error-message-string err))))
>>           (display-warning 'use-package msg :error))))
>>   (condition-case-unless-debug err
>>       (eval-after-load 'org
>>         '(if
>>              (not
>>               (require 'org-ac nil t))
>>              (display-warning 'use-package
>>                                (format "Cannot load %s" 'org-ac)
>>                                :error)))
>>     (error
>>      (funcall use-package--warning3 :catch err))))
>
> Hmm.
>
>> So, this might help you understand what is happening under the hood.
>> Essentially, it will try to load org-ac, only after *all packages*
>> listed in the :after section, showing a warning if loading org-ac fails.
>
> I presume the 'if' gets more complicated and more 'eval-after-load'
> calls are done if :after lists more than one item, correct?

Yes, see this snippet:

What I ran:
--8<---------------cut here---------------start------------->8---
(let ((use-package-always-defer nil) (use-package-always-ensure nil))
         (macroexpand-1 '(use-package foo :after (bar baz))))
--8<---------------cut here---------------end--------------->8---

What I got:
--8<---------------cut here---------------start------------->8---
(progn
  (defvar use-package--warning9
    #'(lambda
        (keyword err)
        (let
            ((msg
              (format "%s/%s: %s" 'foo keyword
                      (error-message-string err))))
          (display-warning 'use-package msg :error))))
  (condition-case-unless-debug err
      (eval-after-load 'baz
        '(eval-after-load 'bar
           '(if
                (not
                 (require 'foo nil t))
                (display-warning 'use-package
                                  (format "Cannot load %s" 'foo)
                                  :error))))
    (error
     (funcall use-package--warning9 :catch err))))
--8<---------------cut here---------------end--------------->8---

This also answers your question of "how to macroexpand".  There are also
the two functions 
`macroexpand' and `macroexpand-all' which you can try to use as well.

>> Keep in mind, according to the macroexpand result, that this also means
>> that if you load the subpackage `org-ac' manually (via a hook, autoload,
>> etc), it is not going to try to load `org' at all.  I feel that this is
>> kind of strange, but maybe it has its reasons.
>
> Hmm.
>
>> It seems that you opted to go with setting `u-p-a-defer' to t.  And
>> since you didn't mention :ensure at all, I assume you set `u-p-a-ensure'
>> to t as well.
>
> I'm looking at 'ensure'.  I currently use 'auto-update' package.
>
>> In this case, order doesn't _really_ matter, you just need to
>> `(use-package sub-pkg :after main-pkg :config your-other-configs)' on
>> all your subpackages.
>
> I thought I had.  I even had 'org' before 'org-ac' (but after
> 'auto-complete') in .emacs, but things weren't working right until I
> hand loaded 'org-ac'.  I'll have to test this some more.
>
> How did you do the macroexpand to debug this?  I haven't seen that
> technique.  Looks interesting.
>
>> Note, since you use `org' as an example, that you should probably
>> `(use-package org)' first thing in your init.el, because otherwise
>> something else is probably going to load builtin `org', and the Elpa
>> `org' will complain afterwards about mismatched versions.
>
> Yes, I ran into that.  I wound up removing the builtin manually.  I
> believe org has been trying to fix this.
>
> Thanks


-- 
Best,


RY



reply via email to

[Prev in Thread] Current Thread [Next in Thread]