Merge pull request from conao3/add-commands-keyword

GitHub-reference: https://github.com/jwiegley/use-package/issues/917
This commit is contained in:
John Wiegley 2022-10-12 13:43:57 -04:00 committed by GitHub
commit c0338e06cd
2 changed files with 32 additions and 1 deletions

View file

@ -94,6 +94,7 @@
;; Any other keyword that also declares commands to be autoloaded (such as ;; Any other keyword that also declares commands to be autoloaded (such as
;; :bind) must appear before this keyword. ;; :bind) must appear before this keyword.
:commands :commands
:autoload
:init :init
:defer :defer
:demand :demand
@ -119,7 +120,8 @@ declaration is incorrect."
(defcustom use-package-deferring-keywords (defcustom use-package-deferring-keywords
'(:bind-keymap '(:bind-keymap
:bind-keymap* :bind-keymap*
:commands) :commands
:autoload)
"Unless `:demand' is used, keywords in this list imply deferred loading. "Unless `:demand' is used, keywords in this list imply deferred loading.
The reason keywords like `:hook' are not in this list is that The reason keywords like `:hook' are not in this list is that
they only imply deferred loading if they reference actual they only imply deferred loading if they reference actual
@ -1347,6 +1349,28 @@ meaning:
(delete-dups arg))) (delete-dups arg)))
(use-package-process-keywords name rest state))) (use-package-process-keywords name rest state)))
;;;; :autoload
(defalias 'use-package-normalize/:autoload 'use-package-normalize/:commands)
(defun use-package-handler/:autoload (name _keyword arg rest state)
(use-package-concat
;; Since we deferring load, establish any necessary autoloads, and also
;; keep the byte-compiler happy.
(let ((name-string (use-package-as-string name)))
(cl-mapcan
#'(lambda (command)
(when (symbolp command)
(append
(unless (plist-get state :demand)
`((unless (fboundp ',command)
(autoload #',command ,name-string))))
(when (bound-and-true-p byte-compile-current-file)
`((eval-when-compile
(declare-function ,command ,name-string)))))))
(delete-dups arg)))
(use-package-process-keywords name rest state)))
;;;; :defer ;;;; :defer
(defalias 'use-package-normalize/:defer 'use-package-normalize-predicate) (defalias 'use-package-normalize/:defer 'use-package-normalize-predicate)
@ -1633,6 +1657,7 @@ this file. Usage:
package. This is useful if the package is being lazily package. This is useful if the package is being lazily
loaded, and you wish to conditionally call functions in your loaded, and you wish to conditionally call functions in your
`:init' block that are defined in the package. `:init' block that are defined in the package.
:autoload Similar to :commands, but it for no-interactive one.
:hook Specify hook(s) to attach this package to. :hook Specify hook(s) to attach this package to.
:bind Bind keys, and define autoloads for the bound commands. :bind Bind keys, and define autoloads for the bound commands.

View file

@ -875,6 +875,12 @@
(gnus-harvest-install)) (gnus-harvest-install))
t)))) t))))
(ert-deftest use-package-test/:autoload-1 ()
(match-expansion
(use-package foo :autoload bar)
`(unless (fboundp 'bar)
(autoload #'bar "foo"))))
(ert-deftest use-package-test/:defines-1 () (ert-deftest use-package-test/:defines-1 ()
(match-expansion (match-expansion
(use-package foo :defines bar) (use-package foo :defines bar)