Change most use-package-- prefixes to just use-package-

This commit is contained in:
John Wiegley 2017-12-03 10:58:06 -08:00
parent d5c1fdf4e8
commit 149c4878fc

View file

@ -1,4 +1,4 @@
;;; use-package.el --- A use-package declaration for simplifying your .emacs
;;; use-package.el --- A configuration macro for simplifying your .emacs
;; Copyright (C) 2012-2017 John Wiegley
@ -260,7 +260,7 @@ be attempted."
"Regexp used in `use-package-jump-to-package-form' to find use
package forms in user files.")
(defun use-package--find-require (package)
(defun use-package-find-require (package)
"Find file that required PACKAGE by searching
`load-history'. Returns an absolute file path or nil if none is
found."
@ -278,7 +278,7 @@ function will jump to the file that originally required PACKAGE
instead."
(interactive (list (completing-read "Package: " features)))
(let* ((package (if (stringp package) (intern package) package))
(requiring-file (use-package--find-require package))
(requiring-file (use-package-find-require package))
file location)
(if (null requiring-file)
(user-error "Can't find file that requires this feature.")
@ -343,24 +343,7 @@ ARGS is a list of forms, so `((foo))' if only `foo' is being called."
',(intern (concat "use-package--" name-string
"--post-" keyword-name "-hook"))))))))
(defun use-package--require (name &optional no-require body)
(if use-package-expand-minimally
(use-package-concat
(unless no-require
(list (use-package-load-name name)))
body)
(if no-require
body
(use-package--with-elapsed-timer
(format "Loading package %s" name)
`((if (not ,(use-package-load-name name t))
(ignore
(display-warning 'use-package
(format "Cannot load %s" ',name)
:error))
,@body))))))
(defun use-package--with-elapsed-timer (text body)
(defun use-package-with-elapsed-timer (text body)
"BODY is a list of forms, so `((foo))' if only `foo' is being called."
(declare (indent 1))
(if use-package-expand-minimally
@ -378,7 +361,24 @@ ARGS is a list of forms, so `((foo))' if only `foo' is being called."
(message "%s...done" ,text))))))
body))))
(put 'use-package--with-elapsed-timer 'lisp-indent-function 1)
(put 'use-package-with-elapsed-timer 'lisp-indent-function 1)
(defun use-package-require (name &optional no-require body)
(if use-package-expand-minimally
(use-package-concat
(unless no-require
(list (use-package-load-name name)))
body)
(if no-require
body
(use-package-with-elapsed-timer
(format "Loading package %s" name)
`((if (not ,(use-package-load-name name t))
(ignore
(display-warning 'use-package
(format "Cannot load %s" ',name)
:error))
,@body))))))
(defsubst use-package-error (msg)
"Report MSG as an error, so the user knows it came from this package."
@ -459,7 +459,7 @@ This is in contrast to merely setting it to 0."
"Delete all empty lists from ELEMS (nil or (list nil)), and append them."
(apply #'append (delete nil (delete (list nil) elems))))
(defsubst use-package--non-nil-symbolp (sym)
(defsubst use-package-non-nil-symbolp (sym)
(and sym (symbolp sym)))
(defconst use-package-font-lock-keywords
@ -474,6 +474,86 @@ This is in contrast to merely setting it to 0."
;;; Keyword processing
;;
(defun use-package-unalias-keywords (name args)
(setq args (cl-nsubstitute :if :when args))
(let (temp)
(while (setq temp (plist-get args :unless))
(setq args (use-package-plist-delete-first args :unless)
args (append args `(:if (not ,temp))))))
args)
(defun use-package-merge-keys (key new old)
(pcase key
(`:if `(and ,new ,old))
(`:after `(:all ,new ,old))
(`:defer old)
(_ (append new old))))
(defun use-package-normalize-keywords (name args)
(let* ((name-symbol (if (stringp name) (intern name) name))
(name-string (symbol-name name-symbol)))
;; Reduce the set of keywords down to its most fundamental expression.
(setq args (use-package-unalias-keywords name-symbol args))
;; Normalize keyword values, coalescing multiple occurrences.
(setq args (use-package-normalize-plist name-symbol args nil
#'use-package-merge-keys))
;; Add default values for keywords not specified, when applicable.
(dolist (spec use-package-defaults)
(when (pcase (nth 2 spec)
((and func (pred functionp)) (funcall func args))
(sexp (eval sexp)))
(setq args (use-package-plist-maybe-put
args (nth 0 spec) (eval (nth 1 spec))))))
;; If byte-compiling, pre-load the package so all its symbols are in
;; scope. This is done by prepending statements to the :preface.
(when (bound-and-true-p byte-compile-current-file)
(setq args
(use-package-plist-append
args :preface
(use-package-concat
(mapcar #'(lambda (var) `(defvar ,var))
(plist-get args :defines))
(mapcar #'(lambda (fn) `(declare-function ,fn ,name-string))
(plist-get args :functions))
`((eval-when-compile
(with-demoted-errors
,(format "Cannot load %s: %%S" name-string)
,(when (eq use-package-verbose 'debug)
`(message ,(format "Compiling package %s" name-string)))
,(unless (plist-get args :no-require)
`(load ,name-string nil t)))))))))
;; Certain keywords imply :defer, if :demand was not specified.
(when (and (not (plist-member args :demand))
(not (plist-member args :defer))
(or (plist-member args :bind)
(plist-member args :bind*)
(plist-member args :bind-keymap)
(plist-member args :bind-keymap*)
(plist-member args :interpreter)
(plist-member args :mode)
(plist-member args :magic)
(plist-member args :magic-fallback)
(plist-member args :commands)
(plist-member args :hook)))
(setq args (append args '(:defer t))))
(when (and (plist-member args :load)
(plist-member args :no-require))
(setq args (use-package-plist-delete args :no-require)))
(when (and (not (plist-member args :load))
(not (plist-member args :defer))
(not (plist-member args :no-require)))
(setq args (append args `(:load (,name)))))
;; Sort the list of keywords based on the order of `use-package-keywords'.
(use-package-sort-keywords args)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Normalization functions
@ -589,7 +669,7 @@ next value for the STATE."
#'(lambda (label arg)
(cond
((stringp arg) arg)
((use-package--non-nil-symbolp arg) (symbol-name arg))
((use-package-non-nil-symbolp arg) (symbol-name arg))
(t
(use-package-error
":pin wants an archive name (a string)"))))))
@ -598,7 +678,7 @@ next value for the STATE."
(defvar package-pinned-packages)
(defvar package-archives))
(defun use-package--archive-exists-p (archive)
(defun use-package-archive-exists-p (archive)
"Check if a given ARCHIVE is enabled.
ARCHIVE can be a string or a symbol or 'manual to indicate a
@ -617,7 +697,7 @@ manually updated package."
(setq package-pinned-packages ()))
(let ((archive-symbol (if (symbolp archive) archive (intern archive)))
(archive-name (if (stringp archive) archive (symbol-name archive))))
(if (use-package--archive-exists-p archive-symbol)
(if (use-package-archive-exists-p archive-symbol)
(add-to-list 'package-pinned-packages (cons package archive-name))
(error "Archive '%s' requested for package '%s' is not available."
archive-name package))
@ -702,7 +782,7 @@ manually updated package."
"Normalize a value."
(cond ((null arg) nil)
((eq t arg) t)
((use-package--non-nil-symbolp arg)
((use-package-non-nil-symbolp arg)
`(symbol-value ',arg))
((functionp arg)
`(funcall #',arg))
@ -749,7 +829,7 @@ If ALLOW-EMPTY is non-nil, it's OK for ARGS to be an empty list."
(defun use-package-normalize-symbols (label arg &optional recursed)
"Normalize a list of symbols."
(cond
((use-package--non-nil-symbolp arg)
((use-package-non-nil-symbolp arg)
(list arg))
((and (not recursed) (listp arg) (listp (cdr arg)))
(mapcar #'(lambda (x) (car (use-package-normalize-symbols label x t))) arg))
@ -764,7 +844,7 @@ If ALLOW-EMPTY is non-nil, it's OK for ARGS to be an empty list."
(defun use-package-normalize-recursive-symbols (label arg)
"Normalize a list of symbols."
(cond
((use-package--non-nil-symbolp arg)
((use-package-non-nil-symbolp arg)
arg)
((and (listp arg) (listp (cdr arg)))
(mapcar #'(lambda (x) (use-package-normalize-recursive-symbols label x))
@ -796,7 +876,7 @@ If ALLOW-EMPTY is non-nil, it's OK for ARGS to be an empty list."
(defun use-package-normalize-paths (label arg &optional recursed)
"Normalize a list of filesystem paths."
(cond
((and arg (or (use-package--non-nil-symbolp arg) (functionp arg)))
((and arg (or (use-package-non-nil-symbolp arg) (functionp arg)))
(let ((value (use-package-normalize-value label arg)))
(use-package-normalize-paths label (eval value))))
((stringp arg)
@ -937,7 +1017,7 @@ If RECURSED is non-nil, recurse into sublists."
(setq last-item x))) arg)))
(t arg)))
(defun use-package--recognize-function (v &optional binding additional-pred)
(defun use-package-recognize-function (v &optional binding additional-pred)
"A predicate that recognizes functional constructions:
nil
sym
@ -953,14 +1033,14 @@ If RECURSED is non-nil, recurse into sublists."
(pcase v
((and x (guard (if binding
(symbolp x)
(use-package--non-nil-symbolp x)))) t)
(use-package-non-nil-symbolp x)))) t)
(`(,(or `quote `function)
,(pred use-package--non-nil-symbolp)) t)
,(pred use-package-non-nil-symbolp)) t)
((and x (guard (if binding (commandp x) (functionp x)))) t)
(_ (and additional-pred
(funcall additional-pred v)))))
(defun use-package--normalize-function (v)
(defun use-package-normalize-function (v)
"Reduce functional constructions to one of two normal forms:
sym
#'(lambda () ...)"
@ -973,7 +1053,7 @@ If RECURSED is non-nil, recurse into sublists."
(`(function ,(and lam `(lambda . ,_))) lam)
(_ v)))
(defun use-package--normalize-commands (args)
(defun use-package-normalize-commands (args)
"Map over ARGS of the form ((_ . F) ...).
Normalizing functional F's and returning a list of F's
representing symbols (that may need to be autloaded)."
@ -981,14 +1061,14 @@ representing symbols (that may need to be autloaded)."
#'(lambda (x)
(if (consp x)
(cons (car x)
(use-package--normalize-function (cdr x)))
(use-package-normalize-function (cdr x)))
x)) args)))
(cons nargs
(delete
nil (mapcar
#'(lambda (x)
(and (consp x)
(use-package--non-nil-symbolp (cdr x))
(use-package-non-nil-symbolp (cdr x))
(cdr x))) nargs)))))
(defun use-package-normalize-binder (name keyword args)
@ -1003,7 +1083,7 @@ representing symbols (that may need to be autloaded)."
(pcase k
((pred stringp) t)
((pred vectorp) t)))
#'(lambda (v) (use-package--recognize-function v t #'stringp))
#'(lambda (v) (use-package-recognize-function v t #'stringp))
name label arg))))
(defalias 'use-package-normalize/:bind 'use-package-normalize-binder)
@ -1012,7 +1092,7 @@ representing symbols (that may need to be autloaded)."
(defun use-package-handler/:bind
(name keyword args rest state &optional bind-macro)
(cl-destructuring-bind (nargs . commands)
(use-package--normalize-commands args)
(use-package-normalize-commands args)
(use-package-concat
(use-package-process-keywords name
(use-package-sort-keywords
@ -1036,15 +1116,15 @@ representing symbols (that may need to be autloaded)."
;;;###autoload
(defun use-package-autoload-keymap (keymap-symbol package override)
"Loads PACKAGE and then binds the key sequence used to invoke
this function to KEYMAP-SYMBOL. It then simulates pressing the
same key sequence a again, so that the next key pressed is routed
to the newly loaded keymap.
this function to KEYMAP-SYMBOL. It then simulates pressing the
same key sequence a again, so that the next key pressed is routed
to the newly loaded keymap.
This function supports use-package's :bind-keymap keyword. It
works by binding the given key sequence to an invocation of this
function for a particular keymap. The keymap is expected to be
defined by the package. In this way, loading the package is
deferred until the prefix key sequence is pressed."
This function supports use-package's :bind-keymap keyword. It
works by binding the given key sequence to an invocation of this
function for a particular keymap. The keymap is expected to be
defined by the package. In this way, loading the package is
deferred until the prefix key sequence is pressed."
(if (not (require package nil t))
(use-package-error (format "Cannot load package.el: %s" package))
(if (and (boundp keymap-symbol)
@ -1092,13 +1172,13 @@ representing symbols (that may need to be autloaded)."
(use-package-as-one (symbol-name keyword) args
(apply-partially #'use-package-normalize-pairs
#'use-package-regex-p
#'use-package--recognize-function
#'use-package-recognize-function
name)))
(defun use-package-handle-mode (name alist args rest state)
"Handle keywords which add regexp/mode pairs to an alist."
(cl-destructuring-bind (nargs . commands)
(use-package--normalize-commands args)
(use-package-normalize-commands args)
(use-package-concat
(mapcar
#'(lambda (thing)
@ -1155,27 +1235,27 @@ representing symbols (that may need to be autloaded)."
(defun use-package-normalize/:hook (name keyword args)
(use-package-as-one (symbol-name keyword) args
#'(lambda (label arg)
(unless (or (use-package--non-nil-symbolp arg) (consp arg))
(unless (or (use-package-non-nil-symbolp arg) (consp arg))
(use-package-error
(concat label " a <symbol> or (<symbol or list of symbols> . <symbol or function>)"
" or list of these")))
(use-package-normalize-pairs
#'(lambda (k)
(or (use-package--non-nil-symbolp k)
(or (use-package-non-nil-symbolp k)
(and k (let ((every t))
(while (and every k)
(if (and (consp k)
(use-package--non-nil-symbolp (car k)))
(use-package-non-nil-symbolp (car k)))
(setq k (cdr k))
(setq every nil)))
every))))
#'use-package--recognize-function
#'use-package-recognize-function
name label arg))))
(defun use-package-handler/:hook (name keyword args rest state)
"Generate use-package custom keyword code."
(cl-destructuring-bind (nargs . commands)
(use-package--normalize-commands args)
(use-package-normalize-commands args)
(use-package-concat
(cl-mapcan
#'(lambda (def)
@ -1186,7 +1266,7 @@ representing symbols (that may need to be autloaded)."
#'(lambda (sym)
`(add-hook (quote ,(intern (format "%s-hook" sym)))
(function ,fun)))
(if (use-package--non-nil-symbolp syms) (list syms) syms)))))
(if (use-package-non-nil-symbolp syms) (list syms) syms)))))
nargs)
(use-package-process-keywords name
(use-package-sort-keywords
@ -1235,7 +1315,7 @@ representing symbols (that may need to be autloaded)."
',(use-package-as-symbol name) nil t)))
(if (or (not arg) (null body))
body
(list (use-package--require-after-load
(list (use-package-require-after-load
name (macroexp-progn body)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -1249,42 +1329,42 @@ representing symbols (that may need to be autloaded)."
args
(list args)))
(defun use-package--after-count-uses (features)
(defun use-package-after-count-uses (features)
"Count the number of time the body would appear in the result."
(pcase features
((and (pred use-package--non-nil-symbolp) feat)
((and (pred use-package-non-nil-symbolp) feat)
1)
(`(,(or `:or `:any) . ,rest)
(let ((num 0))
(dolist (next rest)
(setq num (+ num (use-package--after-count-uses next))))
(setq num (+ num (use-package-after-count-uses next))))
num))
(`(,(or `:and `:all) . ,rest)
(apply #'max (mapcar #'use-package--after-count-uses rest)))
(apply #'max (mapcar #'use-package-after-count-uses rest)))
(`(,feat . ,rest)
(use-package--after-count-uses (cons :all (cons feat rest))))))
(use-package-after-count-uses (cons :all (cons feat rest))))))
(defun use-package--require-after-load (features body)
(defun use-package-require-after-load (features body)
"Generate `eval-after-load' statements to represents FEATURES.
FEATURES is a list containing keywords `:and' and `:all', where
no keyword implies `:all'."
(pcase features
((and (pred use-package--non-nil-symbolp) feat)
((and (pred use-package-non-nil-symbolp) feat)
`(eval-after-load ',feat
,(if (member (car body) '(quote backquote \' \`))
body
(list 'quote body))))
(`(,(or `:or `:any) . ,rest)
(macroexp-progn
(mapcar #'(lambda (x) (use-package--require-after-load x body)) rest)))
(mapcar #'(lambda (x) (use-package-require-after-load x body)) rest)))
(`(,(or `:and `:all) . ,rest)
(dolist (next rest)
(setq body (use-package--require-after-load next body)))
(setq body (use-package-require-after-load next body)))
body)
(`(,feat . ,rest)
(use-package--require-after-load (cons :all (cons feat rest)) body))))
(use-package-require-after-load (cons :all (cons feat rest)) body))))
(defun use-package--memoize (f arg)
(defun use-package-memoize (f arg)
"Ensure the macro-expansion of F applied to ARG evaluates ARG
no more than once."
(let ((loaded (gensym "use-package--loaded"))
@ -1300,14 +1380,14 @@ no more than once."
(defun use-package-handler/:after (name keyword arg rest state)
(let ((body (use-package-process-keywords name rest state))
(uses (use-package--after-count-uses arg)))
(uses (use-package-after-count-uses arg)))
(if (or (null uses) (null body))
body
(if (<= uses 1)
(list (use-package--require-after-load
(list (use-package-require-after-load
arg (list 'quote (macroexp-progn body))))
(use-package--memoize
(apply-partially #'use-package--require-after-load arg)
(use-package-memoize
(apply-partially #'use-package-require-after-load arg)
(macroexp-progn body))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -1333,7 +1413,7 @@ no more than once."
(use-package-error
(concat label " a (<symbol> <value> [comment])"
" or list of these")))
(if (use-package--non-nil-symbolp (car arg))
(if (use-package-non-nil-symbolp (car arg))
(list arg)
arg))))
@ -1409,7 +1489,7 @@ no more than once."
(defun use-package-handler/:load (name keyword arg rest state)
(let ((body (use-package-process-keywords name rest state)))
(dolist (pkg arg)
(setq body (use-package--require pkg nil body)))
(setq body (use-package-require pkg nil body)))
body))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -1425,7 +1505,7 @@ no more than once."
(if (or (null arg)
(equal arg '(t)))
body
(use-package--with-elapsed-timer
(use-package-with-elapsed-timer
(format "Configuring package %s" name-symbol)
(use-package-concat
(use-package-hook-injector
@ -1445,7 +1525,7 @@ no more than once."
(cond
((not arg)
(list (use-package-as-mode name)))
((use-package--non-nil-symbolp arg)
((use-package-non-nil-symbolp arg)
(list arg))
((stringp arg)
(list (cons (use-package-as-mode name) arg)))
@ -1479,13 +1559,13 @@ no more than once."
;;; :delight
;;
(defun use-package--normalize-delight-1 (name args)
(defun use-package-normalize-delight (name args)
"Normalize ARGS for a single call to `delight'."
(when (eq :eval (car args))
;; Handle likely common mistake.
(use-package-error ":delight mode line constructs must be quoted"))
(cond ((and (= (length args) 1)
(use-package--non-nil-symbolp (car args)))
(use-package-non-nil-symbolp (car args)))
`(,(nth 0 args) nil ,name))
((= (length args) 2)
`(,(nth 0 args) ,(nth 1 args) ,name))
@ -1500,7 +1580,7 @@ no more than once."
(cond ((null args)
`((,(use-package-as-mode name) nil ,name)))
((and (= (length args) 1)
(use-package--non-nil-symbolp (car args)))
(use-package-non-nil-symbolp (car args)))
`((,(car args) nil ,name)))
((and (= (length args) 1)
(stringp (car args)))
@ -1514,8 +1594,8 @@ no more than once."
(eq 'quote (car (nth 1 args))))
`((,(car args) ,@(cdr (nth 1 args)) ,name)))
(t (mapcar
(apply-partially #'use-package--normalize-delight-1 name)
(if (use-package--non-nil-symbolp (car args))
(apply-partially #'use-package-normalize-delight name)
(if (use-package-non-nil-symbolp (car args))
(list args)
args)))))
@ -1531,87 +1611,7 @@ no more than once."
;;; The main macro
;;
(defun use-package-unalias-keywords (name args)
(setq args (cl-nsubstitute :if :when args))
(let (temp)
(while (setq temp (plist-get args :unless))
(setq args (use-package-plist-delete-first args :unless)
args (append args `(:if (not ,temp))))))
args)
(defun use-package--merge-keys (key new old)
(pcase key
(`:if `(and ,new ,old))
(`:after `(:all ,new ,old))
(`:defer old)
(_ (append new old))))
(defun use-package-normalize-keywords (name args)
(let* ((name-symbol (if (stringp name) (intern name) name))
(name-string (symbol-name name-symbol)))
;; Reduce the set of keywords down to its most fundamental expression.
(setq args (use-package-unalias-keywords name-symbol args))
;; Normalize keyword values, coalescing multiple occurrences.
(setq args (use-package-normalize-plist name-symbol args nil
#'use-package--merge-keys))
;; Add default values for keywords not specified, when applicable.
(dolist (spec use-package-defaults)
(when (pcase (nth 2 spec)
((and func (pred functionp)) (funcall func args))
(sexp (eval sexp)))
(setq args (use-package-plist-maybe-put
args (nth 0 spec) (eval (nth 1 spec))))))
;; If byte-compiling, pre-load the package so all its symbols are in
;; scope. This is done by prepending statements to the :preface.
(when (bound-and-true-p byte-compile-current-file)
(setq args
(use-package-plist-append
args :preface
(use-package-concat
(mapcar #'(lambda (var) `(defvar ,var))
(plist-get args :defines))
(mapcar #'(lambda (fn) `(declare-function ,fn ,name-string))
(plist-get args :functions))
`((eval-when-compile
(with-demoted-errors
,(format "Cannot load %s: %%S" name-string)
,(when (eq use-package-verbose 'debug)
`(message ,(format "Compiling package %s" name-string)))
,(unless (plist-get args :no-require)
`(load ,name-string nil t)))))))))
;; Certain keywords imply :defer, if :demand was not specified.
(when (and (not (plist-member args :demand))
(not (plist-member args :defer))
(or (plist-member args :bind)
(plist-member args :bind*)
(plist-member args :bind-keymap)
(plist-member args :bind-keymap*)
(plist-member args :interpreter)
(plist-member args :mode)
(plist-member args :magic)
(plist-member args :magic-fallback)
(plist-member args :commands)
(plist-member args :hook)))
(setq args (append args '(:defer t))))
(when (and (plist-member args :load)
(plist-member args :no-require))
(setq args (use-package-plist-delete args :no-require)))
(when (and (not (plist-member args :load))
(not (plist-member args :defer))
(not (plist-member args :no-require)))
(setq args (append args `(:load (,name)))))
;; Sort the list of keywords based on the order of `use-package-keywords'.
(use-package-sort-keywords args)))
(defun use-package--core (name args)
(defun use-package-core (name args)
(let ((orig-args (cl-copy-list args)))
(setq args (use-package-normalize-keywords name args))
(let ((body (macroexp-progn
@ -1701,16 +1701,14 @@ this file. Usage:
(declare (indent 1))
(unless (memq :disabled args)
(if (eq use-package-verbose 'errors)
(use-package--core name args)
(use-package-core name args)
(condition-case-unless-debug err
(use-package--core name args)
(use-package-core name args)
(error
(ignore
(display-warning
'use-package
(format "Failed to parse package %s %s: %s"
name args (error-message-string err))
:error)))))))
(let ((msg (format "Failed to parse package %s %s: %s"
name args (error-message-string err))))
(display-warning 'use-package msg :error))))))))
(put 'use-package 'lisp-indent-function 'defun)