Function: list-faces-display
list-faces-display is an interactive and byte-compiled function
defined in faces.el.gz.
Signature
(list-faces-display &optional REGEXP)
Documentation
List all faces, using the same sample text in each.
The sample text is a string that comes from the variable
list-faces-sample-text.
If REGEXP is non-nil, list only those faces with names matching
this regular expression. When called interactively with a prefix
argument, prompt for a regular expression using read-regexp.
Probably introduced at or before Emacs version 19.20.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/faces.el.gz
(defun list-faces-display (&optional regexp)
"List all faces, using the same sample text in each.
The sample text is a string that comes from the variable
`list-faces-sample-text'.
If REGEXP is non-nil, list only those faces with names matching
this regular expression. When called interactively with a prefix
argument, prompt for a regular expression using `read-regexp'."
(interactive (list (and current-prefix-arg
(read-regexp "List faces matching regexp"))))
(let ((all-faces (zerop (length regexp)))
(frame (selected-frame))
(max-length 0)
faces line-format
disp-frame window face-name)
;; We filter and take the max length in one pass
(setq faces
(delq nil
(mapcar (lambda (f)
(let ((s (symbol-name f)))
(when (or all-faces (string-match-p regexp s))
(setq max-length (max (length s) max-length))
f)))
(sort (face-list) #'string-lessp))))
(unless faces
(error "No faces matching \"%s\"" regexp))
(setq max-length (1+ max-length)
line-format (format "%%-%ds" max-length))
(with-help-window "*Faces*"
(with-current-buffer standard-output
(setq truncate-lines t)
(insert
(substitute-command-keys
(concat
"\\<help-mode-map>Use "
(if (display-mouse-p) "\\[help-follow-mouse] or ")
"\\[help-follow] on a face name to customize it\n"
"or on its sample text for a description of the face.\n\n")))
(setq help-xref-stack nil)
(dolist (face faces)
(setq face-name (symbol-name face))
(insert (format line-format face-name))
;; Hyperlink to a customization buffer for the face. Using
;; the help xref mechanism may not be the best way.
(save-excursion
(save-match-data
(search-backward face-name)
(setq help-xref-stack-item `(list-faces-display ,regexp))
(help-xref-button 0 'help-customize-face face)))
(let ((beg (point))
(line-beg (line-beginning-position)))
(insert list-faces-sample-text)
;; Hyperlink to a help buffer for the face.
(save-excursion
(save-match-data
(search-backward list-faces-sample-text)
(help-xref-button 0 'help-face face)))
(insert "\n")
(put-text-property beg (1- (point)) 'face face)
;; Make all face commands default to the proper face
;; anywhere in the line.
(put-text-property line-beg (1- (point)) 'read-face-name face)
;; If the sample text has multiple lines, line up all of them.
(goto-char beg)
(forward-line 1)
(while (not (eobp))
(insert-char ?\s max-length)
(forward-line 1))))
(goto-char (point-min))))
;; If the *Faces* buffer appears in a different frame,
;; copy all the face definitions from FRAME,
;; so that the display will reflect the frame that was selected.
(setq window (get-buffer-window (get-buffer "*Faces*") t))
(setq disp-frame (if window (window-frame window)
(car (frame-list))))
(or (eq frame disp-frame)
(dolist (face (face-list))
(copy-face face face frame disp-frame)))))