use-package
use-package copied to clipboard
:custom-face can't be a list?
Version: commit 42db6b, 20191126.2034, from MELPA
Emacs version: GNU Emacs 27.0.90 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.13, cairo version 1.16.0) of 2020-03-05
With :custom I can use a list like this:
(use-package rainbow-delimiters
:custom ((rainbow-delimiters-max-face-count 2)
(rainbow-delimiters-outermost-only-face-count 0)))
But when I try to do the same with :custom-faces like this:
(use-package rainbow-delimiters
:custom-face ((rainbow-delimiters-depth-1-face
((t (:inherit rainbow-delimiters-base-face
:foreground "LightPink"))))
(rainbow-delimiters-depth-2-face
((t (:inherit rainbow-delimiters-base-face
:foreground "LightGreen"))))))
I get this error:
Debugger entered--Lisp error: (wrong-type-argument symbolp (rainbow-delimiters-depth-1-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightPink")))))
custom-theme-set-faces(user ((rainbow-delimiters-depth-1-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightPink")))) (rainbow-delimiters-depth-2-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightGreen"))))))
apply(custom-theme-set-faces user ((rainbow-delimiters-depth-1-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightPink")))) (rainbow-delimiters-depth-2-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightGreen"))))))
custom-set-faces(((rainbow-delimiters-depth-1-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightPink")))) (rainbow-delimiters-depth-2-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightGreen"))))))
(progn (custom-set-faces '((rainbow-delimiters-depth-1-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightPink")))) (rainbow-delimiters-depth-2-face ((t (:inherit rainbow-delimiters-base-face :foreground "LightGreen")))))) (if (not (require 'rainbow-delimiters nil t)) (display-warning 'use-package (format "Cannot load %s" 'rainbow-delimiters) :error)))
(condition-case err (progn (custom-set-faces '((rainbow-delimiters-depth-1-face ((t ...))) (rainbow-delimiters-depth-2-face ((t ...))))) (if (not (require 'rainbow-delimiters nil t)) (display-warning 'use-package (format "Cannot load %s" 'rainbow-delimiters) :error))) ((debug error) (funcall use-package--warning125 :catch err)))
(progn (use-package-ensure-elpa 'rainbow-delimiters '(t) 'nil) (defvar use-package--warning125 #'(lambda (keyword err) (let ((msg (format "%s/%s: %s" ... keyword ...))) (display-warning 'use-package msg :error)))) (condition-case err (progn (custom-set-faces '((rainbow-delimiters-depth-1-face (...)) (rainbow-delimiters-depth-2-face (...)))) (if (not (require 'rainbow-delimiters nil t)) (display-warning 'use-package (format "Cannot load %s" 'rainbow-delimiters) :error))) ((debug error) (funcall use-package--warning125 :catch err))))
(progn (progn (use-package-ensure-elpa 'rainbow-delimiters '(t) 'nil) (defvar use-package--warning125 #'(lambda (keyword err) (let ((msg ...)) (display-warning 'use-package msg :error)))) (condition-case err (progn (custom-set-faces '((rainbow-delimiters-depth-1-face ...) (rainbow-delimiters-depth-2-face ...))) (if (not (require 'rainbow-delimiters nil t)) (display-warning 'use-package (format "Cannot load %s" 'rainbow-delimiters) :error))) ((debug error) (funcall use-package--warning125 :catch err)))))
eval((progn (progn (use-package-ensure-elpa 'rainbow-delimiters '(t) 'nil) (defvar use-package--warning125 #'(lambda (keyword err) (let (...) (display-warning ... msg :error)))) (condition-case err (progn (custom-set-faces '(... ...)) (if (not (require ... nil t)) (display-warning 'use-package (format "Cannot load %s" ...) :error))) ((debug error) (funcall use-package--warning125 :catch err))))) t)
elisp--eval-last-sexp(nil)
eval-last-sexp(nil)
funcall-interactively(eval-last-sexp nil)
call-interactively(eval-last-sexp nil nil)
command-execute(eval-last-sexp)
Is it possible to specify the faces in a list? It would make my config look prettier if they were indented neatly to the right.
@tastytea Can you look at the code and figure out why a list works for one and not the other?
use-package-normalize/:custom calls use-package-as-one and use-package-normalize/:custom-face does not.
use-package-as-one calls a function for each element of args. If I redefine use-package-normalize/:custom-face like this:
(defun use-package-normalize/:custom-face (name-symbol _keyword arg)
"Normalize use-package custom-face keyword."
(let ((error-msg
(format "%s wants a (<symbol> <face-spec>) or list of these"
name-symbol)))
(use-package-as-one (symbol-name _keyword) arg
#'(lambda (label arg)
(unless (listp arg)
(use-package-error error-msg))
(cl-dolist (def arg arg)
(unless (listp def)
(use-package-error error-msg))
(let ((face (nth 0 def))
(spec (nth 1 def)))
(when (or (not face)
(not spec)
(> (length def) 2))
(use-package-error error-msg))))))))
it seems to work. I get no errors or warnings and the faces are applied.
Edit: The snippet above only works for lists and throws errors if it is not a list.
Facing the same issue here. Currently working around it by calling use-package 3 times. Happy to hear about better workarounds.
@dangom You could just not use a list? This works fine here:
(use-package example
:custom-face
(example-1-face ((t (:foreground "LightPink"))))
(example-2-face ((t (:foreground "LightGreen")))))
The only downside is that the indentation is not as pretty.