Skip to content

Commit

Permalink
Merge pull request from joewreschnig/477-delight-wrappers
Browse files Browse the repository at this point in the history
Allow multiple :delight arguments, or omitting the mode. (jwiegley/use-package#477)
GitHub-reference: jwiegley/use-package#480
  • Loading branch information
jwiegley committed Jul 2, 2017
2 parents ed55eb3 + 27fa4ee commit 3f72951
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 13 deletions.
56 changes: 43 additions & 13 deletions lisp/use-package/use-package.el
Expand Up @@ -330,6 +330,14 @@ convert it to a string and return that."
(if (stringp string-or-symbol) string-or-symbol
(symbol-name string-or-symbol)))

(defun use-package-as-mode (string-or-symbol)
"If STRING-OR-SYMBOL ends in `-mode' (or its name does), return
it as a symbol. Otherwise, return it as a symbol with `-mode'
appended."
(let ((string (use-package-as-string string-or-symbol)))
(intern (if (string-match "-mode\\'" string) string
(concat string "-mode")))))

(defun use-package-load-name (name &optional noerror)
"Return a form which will load or require NAME depending on
whether it's a string or symbol."
Expand Down Expand Up @@ -1435,26 +1443,48 @@ deferred until the prefix key sequence is pressed."
;;; :delight
;;

(defun use-package--normalize-delight-1 (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) (symbolp (car args)))
`(,(nth 0 args) nil ,name))
((= (length args) 2)
`(,(nth 0 args) ,(nth 1 args) ,name))
((= (length args) 3)
args)
(t
(use-package-error
":delight expects `delight' arguments or a list of them"))))

(defun use-package-normalize/:delight (name keyword args)
"Normalize arguments to delight."
(cond
((and (= (length args) 1)
(symbolp (car args)))
(list (car args) nil name))
((and (= (length args) 2)
(symbolp (car args)))
(list (car args) (cadr args) (use-package-as-symbol name)))
((and (= (length args) 3)
(symbolp (car args)))
args)
(t
(use-package-error ":delight expects same args as delight function"))))
(cond ((null args)
`((,(use-package-as-mode name) nil ,name)))
((and (= (length args) 1)
(symbolp (car args)))
`((,(car args) nil ,name)))
((and (= (length args) 1)
(stringp (car args)))
`((,(use-package-as-mode name) ,(car args) ,name)))
((and (= (length args) 1)
(listp (car args))
(eq 'quote (caar args)))
`((,(use-package-as-mode name) ,@(cdar args) ,name)))
((and (= (length args) 2)
(listp (nth 1 args))
(eq 'quote (car (nth 1 args))))
`((,(car args) ,@(cdr (nth 1 args)) ,name)))
(t (mapcar
(apply-partially #'use-package--normalize-delight-1 name)
(if (symbolp (car args)) (list args) args)))))

(defun use-package-handler/:delight (name keyword args rest state)
(let ((body (use-package-process-keywords name rest state)))
(use-package-concat
body
`((delight (quote ,(nth 0 args)) ,(nth 1 args) (quote ,(nth 2 args))) t))))
`((delight '(,@args))))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
Expand Down
21 changes: 21 additions & 0 deletions test/lisp/use-package/use-package-tests.el
Expand Up @@ -51,6 +51,27 @@
(should (equal (use-package-normalize-mode 'foopkg :mode '((".foo" . foo) (".bar" . bar)))
'((".foo" . foo) (".bar" . bar)))))

(ert-deftest use-package-normalize-delight ()
(should (equal `((foo-mode nil foo))
(use-package-normalize/:delight 'foo :delight nil)))
(should (equal `((foo-mode nil foo-mode))
(use-package-normalize/:delight 'foo-mode :delight nil)))
(should (equal `((bar-mode nil foo))
(use-package-normalize/:delight 'foo :delight '(bar-mode))))
(should (equal `((bar-mode nil :major))
(use-package-normalize/:delight 'foo :delight '((bar-mode nil :major)))))
(should (equal `((foo-mode "abc" foo))
(use-package-normalize/:delight 'foo :delight '("abc"))))
(should (equal `((foo-mode (:eval 1) foo))
(use-package-normalize/:delight 'foo :delight '('(:eval 1)))))
(should (equal `((a-mode nil foo)
(b-mode " b" foo))
(use-package-normalize/:delight 'foo :delight '((a-mode)
(b-mode " b")))))
(should-error (use-package-normalize/:delight 'foo :delight '((:eval 1))))

)

;; Local Variables:
;; indent-tabs-mode: nil
;; no-byte-compile: t
Expand Down

0 comments on commit 3f72951

Please sign in to comment.