[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/engrave-faces 4a0d16715a 4/8: Themes support
From: |
ELPA Syncer |
Subject: |
[elpa] externals/engrave-faces 4a0d16715a 4/8: Themes support |
Date: |
Sat, 7 May 2022 13:57:31 -0400 (EDT) |
branch: externals/engrave-faces
commit 4a0d16715a8fc7b1d6f88ecc2c6a83ab5eeef2ea
Author: TEC <tec@tecosaur.com>
Commit: TEC <tec@tecosaur.com>
Themes support
---
engrave-faces-html.el | 8 +-
engrave-faces-latex.el | 24 ++--
engrave-faces.el | 294 +++++++++++++++++++++++++++++++++----------------
3 files changed, 217 insertions(+), 109 deletions(-)
diff --git a/engrave-faces-html.el b/engrave-faces-html.el
index 9166e01b0e..72be9d023b 100644
--- a/engrave-faces-html.el
+++ b/engrave-faces-html.el
@@ -25,14 +25,16 @@ When preset, CSS classes are generated for
`engrave-faces-preset-styles'."
:type 'string
:group 'engrave-faces)
-(defun engrave-faces-html-gen-stylesheet (&optional indent)
+(defun engrave-faces-html-gen-stylesheet (&optional theme indent)
"Generate a preamble which provides short commands for the preset styles.
See `engrave-faces-preset-styles' and `engrave-faces-html-output-style'."
(let ((stylesheet
(mapconcat
(lambda (face-style)
(engrave-faces-html--gen-stylesheet-entry (car face-style) (cdr
face-style)))
- engrave-faces-preset-styles
+ (if theme
+ (engrave-faces-get-theme theme)
+ engrave-faces-current-preset-style)
"\n")))
(if indent
(mapconcat (lambda (line)
@@ -125,7 +127,7 @@ See `engrave-faces-preset-styles' and
`engrave-faces-html-output-style'."
(buffer-name)))
"</title>
<style>"
- (let* ((default-sty (cdr (assoc 'default
engrave-faces-preset-styles)))
+ (let* ((default-sty (cdr (assoc 'default
engrave-faces-current-preset-style)))
(default-bg (plist-get default-sty :background))
(default-fg (plist-get default-sty :foreground)))
(if (or default-bg default-fg)
diff --git a/engrave-faces-latex.el b/engrave-faces-latex.el
index f7c867ebc0..48dbbdbec8 100644
--- a/engrave-faces-latex.el
+++ b/engrave-faces-latex.el
@@ -27,18 +27,22 @@ When preset, short commands are generated for
`engrave-faces-preset-styles'."
:type 'string
:group 'engrave-faces)
-(defun engrave-faces-latex-gen-preamble ()
+(defun engrave-faces-latex-gen-preamble (&optional theme)
"Generate a preamble which provides short commands for the preset styles.
See `engrave-faces-preset-styles' and `engrave-faces-latex-output-style'."
- (concat
- (unless (cl-notany (lambda (s) (plist-get (cdr s) :background))
- engrave-faces-preset-styles)
- (format "\\newcommand\\efstrut{%s}\n" engrave-faces-latex-colorbox-strut))
- (mapconcat
- (lambda (face-style)
- (engrave-faces-latex-gen-preamble-line (car face-style) (cdr
face-style)))
- engrave-faces-preset-styles
- "\n")))
+ (let ((preset-style
+ (if theme
+ (engrave-faces-get-theme theme)
+ engrave-faces-current-preset-style)))
+ (concat
+ (unless (cl-notany (lambda (s) (plist-get (cdr s) :background))
+ preset-style)
+ (format "\\newcommand\\efstrut{%s}\n"
engrave-faces-latex-colorbox-strut))
+ (mapconcat
+ (lambda (face-style)
+ (engrave-faces-latex-gen-preamble-line (car face-style) (cdr
face-style)))
+ preset-style
+ "\n"))))
(defun engrave-faces-latex-gen-preamble-line (face style)
"Generate a LaTeX preamble line for STYLE representing FACE."
diff --git a/engrave-faces.el b/engrave-faces.el
index 903d9e4078..a6d3940b89 100644
--- a/engrave-faces.el
+++ b/engrave-faces.el
@@ -79,103 +79,109 @@ If STANDALONE-TRANSFORMER is given it will be used when
directly creating a file
and cause a -standalone version of the buffer transforming function to be
created."
`(progn (add-to-list 'engrave-faces--backends
(list ,backend :face-transformer ,face-transformer
:extension ,extension))
- (defun ,(intern (concat "engrave-faces-" backend "-buffer"))
(&optional switch-to-result)
+ (defun ,(intern (concat "engrave-faces-" backend "-buffer"))
(&optional theme switch-to-result)
,(concat "Convert buffer to " backend " formatting.")
(interactive '(t))
- (let ((buf (engrave-faces-buffer ,backend)))
+ (let ((buf (engrave-faces-buffer ,backend theme)))
(when switch-to-result
(switch-to-buffer buf)
,(when view-setup `(funcall ,view-setup)))
buf))
,(when standalone-transformer
- `(defun ,(intern (concat "engrave-faces-" backend
"-buffer-standalone")) (&optional switch-to-result)
+ `(defun ,(intern (concat "engrave-faces-" backend
"-buffer-standalone")) (&optional theme switch-to-result)
(interactive '(t))
,(concat "Export the current buffer to a standalone " backend
" buffer.")
- (let ((buf (engrave-faces-buffer ,backend)))
+ (let ((buf (engrave-faces-buffer ,backend theme)))
(with-current-buffer buf
(funcall ,standalone-transformer))
(when switch-to-result
(switch-to-buffer buf)
,(when view-setup `(funcall ,view-setup)))
buf)))
- (defun ,(intern (concat "engrave-faces-" backend "-file")) (file
&optional out-file open-result)
+ (defun ,(intern (concat "engrave-faces-" backend "-file")) (file
&optional out-file theme open-result)
,(concat "Convert file to " backend " formatting.")
(interactive (list buffer-file-name nil t))
(unless out-file
(setq out-file (concat file ,extension)))
- (engrave-faces-file file out-file ,backend ,standalone-transformer)
+ (engrave-faces-file file out-file ,backend theme
,standalone-transformer)
(when open-result (find-file out-file))
out-file)
(defvar ,(intern (concat "engrave-faces-" backend "-before-hook"))
nil)
(defvar ,(intern (concat "engrave-faces-" backend "-after-hook"))
nil)))
-(defun engrave-faces-file (in-file out-file backend &optional postprocessor)
+(defun engrave-faces-file (in-file out-file backend &optional theme
postprocessor)
"Using BACKEND, engrave IN-FILE and save it as FILE.EXTENSION.
If a POSTPROCESSOR function is provided, it is called before saving."
(with-temp-buffer
(insert-file-contents in-file)
(let ((buffer-file-name in-file))
(normal-mode)
- (with-current-buffer (engrave-faces-buffer backend)
+ (with-current-buffer (engrave-faces-buffer backend theme)
(when postprocessor (funcall postprocessor))
(write-region (point-min) (point-max) out-file)
(kill-buffer)))))
-(defun engrave-faces-buffer (backend)
+(defun engrave-faces-buffer (backend &optional theme)
"Export the current buffer with BACKEND and return the created buffer."
- (save-excursion
- ;; Protect against the hook changing the current buffer.
+ (let ((engrave-faces-current-preset-style
+ (if theme
+ (engrave-faces-get-theme theme)
+ engrave-faces-current-preset-style)))
(save-excursion
- (run-hooks 'engrave-faces-before-hook)
- (run-hooks (intern (concat "engrave-faces-" backend "-before-hook"))))
- ;; Convince font-lock support modes to fontify the entire buffer
- ;; in advance.
- (when (and (boundp 'jit-lock-mode)
- (symbol-value 'jit-lock-mode))
- (jit-lock-fontify-now (point-min) (point-max)))
- (font-lock-ensure)
-
- ;; It's important that the new buffer inherits default-directory
- ;; from the current buffer.
- (let ((engraved-buf (generate-new-buffer (if (buffer-file-name)
- (concat
(file-name-nondirectory (buffer-file-name))
- (plist-get (cdr
(assoc backend engrave-faces--backends)) :extension))
- (concat "*" backend "*"))))
- (face-transformer (plist-get (cdr (assoc backend
engrave-faces--backends)) :face-transformer))
- (completed nil))
- (unwind-protect
- (let (next-change text)
- ;; This loop traverses and reads the source buffer, appending the
- ;; resulting text to the export buffer. This method is fast
because:
- ;; 1) it doesn't require examining the text properties char by char
- ;; (engrave-faces--next-face-change is used to move between runs
with
- ;; the same face), and 2) it doesn't require frequent buffer
- ;; switches, which are slow because they rebind all buffer-local
- ;; vars.
- (goto-char (point-min))
- (while (not (eobp))
- (setq next-change (engrave-faces--next-face-change (point)))
- (setq text (buffer-substring-no-properties (point) next-change))
- ;; Don't bother writing anything if there's no text (this
- ;; happens in invisible regions).
- (when (> (length text) 0)
- (princ (funcall face-transformer
- (let ((prop (get-text-property (point) 'face)))
- (cond
- ((null prop) 'default)
- ((and (listp prop) (eq (car prop) 'quote))
- (eval prop t))
- (t prop)))
- text)
- engraved-buf))
- (goto-char next-change)))
- (setq completed t))
- (if (not completed)
- (kill-buffer engraved-buf)
- (with-current-buffer engraved-buf
- (run-hooks 'engrave-faces-after-hook)
- (run-hooks (intern (concat "engrave-faces-" backend "-after-hook"))))
- engraved-buf))))
+ ;; Protect against the hook changing the current buffer.
+ (save-excursion
+ (run-hooks 'engrave-faces-before-hook)
+ (run-hooks (intern (concat "engrave-faces-" backend "-before-hook"))))
+ ;; Convince font-lock support modes to fontify the entire buffer
+ ;; in advance.
+ (when (and (boundp 'jit-lock-mode)
+ (symbol-value 'jit-lock-mode))
+ (jit-lock-fontify-now (point-min) (point-max)))
+ (font-lock-ensure)
+ ;; It's important that the new buffer inherits default-directory
+ ;; from the current buffer.
+ (let ((engraved-buf
+ (generate-new-buffer
+ (if (buffer-file-name)
+ (concat (file-name-nondirectory (buffer-file-name))
+ (plist-get (cdr (assoc backend
engrave-faces--backends)) :extension))
+ (concat "*" backend "*"))))
+ (face-transformer (plist-get (cdr (assoc backend
engrave-faces--backends)) :face-transformer))
+
+ (completed nil))
+ (unwind-protect
+ (let (next-change text)
+ ;; This loop traverses and reads the source buffer, appending the
+ ;; resulting text to the export buffer. This method is fast
because:
+ ;; 1) it doesn't require examining the text properties char by
char
+ ;; (engrave-faces--next-face-change is used to move between runs
with
+ ;; the same face), and 2) it doesn't require frequent buffer
+ ;; switches, which are slow because they rebind all buffer-local
+ ;; vars.
+ (goto-char (point-min))
+ (while (not (eobp))
+ (setq next-change (engrave-faces--next-face-change (point)))
+ (setq text (buffer-substring-no-properties (point)
next-change))
+ ;; Don't bother writing anything if there's no text (this
+ ;; happens in invisible regions).
+ (when (> (length text) 0)
+ (princ (funcall face-transformer
+ (let ((prop (get-text-property (point)
'face)))
+ (cond
+ ((null prop) 'default)
+ ((and (listp prop) (eq (car prop) 'quote))
+ (eval prop t))
+ (t prop)))
+ text)
+ engraved-buf))
+ (goto-char next-change)))
+ (setq completed t))
+ (if (not completed)
+ (kill-buffer engraved-buf)
+ (with-current-buffer engraved-buf
+ (run-hooks 'engrave-faces-after-hook)
+ (run-hooks (intern (concat "engrave-faces-" backend
"-after-hook"))))
+ engraved-buf)))))
(defun engrave-faces-merge-attributes (faces &optional attributes)
"Find the final ATTRIBUTES for text with FACES."
@@ -214,7 +220,7 @@ To consider inheritence, use
`engrave-faces-explicit-inheritance' first."
(delq nil (delq 'unspecified
(mapcar
(lambda (face)
- (if-let ((style (cdr (assoc face
engrave-faces-preset-styles))))
+ (if-let ((style (cdr (assoc face
engrave-faces-current-preset-style))))
(plist-get style attribute)
(cond
((symbolp face)
@@ -232,8 +238,8 @@ This function is lifted from htmlize."
;; overlays that specify the `face' property, even when they
;; contain smaller text properties that also specify `face'.
;; Emacs display engine merges those faces, and so must we.
- (or limit
- (setq limit (point-max)))
+ (unless limit
+ (setq limit (point-max)))
(let ((next-prop (next-single-property-change pos 'face nil limit))
(overlay-faces (engrave-faces--overlay-faces-at pos)))
(while (progn
@@ -252,36 +258,70 @@ This function is lifted from htmlize."
;;; Style helpers
-(defcustom engrave-faces-preset-styles ; doom-one-light
- '((default :short "default" :slug "D"
:foreground "#383a42")
- (font-lock-keyword-face :short "keyword" :slug "k"
:foreground "#e45649")
- (font-lock-doc-face :short "doc" :slug "d"
:foreground "#84888b" :slant italic)
- (font-lock-type-face :short "type" :slug "t"
:foreground "#986801")
- (font-lock-string-face :short "string" :slug "s"
:foreground "#50a14f")
- (font-lock-warning-face :short "warning" :slug "w"
:foreground "#986801")
- (font-lock-builtin-face :short "builtin" :slug "b"
:foreground "#a626a4")
- (font-lock-comment-face :short "comment" :slug "ct"
:foreground "#9ca0a4")
- (font-lock-constant-face :short "constant" :slug "c"
:foreground "#b751b6")
- (font-lock-preprocessor-face :short "preprocessor" :slug "pp"
:foreground "#4078f2" :weight bold)
- (font-lock-negation-char-face :short "neg-char" :slug "nc"
:foreground "#4078f2" :weight bold)
- (font-lock-variable-name-face :short "variable" :slug "v"
:foreground "#6a1868")
- (font-lock-function-name-face :short "function" :slug "f"
:foreground "#a626a4")
- (font-lock-comment-delimiter-face :short "comment-delim" :slug "cd"
:foreground "#9ca0a4")
- (font-lock-regexp-grouping-construct :short "regexp" :slug "rc"
:foreground "#4078f2" :weight bold)
- (font-lock-regexp-grouping-backslash :short "regexp-backslash" :slug "rb"
:foreground "#4078f2" :weight bold)
- (org-block :short "org-block" :slug "ob")
; forcing no background is preferable
- (highlight-numbers-number :short "number" :slug "hn"
:foreground "#da8548" :weight bold)
- (highlight-quoted-quote :short "qquote" :slug "hq"
:foreground "#4078f2")
- (highlight-quoted-symbol :short "qsymbol" :slug "hs"
:foreground "#986801")
- (rainbow-delimiters-depth-1-face :short "rd1" :slug "rdi"
:foreground "#4078f2")
- (rainbow-delimiters-depth-2-face :short "rd2" :slug
"rdii" :foreground "#a626a4")
- (rainbow-delimiters-depth-3-face :short "rd3" :slug
"rdiii" :foreground "#50a14f")
- (rainbow-delimiters-depth-4-face :short "rd4" :slug
"rdiv" :foreground "#da8548")
- (rainbow-delimiters-depth-5-face :short "rd5" :slug "rdv"
:foreground "#b751b6")
- (rainbow-delimiters-depth-6-face :short "rd6" :slug
"rdvi" :foreground "#986801")
- (rainbow-delimiters-depth-7-face :short "rd7" :slug
"rdvii" :foreground "#4db5bd")
- (rainbow-delimiters-depth-8-face :short "rd8" :slug
"rdiix" :foreground "#80a880")
- (rainbow-delimiters-depth-9-face :short "rd9" :slug
"rdix" :foreground "#887070"))
+(defcustom engrave-faces-themes
+ '((default .
+ (;; faces.el --- excluding: bold, italic, bold-italic, underline, and
some others
+ (default :short "default" :slug
"D" :foreground "#000000")
+ (shadow :short "shadow" :slug
"sh" :foreground "#7f7f7f")
+ (success :short "success" :slug
"ss" :foreground "#228b22" :weight bold)
+ (warning :short "warning" :slug
"w" :foreground "#ff8e00" :weight bold)
+ (error :short "error" :slug
"e" :foreground "#ff0000" :weight bold)
+ ;; font-lock.el
+ (font-lock-comment-face :short "comment" :slug
"ct" :foreground "#b22222")
+ (font-lock-comment-delimiter-face :short "comment-delim" :slug
"cd" :foreground "#b22222")
+ (font-lock-string-face :short "string" :slug
"s" :foreground "#8b2252")
+ (font-lock-doc-face :short "doc" :slug
"d" :foreground "#8b2252")
+ (font-lock-doc-markup-face :short "doc-markup" :slug
"dm" :foreground "#008b8b")
+ (font-lock-keyword-face :short "keyword" :slug
"k" :foreground "#9370db")
+ (font-lock-builtin-face :short "builtin" :slug
"b" :foreground "#483d8b")
+ (font-lock-function-name-face :short "function" :slug
"f" :foreground "#0000ff")
+ (font-lock-variable-name-face :short "variable" :slug
"v" :foreground "#a0522d")
+ (font-lock-type-face :short "type" :slug
"t" :foreground "#228b22")
+ (font-lock-constant-face :short "constant" :slug
"c" :foreground "#008b8b")
+ (font-lock-warning-face :short "fl-warning" :slug
"W" :foreground "#ff0000" :weight bold)
+ (font-lock-negation-char-face :short "neg-char" :slug
"nc")
+ (font-lock-preprocessor-face :short "preprocessor" :slug
"pp" :foreground "#483d8b")
+ (font-lock-regexp-grouping-construct :short "regexp" :slug
"rc" :weight bold)
+ (font-lock-regexp-grouping-backslash :short "regexp-backslash" :slug
"rb" :weight bold)
+ ;; org-faces.el
+ (org-block :short "org-block" :slug
"ob") ; forcing no background is preferable
+ ;; highlight-numbers.el
+ (highlight-numbers-number :short "number" :slug
"hn" :foreground "#008b8b")
+ ;; highlight-quoted.el
+ (highlight-quoted-quote :short "qquote" :slug
"hq" :foreground "#9370db")
+ (highlight-quoted-symbol :short "qsymbol" :slug
"hs" :foreground "#008b8b")
+ ;; rainbow-delimiters.el
+ (rainbow-delimiters-depth-1-face :short "rd1" :slug
"rdi" :foreground "#707183")
+ (rainbow-delimiters-depth-2-face :short "rd2" :slug
"rdii" :foreground "#7388d6")
+ (rainbow-delimiters-depth-3-face :short "rd3" :slug
"rdiii" :foreground "#909183")
+ (rainbow-delimiters-depth-4-face :short "rd4" :slug
"rdiv" :foreground "#709870")
+ (rainbow-delimiters-depth-5-face :short "rd5" :slug
"rdv" :foreground "#907373")
+ (rainbow-delimiters-depth-6-face :short "rd6" :slug
"rdvi" :foreground "#6276ba")
+ (rainbow-delimiters-depth-7-face :short "rd7" :slug
"rdvii" :foreground "#858580")
+ (rainbow-delimiters-depth-8-face :short "rd8" :slug
"rdiix" :foreground "#80a880")
+ (rainbow-delimiters-depth-9-face :short "rd9" :slug
"rdix" :foreground "#887070"))))
+ "A collection of named style presets.
+
+This takes the form of an alist with theme names as the cars, with
+cdrs in the form of `engrave-faces-current-preset-style'."
+ :type '(alist
+ :key-type (symbol :tag "Theme name")
+ :value-type
+ (repeat
+ (cons (symbol :tag "Face")
+ (plist :key-type (choice
+ (const :tag "Short identifier" :short)
+ (const :tag "Very short identifier" :slug)
+ (symbol :tag "Face attribute")
+ :tag "Property")
+ :value-type (choice :tag "Value" string symbol)
+ :tag "Face specification"))))
+ :group 'engrave-faces)
+
+(define-obsolete-variable-alias 'engrave-faces-preset-styles
'engrave-faces-current-preset-style "0.3")
+
+(defcustom engrave-faces-current-preset-style
+ (alist-get 'default engrave-faces-themes)
"Overriding face values.
By setting :foreground, :background, etc. a certain theme can be set for
@@ -291,7 +331,15 @@ 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."
- :type '(repeat (repeat (choice symbol string)))
+ :type '(repeat
+ (cons (symbol :tag "Face")
+ (plist :key-type (choice
+ (const :tag "Short identifier" :short)
+ (const :tag "Very short identifier" :slug)
+ (symbol :tag "Face attribute")
+ :tag "Property")
+ :value-type (choice :tag "Value" string symbol)
+ :tag "Face specification")))
:group 'engrave-faces)
(defun engrave-faces--check-nondefault (attr value)
@@ -309,7 +357,7 @@ Unconditionally returns nil when FACES is default."
((and (pred listp) (app length 1)) (assoc (car faces)
engrave-faces-preset-styles))))
(defun engrave-faces-generate-preset ()
- "Generate `engrave-faces-preset-styles' based on the current theme."
+ "Generate a preset style based on the current Emacs theme."
(mapcar
(lambda (face-style)
(apply #'append
@@ -327,5 +375,59 @@ Unconditionally returns nil when FACES is default."
engrave-faces-attributes-of-interest))))
engrave-faces-preset-styles))
+(defun engrave-faces-get-theme (theme &optional noput)
+ "Obtain the preset style for THEME.
+Unless NOPUT is non-nil, "
+ (if-let ((theme-preset (alist-get theme engrave-faces-themes)))
+ (setq engrave-faces-current-preset-style theme-preset)
+ (if (or (eq theme (car custom-enabled-themes))
+ (memq theme (custom-available-themes)))
+ (let ((spec
+ (if (eq theme (car custom-enabled-themes))
+ (engrave-faces-generate-preset)
+ (let ((old-theme (car custom-enabled-themes))
+ spec)
+ (load-theme theme t)
+ (setq spec (engrave-faces-generate-preset))
+ (load-theme old-theme t)
+ spec))))
+ (unless noput
+ (push (cons theme spec) engrave-faces-themes))
+ spec)
+ (user-error "Theme `%s' is not found in
`engrave-faces-current-preset-style' or availible Emacs themes." theme))))
+
+(defun engrave-faces-use-theme (&optional theme insert-def)
+ "Select a THEME an apply it as the current engraved preset style.
+When INSERT-DEF is non-nil, or the universal argument has been
+provided, an expression adding THEME to `engrave-faces-themes'
+shall be inserted into the current buffer at point."
+ (interactive (list (intern
+ (completing-read
+ "Theme: "
+ (cl-remove-duplicates
+ (append
+ (mapcar
+ (lambda (theme)
+ (propertize (symbol-name theme) 'face '(italic
font-lock-doc-face)))
+ (custom-available-themes))
+ (list (propertize (symbol-name (car
custom-enabled-themes))
+ 'face '(bold
font-lock-comment-face)))
+ (mapcar #'car engrave-faces-themes)))))
+ (when current-prefix-arg t)))
+ (unless theme
+ (setq theme (car custom-enabled-themes)))
+ (let ((spec (engrave-faces-get-theme theme)))
+ (if insert-def
+ (engrave-faces--insert-theme-def theme spec)
+ (setq engrave-faces-current-preset-style spec))))
+
+(defun engrave-faces--insert-theme-def (name &optional spec)
+ "Insert a definition for the theme NAME with a certain SPEC into the buffer."
+ (insert (pp
+ `(add-to-list
+ 'engrave-faces-themes
+ ',(cons name (or spec
+ (engrave-faces-get-theme name)))))))
+
(provide 'engrave-faces)
;;; engrave-faces.el ends here
- [elpa] externals/engrave-faces updated (9e41d5f9a8 -> 248196fb4d), ELPA Syncer, 2022/05/07
- [elpa] externals/engrave-faces 0ff0251187 3/8: Add ability to log face preset misses, ELPA Syncer, 2022/05/07
- [elpa] externals/engrave-faces 4a0d16715a 4/8: Themes support,
ELPA Syncer <=
- [elpa] externals/engrave-faces 9ef6c83553 5/8: Variable declaration rearrangement, ELPA Syncer, 2022/05/07
- [elpa] externals/engrave-faces 571d60774c 6/8: Reflow a docstring, ELPA Syncer, 2022/05/07
- [elpa] externals/engrave-faces 6fa12694e6 7/8: Rename default theme shorts and slugs, ELPA Syncer, 2022/05/07
- [elpa] externals/engrave-faces 85ddcdb516 1/8: Refactor ef-define-backend and ef-faces-file, ELPA Syncer, 2022/05/07
- [elpa] externals/engrave-faces 1b50efc320 2/8: LaTeX: improve background boxes by adding a strut, ELPA Syncer, 2022/05/07
- [elpa] externals/engrave-faces 248196fb4d 8/8: Fix typo in readme, ELPA Syncer, 2022/05/07