use-package icon indicating copy to clipboard operation
use-package copied to clipboard

:custom-face can't be a list?

Open tastytea opened this issue 5 years ago • 4 comments

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 avatar Mar 10 '20 09:03 tastytea

@tastytea Can you look at the code and figure out why a list works for one and not the other?

alphapapa avatar Mar 10 '20 13:03 alphapapa

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.

tastytea avatar Mar 10 '20 14:03 tastytea

Facing the same issue here. Currently working around it by calling use-package 3 times. Happy to hear about better workarounds.

dangom avatar May 07 '20 22:05 dangom

@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.

tastytea avatar May 07 '20 22:05 tastytea