I am removing this feature for now because it can result in a nasty
inconsistency. Consider the following definition:
(use-package vkill
:commands vkill
:idle (some-important-configuration-here)
:bind ("C-x L" . vkill-and-helm-occur)
:init
(defun vkill-and-helm-occur ()
(interactive)
(vkill)
(call-interactively #'helm-occur))
:config
(setq vkill-show-all-processes t))
If I load my Emacs and wait until the idle timer fires, then this is the
sequence of events:
:init :idle <load> :config
But if I load Emacs and immediately type C-x L without waiting for the
idle timer to fire, this is the sequence of events:
:init <load> :config :idle
It's possible that the user could use `featurep` in their idle to test
for this case, but that's a subtlety I'd rather avoid.
What I would consider is this: `:idle [N]` is a keyword that simply
implies `:defer`, with an option number of N to specify a second count.
After that many seconds, if the package has not yet been loaded by
autoloading, it will be loaded via the idle timer.
This approach has the benefit of complete consistency for both the idle
and the autoloaded cases. Although, the fact that it implies `:defer`
means we don't have to consider what it means to add `:idle` behavior to
a demand-loaded configuration.
This can be used to establish function and variable definitions that
will 1) make the byte-compiler happy (it won't complain about functions
whose definitions are unknown because you have them within a guard
block), and 2) allow you to define code that can be used in an `:if`
test.
The major change is that :init is now always performed before loading a
file, whether loading is deferred or not. This is a change from before,
where the semantics of :init varied between demand and defer. The new
usage is now entirely consistent.
Also, because :init and :config now mean "before" and "after", the
:pre-* and :post-* keywords are gone, as they should no longer be
necessary.
Lastly, an effort has been made to make your Emacs start even in the
presence of use-package configuration failures. So after this change,
be sure to check your *Messages* buffer. Most likely, you will have
several instances where you are using :init, but should be using :config
(this was the case for me in a number of places).