The arguments are more complicated than that. Use
C-h f to view the help for this function:
custom-theme-set-faces is a byte-compiled function defined in
(custom-theme-set-faces THEME &rest ARGS)
Apply a list of face specs associated with theme THEME.
THEME should be a theme name (a symbol). The special theme named
user refers to user settings applied via Customize.
The remaining ARGS should be a list where each entry is a list of
(FACE SPEC [NOW [COMMENT]])
FACE should be a face name (a symbol). If FACE is a face alias,
the setting refers to the parent face.
SPEC should be a face spec. For details, see defface.
If we look at the help for
C-h f again), then we find the following information about face specs:
SPEC should be a "face spec", i.e., an alist of the form
((DISPLAY . ATTS)...)
where DISPLAY is a form specifying conditions to match certain
terminals and ATTS is a property list (ATTR VALUE ATTR VALUE...)
specifying face attributes and values for frames on those
terminals. On each terminal, the first element with a matching
DISPLAY specification takes effect, and the remaining elements in
SPEC are disregarded.
As a special exception, in the first element of SPEC, DISPLAY can
be the special value default. Then the ATTS in that element
act as defaults for all the following elements.
For backward compatibility, elements of SPEC can be written
as (DISPLAY ATTS) instead of (DISPLAY . ATTS).
Each DISPLAY can have the following values:
- default (only in the first element).
- The symbol t, which matches all terminals.
- An alist of conditions. Each alist element must have the form
(REQ ITEM...). A matching terminal must satisfy each
specified condition by matching one of its ITEMs. Each REQ
must be one of the following:
- type (the terminal type).
Each ITEM must be one of the values returned by
window-system. Under X, additional allowed values are
motif, lucid, gtk and x-toolkit.
- class (the terminal's color support).
Each ITEM should be one of color, grayscale, or mono.
- background (what color is used for the background text)
Each ITEM should be one of light or dark.
- min-colors (the minimum number of supported colors)
Each ITEM should be an integer, which is compared with the
result of display-color-cells.
- supports (match terminals supporting certain attributes).
Each ITEM should be a list of face attributes. See
display-supports-face-attributes-p for more information on
exactly how testing is done.
In the ATTS property list, possible attributes are :family,
:width, :height, :weight, :slant, :underline,
:overline, :strike-through, :box, :foreground,
:background, :stipple, :inverse-video, and :inherit.
See Info node (elisp) Faces in the Emacs Lisp manual for more
If we put it all together, we see that we need to specify a theme name followed by any number of lists containing face names and face specs. Each face spec is an alist containing both conditions and a list of face attributes. The conditions can be really complicated to allow your theme to adapt to varying conditions such as the number of available colors, or they can just be
t if you want the attributes to always apply.
'(mode-line ((t . ((:foreground "blue")
'(another-face ((t . (…)))))
I recommend opening up one of the existing Emacs themes and taking a look at how they work.