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).
In the macro `use-package-with-elapased-timer' use `bound-and-true-p'
go get the values of the customizable options `use-package-verbose'
and `use-package-minimum-reported-time'. This way the library only
has to be required at compile time, provided these options are not
actually customized. If the user has changed the values, then she
also has to load the library at runtime or the macros fall back to
the default of doing their job silently. See https://github.com/jwiegley/use-package/issues/149.
http://emacs.stackexchange.com/a/3596
Quoting lambda expressions is at best redundant and at worst
detrimental; this commit removes all use of the sharp-quote to reduce
confusion.
Since `declare-function' was added in Emacs 23.1 (five years ago), we
don't need to assert that it is defined. If the assertion was without
any problems there would be no harm in keeping it, but unfortunately it
causes a compile warning. Because `declare-function' is a macro with
always expands to `nil' the value of (fboundp 'declare-function) ends
up being unused.
* use-package.el (use-package-plist-get): add optional args: `eval-backquote'
and `no-progn' to control how arguments are retrieved.
(use-package-plist-get-value): remove this function
(use-package): replace calls to old function to modified function.
Fixes issue https://github.com/jwiegley/use-package/issues/94.
Rationale :
- use-package-plist-get-value was just another layer for no good reason,
and IMO its name was totally unclear.
- we now eval-as-backquote earlier, allowing constructs like:
(let ((my-list-of-commands-in-foo '(foo1 foo2)))
(use-package foo :commands ,@my-list-of-commands-in-foo))
* use-package.el (use-package-idle-interval): new defcustom
(use-package-start-idle-timer): use it
(use-package-idle-eval): use it
* README.md: document it
This addresses bug https://github.com/jwiegley/use-package/issues/77
Lower-priority idle functions are run first. Idle functions with no
specified priority default to 5 and all functions with the same priority
are run in the order in which they are evaluated, meaning the behaviour
is backwards compatible.
Updated documentation as well.
Previously the option `use-package-verbose' was consulted at macro
expansion time, and as a result customizing the option did nothing,
without also recompiling `use-package.el'.
* use-package.el (use-package-mplist-get):
(use-package-plist-get):
(use-package-mplist-keys): new functions
(plist-get-value):
(use-package): use new functions
(plist-keys): remove function
The idea is to allow a modified kind of plist where keys are all
keywords that appear in the list, and values are the intermediary
elements. If a keyword is present but it's another keyword just after it
(like (use-package :defer :config (setq foo 'bar))), its associated
value will be t. If a keyword is not present, its value associated value
will be nil. Otherwise the value will be the list of elements between
the keyword and the next keyword.
The documentation in README.md was previously identical to that
in the Commentary section of use-package.el, modulo the following
differences:
- No elisp comment ";; " prefix
- Code blocks indented 4 columns not 2, as required by Markdown
- Elisp symbols marked in backtick delimiters for monospace, not
emacs backtick/forward tick pairs.
Unfortunately due to this duplication, sometimes only one of the
two files got updated, so they got out of sync. With us all being
human, this is likely to continue to happen as long as the
duplication exists ;-) Therefore since most users are likely to
encounter README.md before the elisp, and bearing in mind that
Markdown is a much more flexible format for documentation than
elisp comments (richer formatting, can be exported to numerous
other formats etc.), it is better to replace the docs in
use-package.el with a pointer to the README.md.
When `use-package' is called with only one keyword it is useful to
write:
(use-package foo :init
(progn
... long lines ...))
instead of
(use-package foo
:init (progn
... *too* long lines ...))
or
(use-package foo
:init
(progn
... long lines ...))
Even when there are multiple keywords or when one never wants to format
the calls to `use-package' as in the first example the use of `defun'
does not really pose a problem.