Next: Customizing built-in variables, Previous: Loading packages conditionally, Up: Loading Packages [Contents][Index]
Sometimes it only makes sense to configure a package after another one
has been loaded, because certain variables or functions are not in
scope until that time. This can be achieved with the :after
keyword, which allows a fairly rich description of the exact
conditions when loading should occur. The :after keyword takes
as argument either a symbol indicating the package name, a list of
such symbols, or a list of selectors (see below).
Here is an example of using the GNU ELPA packages hydra, ivy, and ivy-hydra. Note that ivy-hydra will always be loaded last:
(use-package hydra) (use-package ivy)
(use-package ivy-hydra :after (ivy hydra))
In this case, because the declarations are evaluated in the order they
occur, the use of :after is not strictly necessary. However,
if ‘hydra’ and ‘ivy’ were to be autoloaded, using
:after guarantees that ‘ivy-hydra’ is not loaded until it
is actually needed. By using :after, the above code will also
work even if the order of the declaration changes. This means that
moving things around in your init file is less likely to break things.
:after selectorsThe :after keyword also accepts a list of selectors. By
default, :after (foo bar) is the same as :after (:all foo bar), meaning that loading of the given package will not happen
until both foo and bar have been loaded. Here are some
of the other possibilities:
:after (foo bar) :after (:all foo bar) :after (:any foo bar) :after (:all (:any foo bar) (:any baz quux)) :after (:any (:all foo bar) (:all baz quux))
When you nest selectors, such as in (:any (:all foo bar) (:all baz quux)), it means that the package will be loaded when
either both foo and bar have been loaded, or when both
baz and quux have been loaded.
Pay attention when setting use-package-always-defer to a
non-nil value, and also using the :after keyword. In
that case, you will need to specify how the declared package is to be
loaded: for example, by some :bind (see Global keybindings). If you are not using one of the keywords that
registers autoloads, such as :bind or :hook
(see Hooks), and your package manager does not provide autoloads,
it is possible that your package will never be loaded if you do not
add :demand t to those declarations.
Next: Customizing built-in variables, Previous: Loading packages conditionally, Up: Loading Packages [Contents][Index]