\documentclass{article} \usepackage{xcolor} \usepackage{fvextra} \usepackage[margin=1.5cm]{geometry} \usepackage{sourcecodepro} \pagestype{empty} \definecolor{EFD}{HTML}{383a42} \newcommand{\EFD}[1]{\textcolor{EFD}{#1}} % default \definecolor{EFk}{HTML}{e45649} \newcommand{\EFk}[1]{\textcolor{EFk}{#1}} % font-lock-keyword-face \definecolor{EFd}{HTML}{84888b} \newcommand{\EFd}[1]{\textcolor{EFd}{\textit{#1}}} % font-lock-doc-face \definecolor{EFt}{HTML}{986801} \newcommand{\EFt}[1]{\textcolor{EFt}{#1}} % font-lock-type-face \definecolor{EFs}{HTML}{50a14f} \newcommand{\EFs}[1]{\textcolor{EFs}{#1}} % font-lock-string-face \definecolor{EFw}{HTML}{986801} \newcommand{\EFw}[1]{\textcolor{EFw}{#1}} % font-lock-warning-face \definecolor{EFb}{HTML}{a626a4} \newcommand{\EFb}[1]{\textcolor{EFb}{#1}} % font-lock-builtin-face \definecolor{EFct}{HTML}{9ca0a4} \newcommand{\EFct}[1]{\textcolor{EFct}{#1}} % font-lock-comment-face \definecolor{EFc}{HTML}{b751b6} \newcommand{\EFc}[1]{\textcolor{EFc}{#1}} % font-lock-constant-face \definecolor{EFpp}{HTML}{4078f2} \newcommand{\EFpp}[1]{\textcolor{EFpp}{\textbf{#1}}} % font-lock-preprocessor-face \definecolor{EFnc}{HTML}{4078f2} \newcommand{\EFnc}[1]{\textcolor{EFnc}{\textbf{#1}}} % font-lock-negation-char-face \definecolor{EFv}{HTML}{6a1868} \newcommand{\EFv}[1]{\textcolor{EFv}{#1}} % font-lock-variable-name-face \definecolor{EFf}{HTML}{a626a4} \newcommand{\EFf}[1]{\textcolor{EFf}{#1}} % font-lock-function-name-face \definecolor{EFcd}{HTML}{9ca0a4} \newcommand{\EFcd}[1]{\textcolor{EFcd}{#1}} % font-lock-comment-delimiter-face \definecolor{EFrc}{HTML}{4078f2} \newcommand{\EFrc}[1]{\textcolor{EFrc}{\textbf{#1}}} % font-lock-regexp-grouping-construct \definecolor{EFrb}{HTML}{4078f2} \newcommand{\EFrb}[1]{\textcolor{EFrb}{\textbf{#1}}} % font-lock-regexp-grouping-backslash \newcommand{\EFob}[1]{#1} % org-block \definecolor{EFhn}{HTML}{da8548} \newcommand{\EFhn}[1]{\textcolor{EFhn}{\textbf{#1}}} % highlight-numbers-number \definecolor{EFhq}{HTML}{4078f2} \newcommand{\EFhq}[1]{\textcolor{EFhq}{#1}} % highlight-quoted-quote \definecolor{EFhs}{HTML}{986801} \newcommand{\EFhs}[1]{\textcolor{EFhs}{#1}} % highlight-quoted-symbol \definecolor{EFrdi}{HTML}{4078f2} \newcommand{\EFrdi}[1]{\textcolor{EFrdi}{#1}} % rainbow-delimiters-depth-1-face \definecolor{EFrdii}{HTML}{a626a4} \newcommand{\EFrdii}[1]{\textcolor{EFrdii}{#1}} % rainbow-delimiters-depth-2-face \definecolor{EFrdiii}{HTML}{50a14f} \newcommand{\EFrdiii}[1]{\textcolor{EFrdiii}{#1}} % rainbow-delimiters-depth-3-face \definecolor{EFrdiv}{HTML}{da8548} \newcommand{\EFrdiv}[1]{\textcolor{EFrdiv}{#1}} % rainbow-delimiters-depth-4-face \definecolor{EFrdv}{HTML}{b751b6} \newcommand{\EFrdv}[1]{\textcolor{EFrdv}{#1}} % rainbow-delimiters-depth-5-face \definecolor{EFrdvi}{HTML}{986801} \newcommand{\EFrdvi}[1]{\textcolor{EFrdvi}{#1}} % rainbow-delimiters-depth-6-face \definecolor{EFrdvii}{HTML}{4db5bd} \newcommand{\EFrdvii}[1]{\textcolor{EFrdvii}{#1}} % rainbow-delimiters-depth-7-face \definecolor{EFrdiix}{HTML}{80a880} \newcommand{\EFrdiix}[1]{\textcolor{EFrdiix}{#1}} % rainbow-delimiters-depth-8-face \definecolor{EFrdix}{HTML}{887070} \newcommand{\EFrdix}[1]{\textcolor{EFrdix}{#1}} % rainbow-delimiters-depth-9-face \begin{document} \begin{Verbatim}[breaklines=true, commandchars=\\\{\}] \color[HTML]{383a42}\EFcd{;;; }\EFct{engrave-faces.el --- Convert font-lock faces to other formats -*- lexical-binding: t; -*-} \EFcd{;; }\EFct{Copyright (C) 2021 TEC} \EFcd{;; }\EFct{Author: TEC } \EFcd{;; }\EFct{Maintainer: TEC } \EFcd{;; }\EFct{Created: January 18, 2021} \EFcd{;; }\EFct{Modified: July 10, 2021} \EFcd{;; }\EFct{Version: 0.1.0} \EFcd{;; }\EFct{Keywords: faces} \EFcd{;; }\EFct{Homepage: https://github.com/tecosaur/engrave-faces} \EFcd{;; }\EFct{Package-Requires: ((emacs "27.1"))} \EFcd{;;; }\EFct{License:} \EFcd{;; }\EFct{This file is part of engrave-faces, which is not part of GNU Emacs.} \EFcd{;;} \EFcd{;; }\EFct{engrave-faces is free software: you can redistribute it and/or modify} \EFcd{;; }\EFct{it under the terms of the GNU General Public License as published by} \EFcd{;; }\EFct{the Free Software Foundation, either version 3 of the License, or} \EFcd{;; }\EFct{(at your option) any later version.} \EFcd{;;} \EFcd{;; }\EFct{engrave-faces is distributed in the hope that it will be useful,} \EFcd{;; }\EFct{but WITHOUT ANY WARRANTY; without even the implied warranty of} \EFcd{;; }\EFct{MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the} \EFcd{;; }\EFct{GNU General Public License for more details.} \EFcd{;;} \EFcd{;; }\EFct{You should have received a copy of the GNU General Public License} \EFcd{;; }\EFct{along with engrave-faces. If not, see .} \EFcd{;;} \EFcd{;; }\EFct{SPDX-License-Identifier: GPL-3.0-or-later} \EFcd{;;; }\EFct{Commentary:} \EFcd{;; }\EFct{Convert font-lock faces to other formats.} \EFcd{;;; }\EFct{Code:} \textcolor[HTML]{4078f2}{(}\EFc{require} \EFhq{'}\EFc{map}\textcolor[HTML]{4078f2}{)} \EFcd{;;;}\EFct{\#\#\#}\textcolor[HTML]{986801}{autoload} \textcolor[HTML]{4078f2}{(}\EFk{defvar} \EFv{engrave-faces--backends} nil\textcolor[HTML]{4078f2}{)} \EFcd{;;;}\EFct{\#\#\#}\textcolor[HTML]{986801}{autoload} \textcolor[HTML]{4078f2}{(}\EFk{defmacro} \EFf{engrave-faces-define-backend} \textcolor[HTML]{a626a4}{(}name extension face-transformer \EFt{\&optional} standalone-transformer view-setup\textcolor[HTML]{a626a4}{)} \EFhq{`}\textcolor[HTML]{a626a4}{(}\EFk{progn} \textcolor[HTML]{50a14f}{(}\EFc{add-to-list} \EFhq{'}\EFv{engrave-faces--backends} \textcolor[HTML]{da8548}{(}\EFc{list} ,name \EFb{:face-transformer} ,face-transformer \EFb{:extension} ,extension\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{defun} ,\textcolor[HTML]{da8548}{(}\EFc{intern} \textcolor[HTML]{4078f2}{(}\EFc{concat} \EFs{"engrave-faces-"} name \EFs{"-buffer"}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFt{\&optional} switch-to-result\textcolor[HTML]{da8548}{)} ,\textcolor[HTML]{da8548}{(}\EFc{concat} \EFs{"Convert buffer to "} name \EFs{" formatting."}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFk{interactive} \EFhq{'}\textcolor[HTML]{4078f2}{(}t\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFk{let} \textcolor[HTML]{4078f2}{(}\textcolor[HTML]{a626a4}{(}buf \textcolor[HTML]{50a14f}{(}\EFf{engrave-faces-buffer} ,name\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{when} switch-to-result \textcolor[HTML]{a626a4}{(}\EFc{switch-to-buffer} buf\textcolor[HTML]{a626a4}{)} ,\textcolor[HTML]{a626a4}{(}\EFk{when} view-setup \EFhq{`}\textcolor[HTML]{50a14f}{(}funcall ,view-setup\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} buf\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} ,\textcolor[HTML]{50a14f}{(}\EFk{when} standalone-transformer \EFhq{`}\textcolor[HTML]{da8548}{(}\EFk{defun} ,\textcolor[HTML]{4078f2}{(}\EFc{intern} \textcolor[HTML]{a626a4}{(}\EFc{concat} \EFs{"engrave-faces-"} name \EFs{"-buffer-standalone"}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFt{\&optional} switch-to-result\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{interactive} \EFhq{'}\textcolor[HTML]{a626a4}{(}t\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} ,\textcolor[HTML]{4078f2}{(}\EFc{concat} \EFs{"Export the current buffer to a standalone "} name \EFs{" buffer."}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{let} \textcolor[HTML]{a626a4}{(}\textcolor[HTML]{50a14f}{(}buf \textcolor[HTML]{da8548}{(}\EFf{engrave-faces-buffer} ,name\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFk{with-current-buffer} buf \textcolor[HTML]{50a14f}{(}\EFc{funcall} ,standalone-transformer\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFk{when} switch-to-result \textcolor[HTML]{50a14f}{(}\EFc{switch-to-buffer} buf\textcolor[HTML]{50a14f}{)} ,\textcolor[HTML]{50a14f}{(}\EFk{when} view-setup \EFhq{`}\textcolor[HTML]{da8548}{(}funcall ,view-setup\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} buf\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{defvar} ,\textcolor[HTML]{da8548}{(}\EFc{intern} \textcolor[HTML]{4078f2}{(}\EFc{concat} \EFs{"engrave-faces-"} name \EFs{"-before-hook"}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} nil\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{defvar} ,\textcolor[HTML]{da8548}{(}\EFc{intern} \textcolor[HTML]{4078f2}{(}\EFc{concat} \EFs{"engrave-faces-"} name \EFs{"-after-hook"}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} nil\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defgroup} \EFt{engrave-faces} nil \EFd{"Export buffers with font-lock information to other formats."} \EFb{:group} \EFhq{'}\EFhs{hypermedia}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defcustom} \EFv{engrave-faces-attributes-of-interest} \EFhq{'}\textcolor[HTML]{a626a4}{(}\EFb{:foreground} \EFb{:background} \EFb{:slant} \EFb{:weight} \EFb{:height} \EFb{:strike-through}\textcolor[HTML]{a626a4}{)} \EFd{"Attributes which sould be paid attention to."} \EFb{:type} \EFhq{'}\textcolor[HTML]{a626a4}{(}repeat symbol\textcolor[HTML]{a626a4}{)} \EFb{:group} \EFhq{'}\EFhs{engrave-faces}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defcustom} \EFv{engrave-faces-before-hook} nil \EFd{"Hook run before engraving a buffer. The hook functions are run in the source buffer (not the resulting buffer)."} \EFb{:type} \EFhq{'}\EFhs{hook} \EFb{:group} \EFhq{'}\EFhs{engrave-faces}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defcustom} \EFv{engrave-faces-after-hook} nil \EFd{"Hook run after engraving a buffer. Unlike `}\textcolor[HTML]{b751b6}{\textit{engrave-faces-before-hook}}\EFd{', these functions are run in the generated buffer. You may use them to modify the outlook of the final output."} \EFb{:type} \EFhq{'}\EFhs{hook} \EFb{:group} \EFhq{'}\EFhs{engrave-faces}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defun} \EFf{engrave-faces-buffer} \textcolor[HTML]{a626a4}{(}backend\textcolor[HTML]{a626a4}{)} \EFd{"Export the current buffer with BACKEND and return the created buffer."} \textcolor[HTML]{a626a4}{(}\EFk{save-excursion} \EFcd{;; }\EFct{Protect against the hook changing the current buffer.} \textcolor[HTML]{50a14f}{(}\EFk{save-excursion} \textcolor[HTML]{da8548}{(}\EFc{run-hooks} \EFhq{'}\EFv{engrave-faces-before-hook}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{run-hooks} \textcolor[HTML]{4078f2}{(}\EFc{intern} \textcolor[HTML]{a626a4}{(}\EFc{concat} \EFs{"engrave-faces-"} backend \EFs{"-before-hook"}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \EFcd{;; }\EFct{Convince font-lock support modes to fontify the entire buffer} \EFcd{;; }\EFct{in advance.} \textcolor[HTML]{50a14f}{(}\EFk{when} \textcolor[HTML]{da8548}{(}\EFk{and} \textcolor[HTML]{4078f2}{(}\EFc{boundp} \EFhq{'}\EFv{jit-lock-mode}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{symbol-value} \EFhq{'}\EFv{jit-lock-mode}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{jit-lock-fontify-now} \textcolor[HTML]{4078f2}{(}\EFc{point-min}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{point-max}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFc{font-lock-ensure}\textcolor[HTML]{50a14f}{)} \EFcd{;; }\EFct{It's important that the new buffer inherits default-directory} \EFcd{;; }\EFct{from the current buffer.} \textcolor[HTML]{50a14f}{(}\EFk{let} \textcolor[HTML]{da8548}{(}\textcolor[HTML]{4078f2}{(}engraved-buf \textcolor[HTML]{a626a4}{(}\EFc{generate-new-buffer} \textcolor[HTML]{50a14f}{(}\EFk{if} \textcolor[HTML]{da8548}{(}\EFv{buffer-file-name}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{concat} \textcolor[HTML]{4078f2}{(}\EFc{file-name-nondirectory} \textcolor[HTML]{a626a4}{(}\EFv{buffer-file-name}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{plist-get} \textcolor[HTML]{a626a4}{(}\EFc{cdr} \textcolor[HTML]{50a14f}{(}\EFc{assoc} backend \EFv{engrave-faces--backends}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \EFb{:extension}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{concat} \EFs{"*"} backend \EFs{"*"}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}face-transformer \textcolor[HTML]{a626a4}{(}\EFc{plist-get} \textcolor[HTML]{50a14f}{(}\EFc{cdr} \textcolor[HTML]{da8548}{(}\EFc{assoc} backend \EFv{engrave-faces--backends}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \EFb{:face-transformer}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}completed nil\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFk{unwind-protect} \textcolor[HTML]{4078f2}{(}\EFk{let} \textcolor[HTML]{a626a4}{(}next-change text\textcolor[HTML]{a626a4}{)} \EFcd{;; }\EFct{This loop traverses and reads the source buffer, appending the} \EFcd{;; }\EFct{resulting text to the export buffer. This method is fast because:} \EFcd{;; }\EFct{1) it doesn't require examining the text properties char by char} \EFcd{;; }\EFct{(engrave-faces-next-face-change is used to move between runs with} \EFcd{;; }\EFct{the same face), and 2) it doesn't require frequent buffer} \EFcd{;; }\EFct{switches, which are slow because they rebind all buffer-local} \EFcd{;; }\EFct{vars.} \textcolor[HTML]{a626a4}{(}\EFc{goto-char} \textcolor[HTML]{50a14f}{(}\EFc{point-min}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFk{while} \textcolor[HTML]{50a14f}{(}\EFc{not} \textcolor[HTML]{da8548}{(}\EFc{eobp}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{setq} next-change \textcolor[HTML]{da8548}{(}\EFf{engrave-faces-next-face-change} \textcolor[HTML]{4078f2}{(}\EFc{point}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{setq} text \textcolor[HTML]{da8548}{(}\EFc{buffer-substring-no-properties} \textcolor[HTML]{4078f2}{(}\EFc{point}\textcolor[HTML]{4078f2}{)} next-change\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \EFcd{;; }\EFct{Don't bother writing anything if there's no text (this} \EFcd{;; }\EFct{happens in invisible regions).} \textcolor[HTML]{50a14f}{(}\EFk{when} \textcolor[HTML]{da8548}{(}\EFc{>} \textcolor[HTML]{4078f2}{(}\EFc{length} text\textcolor[HTML]{4078f2}{)} \EFhn{0}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{princ} \textcolor[HTML]{4078f2}{(}\EFc{funcall} face-transformer \textcolor[HTML]{a626a4}{(}\EFk{let} \textcolor[HTML]{50a14f}{(}\textcolor[HTML]{da8548}{(}prop \textcolor[HTML]{4078f2}{(}\EFc{get-text-property} \textcolor[HTML]{a626a4}{(}\EFc{point}\textcolor[HTML]{a626a4}{)} \EFhq{'}\EFhs{face}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{cond} \textcolor[HTML]{da8548}{(}\textcolor[HTML]{4078f2}{(}\EFc{null} prop\textcolor[HTML]{4078f2}{)} \EFhq{'}\EFhs{default}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\textcolor[HTML]{4078f2}{(}\EFk{and} \textcolor[HTML]{a626a4}{(}\EFc{listp} prop\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFc{eq} \textcolor[HTML]{50a14f}{(}\EFc{car} prop\textcolor[HTML]{50a14f}{)} \EFhq{'}\EFhs{quote}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\textcolor[HTML]{986801}{eval}\textcolor[HTML]{986801}{ prop}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}t prop\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} text\textcolor[HTML]{4078f2}{)} engraved-buf\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFc{goto-char} next-change\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{setq} completed t\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFk{if} \textcolor[HTML]{4078f2}{(}\EFc{not} completed\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{kill-buffer} engraved-buf\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{with-current-buffer} engraved-buf \textcolor[HTML]{a626a4}{(}\EFc{run-hooks} \EFhq{'}\EFv{engrave-faces-after-hook}\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFc{run-hooks} \textcolor[HTML]{50a14f}{(}\EFc{intern} \textcolor[HTML]{da8548}{(}\EFc{concat} \EFs{"engrave-faces-"} backend \EFs{"-after-hook"}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} engraved-buf\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defun} \EFf{engrave-faces-merge-attributes} \textcolor[HTML]{a626a4}{(}faces \EFt{\&optional} attributes\textcolor[HTML]{a626a4}{)} \EFd{"Find the final ATTRIBUTES for text with FACES."} \textcolor[HTML]{a626a4}{(}\EFk{setq} faces \textcolor[HTML]{50a14f}{(}\EFf{engrave-faces-explicit-inheritance} \textcolor[HTML]{da8548}{(}\EFk{if} \textcolor[HTML]{4078f2}{(}\EFc{listp} faces\textcolor[HTML]{4078f2}{)} faces \textcolor[HTML]{4078f2}{(}\EFc{list} faces\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFc{mapcan} \textcolor[HTML]{50a14f}{(}\EFk{lambda} \textcolor[HTML]{da8548}{(}attr\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{list} attr \textcolor[HTML]{4078f2}{(}\EFc{car} \textcolor[HTML]{a626a4}{(}\EFf{engrave-faces-attribute-values} faces attr\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{or} attributes \EFv{engrave-faces-attributes-of-interest}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defun} \EFf{engrave-faces-explicit-inheritance} \textcolor[HTML]{a626a4}{(}faces\textcolor[HTML]{a626a4}{)} \EFd{"Expand :inherit for each face in FACES. I.e. ([facea :inherit faceb] facec) results in (facea faceb facec)"} \textcolor[HTML]{a626a4}{(}\EFc{delq} nil \textcolor[HTML]{50a14f}{(}\EFc{mapcan} \textcolor[HTML]{da8548}{(}\EFk{lambda} \textcolor[HTML]{4078f2}{(}face\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{if} \textcolor[HTML]{a626a4}{(}\EFc{listp} face\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFk{let} \textcolor[HTML]{50a14f}{(}\textcolor[HTML]{da8548}{(}inherit \textcolor[HTML]{4078f2}{(}\EFc{plist-get} face \EFb{:inherit}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFc{cons} \textcolor[HTML]{da8548}{(}\EFf{map-delete} face \EFb{:inherit}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFf{engrave-faces-explicit-inheritance} inherit\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFc{cons} face \textcolor[HTML]{50a14f}{(}\EFk{let} \textcolor[HTML]{da8548}{(}\textcolor[HTML]{4078f2}{(}inherit \textcolor[HTML]{a626a4}{(}\EFc{face-attribute} face \EFb{:inherit} nil nil\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFk{when} \textcolor[HTML]{4078f2}{(}\EFk{and} inherit \textcolor[HTML]{a626a4}{(}\EFc{not} \textcolor[HTML]{50a14f}{(}\EFc{eq} inherit \EFhq{'}\EFhs{unspecified}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFf{engrave-faces-explicit-inheritance} inherit\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFk{if} \textcolor[HTML]{4078f2}{(}\EFc{listp} faces\textcolor[HTML]{4078f2}{)} faces \textcolor[HTML]{4078f2}{(}\EFc{list} faces\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defun} \EFf{engrave-faces-attribute-values} \textcolor[HTML]{a626a4}{(}faces attribute\textcolor[HTML]{a626a4}{)} \EFd{"Fetch all specified instances of ATTRIBUTE for FACES, ignoring inheritence. To consider inheritence, use `}\textcolor[HTML]{b751b6}{\textit{engrave-faces-explicit-inheritance}}\EFd{' first."} \textcolor[HTML]{a626a4}{(}\EFc{delq} nil \textcolor[HTML]{50a14f}{(}\EFc{delq} \EFhq{'}\EFhs{unspecified} \textcolor[HTML]{da8548}{(}\EFc{mapcar} \textcolor[HTML]{4078f2}{(}\EFk{lambda} \textcolor[HTML]{a626a4}{(}face\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFk{or} \textcolor[HTML]{50a14f}{(}\EFc{plist-get} \textcolor[HTML]{da8548}{(}\EFc{cdr} \textcolor[HTML]{4078f2}{(}\EFc{assoc} face \EFv{engrave-faces-preset-styles}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} attribute\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{cond} \textcolor[HTML]{da8548}{(}\textcolor[HTML]{4078f2}{(}\EFc{symbolp} face\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{face-attribute} face attribute nil nil\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\textcolor[HTML]{4078f2}{(}\EFc{listp} face\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{plist-get} face attribute\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{delq} \EFhq{'}\EFhs{default} \textcolor[HTML]{a626a4}{(}\EFk{if} \textcolor[HTML]{50a14f}{(}\EFc{listp} faces\textcolor[HTML]{50a14f}{)} faces \textcolor[HTML]{50a14f}{(}\EFc{list} faces\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defun} \EFf{engrave-faces-next-face-change} \textcolor[HTML]{a626a4}{(}pos \EFt{\&optional} limit\textcolor[HTML]{a626a4}{)} \EFd{"Find the next face change from POS up to LIMIT. This function is lifted from htmlize."} \EFcd{;; }\EFct{(engrave-faces-next-change pos 'face limit) would skip over entire} \EFcd{;; }\EFct{overlays that specify the `}\textcolor[HTML]{b751b6}{face}\EFct{' property, even when they} \EFcd{;; }\EFct{contain smaller text properties that also specify `}\textcolor[HTML]{b751b6}{face}\EFct{'.} \EFcd{;; }\EFct{Emacs display engine merges those faces, and so must we.} \textcolor[HTML]{a626a4}{(}\EFk{or} limit \textcolor[HTML]{50a14f}{(}\EFk{setq} limit \textcolor[HTML]{da8548}{(}\EFc{point-max}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFk{let} \textcolor[HTML]{50a14f}{(}\textcolor[HTML]{da8548}{(}next-prop \textcolor[HTML]{4078f2}{(}\EFc{next-single-property-change} pos \EFhq{'}\EFhs{face} nil limit\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}overlay-faces \textcolor[HTML]{4078f2}{(}\EFf{engrave-faces-overlay-faces-at} pos\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{while} \textcolor[HTML]{da8548}{(}\EFk{progn} \textcolor[HTML]{4078f2}{(}\EFk{setq} pos \textcolor[HTML]{a626a4}{(}\EFc{next-overlay-change} pos\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{and} \textcolor[HTML]{a626a4}{(}\EFc{<} pos next-prop\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFc{equal} overlay-faces \textcolor[HTML]{50a14f}{(}\EFf{engrave-faces-overlay-faces-at} pos\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFk{setq} pos \textcolor[HTML]{da8548}{(}\EFc{min} pos next-prop\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \EFcd{;; }\EFct{Additionally, we include the entire region that specifies the} \EFcd{;; }\EFct{`}\textcolor[HTML]{b751b6}{display}\EFct{' property.} \textcolor[HTML]{50a14f}{(}\EFk{when} \textcolor[HTML]{da8548}{(}\EFc{get-char-property} pos \EFhq{'}\EFhs{display}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFk{setq} pos \textcolor[HTML]{4078f2}{(}\EFc{next-single-char-property-change} pos \EFhq{'}\EFhs{display} nil limit\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} pos\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defun} \EFf{engrave-faces-overlay-faces-at} \textcolor[HTML]{a626a4}{(}pos\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFc{delq} nil \textcolor[HTML]{50a14f}{(}\EFc{mapcar} \textcolor[HTML]{da8548}{(}\EFk{lambda} \textcolor[HTML]{4078f2}{(}o\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{overlay-get} o \EFhq{'}\EFhs{face}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{overlays-at} pos\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \EFcd{;;; }\EFct{Style helpers} \textcolor[HTML]{4078f2}{(}\EFk{defcustom} \EFv{engrave-faces-preset-styles} \EFcd{; }\EFct{doom-one-light} \EFhq{'}\textcolor[HTML]{a626a4}{(}\textcolor[HTML]{50a14f}{(}default \EFb{:short} \EFs{"default"} \EFb{:slug} \EFs{"D"} \EFb{:foreground} \EFs{"\#383a42"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-keyword-face} \EFb{:short} \EFs{"keyword"} \EFb{:slug} \EFs{"k"} \EFb{:foreground} \EFs{"\#e45649"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-doc-face} \EFb{:short} \EFs{"doc"} \EFb{:slug} \EFs{"d"} \EFb{:foreground} \EFs{"\#84888b"} \EFb{:slant} italic\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-type-face} \EFb{:short} \EFs{"type"} \EFb{:slug} \EFs{"t"} \EFb{:foreground} \EFs{"\#986801"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-string-face} \EFb{:short} \EFs{"string"} \EFb{:slug} \EFs{"s"} \EFb{:foreground} \EFs{"\#50a14f"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-warning-face} \EFb{:short} \EFs{"warning"} \EFb{:slug} \EFs{"w"} \EFb{:foreground} \EFs{"\#986801"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-builtin-face} \EFb{:short} \EFs{"builtin"} \EFb{:slug} \EFs{"b"} \EFb{:foreground} \EFs{"\#a626a4"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-comment-face} \EFb{:short} \EFs{"comment"} \EFb{:slug} \EFs{"ct"} \EFb{:foreground} \EFs{"\#9ca0a4"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-constant-face} \EFb{:short} \EFs{"constant"} \EFb{:slug} \EFs{"c"} \EFb{:foreground} \EFs{"\#b751b6"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-preprocessor-face} \EFb{:short} \EFs{"preprocessor"} \EFb{:slug} \EFs{"pp"} \EFb{:foreground} \EFs{"\#4078f2"} \EFb{:weight} bold\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-negation-char-face} \EFb{:short} \EFs{"neg-char"} \EFb{:slug} \EFs{"nc"} \EFb{:foreground} \EFs{"\#4078f2"} \EFb{:weight} bold\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-variable-name-face} \EFb{:short} \EFs{"variable"} \EFb{:slug} \EFs{"v"} \EFb{:foreground} \EFs{"\#6a1868"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-function-name-face} \EFb{:short} \EFs{"function"} \EFb{:slug} \EFs{"f"} \EFb{:foreground} \EFs{"\#a626a4"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFv{font-lock-comment-delimiter-face} \EFb{:short} \EFs{"comment-delim"} \EFb{:slug} \EFs{"cd"} \EFb{:foreground} \EFs{"\#9ca0a4"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}font-lock-regexp-grouping-construct \EFb{:short} \EFs{"regexp"} \EFb{:slug} \EFs{"rc"} \EFb{:foreground} \EFs{"\#4078f2"} \EFb{:weight} bold\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}font-lock-regexp-grouping-backslash \EFb{:short} \EFs{"regexp-backslash"} \EFb{:slug} \EFs{"rb"} \EFb{:foreground} \EFs{"\#4078f2"} \EFb{:weight} bold\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFc{org-block} \EFb{:short} \EFs{"org-block"} \EFb{:slug} \EFs{"ob"}\textcolor[HTML]{50a14f}{)} \EFcd{; }\EFct{forcing no background is preferable} \textcolor[HTML]{50a14f}{(}highlight-numbers-number \EFb{:short} \EFs{"number"} \EFb{:slug} \EFs{"hn"} \EFb{:foreground} \EFs{"\#da8548"} \EFb{:weight} bold\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}highlight-quoted-quote \EFb{:short} \EFs{"qquote"} \EFb{:slug} \EFs{"hq"} \EFb{:foreground} \EFs{"\#4078f2"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}highlight-quoted-symbol \EFb{:short} \EFs{"qsymbol"} \EFb{:slug} \EFs{"hs"} \EFb{:foreground} \EFs{"\#986801"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-1-face \EFb{:short} \EFs{"rd1"} \EFb{:slug} \EFs{"rdi"} \EFb{:foreground} \EFs{"\#4078f2"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-2-face \EFb{:short} \EFs{"rd2"} \EFb{:slug} \EFs{"rdii"} \EFb{:foreground} \EFs{"\#a626a4"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-3-face \EFb{:short} \EFs{"rd3"} \EFb{:slug} \EFs{"rdiii"} \EFb{:foreground} \EFs{"\#50a14f"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-4-face \EFb{:short} \EFs{"rd4"} \EFb{:slug} \EFs{"rdiv"} \EFb{:foreground} \EFs{"\#da8548"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-5-face \EFb{:short} \EFs{"rd5"} \EFb{:slug} \EFs{"rdv"} \EFb{:foreground} \EFs{"\#b751b6"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-6-face \EFb{:short} \EFs{"rd6"} \EFb{:slug} \EFs{"rdvi"} \EFb{:foreground} \EFs{"\#986801"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-7-face \EFb{:short} \EFs{"rd7"} \EFb{:slug} \EFs{"rdvii"} \EFb{:foreground} \EFs{"\#4db5bd"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-8-face \EFb{:short} \EFs{"rd8"} \EFb{:slug} \EFs{"rdiix"} \EFb{:foreground} \EFs{"\#80a880"}\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}rainbow-delimiters-depth-9-face \EFb{:short} \EFs{"rd9"} \EFb{:slug} \EFs{"rdix"} \EFb{:foreground} \EFs{"\#887070"}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \EFd{"Overriding face values. By setting :foreground, :background, etc. a certain theme can be set for the faces. The face attributes here will also be used when calculating inherited styles. Faces here will represented more compactly when possible, by using the :short or :slug parameter to produce a named version styles, wheras other faces will need to be explicitly styled each time they're used."} \EFb{:type} \EFhq{'}\textcolor[HTML]{a626a4}{(}repeat \textcolor[HTML]{50a14f}{(}\EFf{repeat} \textcolor[HTML]{da8548}{(}choice symbol string\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \EFb{:group} \EFhq{'}\EFhs{engrave-faces}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defun} \EFf{engrave-faces-check-nondefault} \textcolor[HTML]{a626a4}{(}attr value\textcolor[HTML]{a626a4}{)} \EFd{"Return VALUE as long as it is specified, and not the default for ATTR."} \textcolor[HTML]{a626a4}{(}\EFk{unless} \textcolor[HTML]{50a14f}{(}\EFk{or} \textcolor[HTML]{da8548}{(}\EFc{eq} value \textcolor[HTML]{4078f2}{(}\EFc{face-attribute} \EFhq{'}\EFhs{default} attr nil t\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{eq} value \EFhq{'}\EFhs{unspecified}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} value\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{defun} \EFf{engrave-faces-generate-preset} \textcolor[HTML]{a626a4}{(}\textcolor[HTML]{a626a4}{)} \EFd{"Generate `}\textcolor[HTML]{b751b6}{\textit{engrave-faces-preset-styles}}\EFd{' based on the current theme."} \textcolor[HTML]{a626a4}{(}\EFc{mapcar} \textcolor[HTML]{50a14f}{(}\EFk{lambda} \textcolor[HTML]{da8548}{(}face-style\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFc{apply} \EFhq{\#'}\EFhs{append} \textcolor[HTML]{4078f2}{(}\EFc{list} \textcolor[HTML]{a626a4}{(}\EFc{car} face-style\textcolor[HTML]{a626a4}{)} \EFb{:short} \textcolor[HTML]{a626a4}{(}\EFc{plist-get} \textcolor[HTML]{50a14f}{(}\EFc{cdr} face-style\textcolor[HTML]{50a14f}{)} \EFb{:short}\textcolor[HTML]{a626a4}{)} \EFb{:slug} \textcolor[HTML]{a626a4}{(}\EFc{plist-get} \textcolor[HTML]{50a14f}{(}\EFc{cdr} face-style\textcolor[HTML]{50a14f}{)} \EFb{:slug}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{delq} nil \textcolor[HTML]{a626a4}{(}\EFc{mapcar} \textcolor[HTML]{50a14f}{(}\EFk{lambda} \textcolor[HTML]{da8548}{(}attr\textcolor[HTML]{da8548}{)} \textcolor[HTML]{da8548}{(}\EFk{let} \textcolor[HTML]{4078f2}{(}\textcolor[HTML]{a626a4}{(}attr-val \textcolor[HTML]{50a14f}{(}\EFc{face-attribute} \textcolor[HTML]{da8548}{(}\EFc{car} face-style\textcolor[HTML]{da8548}{)} attr nil t\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFk{when} \textcolor[HTML]{a626a4}{(}\EFk{or} \textcolor[HTML]{50a14f}{(}\EFf{engrave-faces-check-nondefault} attr attr-val\textcolor[HTML]{50a14f}{)} \textcolor[HTML]{50a14f}{(}\EFc{eq} \textcolor[HTML]{da8548}{(}\EFc{car} face-style\textcolor[HTML]{da8548}{)} \EFhq{'}\EFhs{default}\textcolor[HTML]{50a14f}{)}\textcolor[HTML]{a626a4}{)} \textcolor[HTML]{a626a4}{(}\EFc{list} attr attr-val\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \EFv{engrave-faces-attributes-of-interest}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)}\textcolor[HTML]{da8548}{)}\textcolor[HTML]{50a14f}{)} \EFv{engrave-faces-preset-styles}\textcolor[HTML]{a626a4}{)}\textcolor[HTML]{4078f2}{)} \textcolor[HTML]{4078f2}{(}\EFc{provide} \EFhq{'}\EFc{engrave-faces}\textcolor[HTML]{4078f2}{)} \EFcd{;;; }\EFct{engrave-faces.el ends here} \end{Verbatim} \end{document}