Elisp: Font Face

By Xah Lee. Date: . Last updated: .

What is Face

A face is graphical attributes for displaying text, such as text color, size, font, etc.

Emacs has many faces predefined.

List Faces

To list all loaded faces, Alt+x list-faces-display.

emacs list-faces-display 2021-08-26
emacs M-x list-faces-display

font-lock-mode Builtin Faces

The following are faces defined by Font Lock Mode

  1. font-lock-builtin-face
  2. font-lock-comment-delimiter-face
  3. font-lock-comment-face
  4. font-lock-constant-face
  5. font-lock-doc-face
  6. font-lock-doc-markup-face
  7. font-lock-function-name-face
  8. font-lock-keyword-face
  9. font-lock-negation-char-face
  10. font-lock-preprocessor-face
  11. font-lock-string-face
  12. font-lock-type-face
  13. font-lock-variable-name-face
  14. font-lock-warning-face

If you are creating a programing language mode, use these face as much as possible, because that will create consistent style of coloring across programing language modes.

Builtin Faces in Emacs

The following are basic faces defined by emacs.

Show Face Documentation

describe-face

Named Face is Not Variable

🛑 WARNING: A named face is not a variable. defface and face-spec-set do not create a new variable.

In elisp technicality, defface does not set the Symbol's value cell. (boundp 'face_name) returns nil.

A named face (such as those created by defface) is specified by setting the face-defface-spec property name of the Symbol Property List .

You can use defvar to make a face_name symbol also a variable, but that is not necessary.

Those faces predefined from Font Lock Mode , such as font-lock-function-name-face, are both named faces and variables.

Check is Face or is Variable

facep
Return true is its a face.
boundp
Return true is its a variable.
;; example of user defined face

(defface my-great-face
  '((t :foreground "red"))
  "my face"
  )

;; check if a symbol is a variable. that is, value cell is not void
(boundp 'my-great-face) ; nil

;; check if a symbol is a face
(facep 'my-great-face) ; non-nil

;; get the value of 'face-defface-spec from symbol's plist
(get 'my-great-face 'face-defface-spec ) ; ((t :foreground "red" :weight bold))

;; now make it a variable. (you shouldn't do this)
(defvar my-great-face nil "my face too")

(boundp 'my-great-face) ; t

See also: Elisp: Symbol

Elisp, font face

Elisp, font lock, syntax coloring