[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/fontaine 96cece3857: Make it possible to inherit a pres
From: |
ELPA Syncer |
Subject: |
[elpa] externals/fontaine 96cece3857: Make it possible to inherit a preset in another preset |
Date: |
Thu, 19 Jan 2023 12:57:46 -0500 (EST) |
branch: externals/fontaine
commit 96cece385783a9f19d3a418a8f2150ca8b5c0a58
Author: Protesilaos Stavrou <info@protesilaos.com>
Commit: Protesilaos Stavrou <info@protesilaos.com>
Make it possible to inherit a preset in another preset
---
README.org | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
fontaine.el | 51 +++++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 98 insertions(+), 4 deletions(-)
diff --git a/README.org b/README.org
index 3a40b7f445..195f52c152 100644
--- a/README.org
+++ b/README.org
@@ -407,6 +407,57 @@ intend to change their values). We then have this
transformation:
:variable-pitch-height 1.05)))
#+end_src
+** Inherit the properties of another named preset
+:PROPERTIES:
+:CUSTOM_ID: h:9604c817-9b01-46d6-9455-58b8c393e441
+:END:
+
+[ Part of {{{development-version}}}. ]
+
+When defining multiple presets, we may need to duplicate properties
+and then make tweaks to individual values. Suppose we want to have
+two distinct presets for presentations: one is for coding related
+demonstrations and the other for prose. Both must have some common
+styles, but must define distinct font families each of which is
+suitable for the given task. In this case, we do not want to fall
+back to the generic =t= preset and we also do not wish to duplicate
+properties manually, potentially making mistakes in the process.
+Fontaine thus provides a method of inheriting a named preset's
+properties. Here is the idea:
+
+#+begin_src emacs-lisp
+(setq fontaine-presets
+ '((regular
+ :default-height 100)
+ (code-demo
+ :default-family "Source Code Pro"
+ :default-weight semilight
+ :default-height 170
+ :variable-pitch-family "Sans"
+ :bold-weight extrabold)
+ (prose-demo
+ :inherit code-demo ; copy the `code-demo' properties
+ :default-family "Sans"
+ :variable-pitch-family "Serif"
+ :default-height 220)
+ (t
+ :default-family "Monospace"
+ ;; more generic fallback properties here...
+ )))
+#+end_src
+
+In this scenario, the =regular= preset gets all its properties from
+the =t= preset. We omit them here in the interest of brevity (see the
+default value of ~fontaine-presets~ and its documentation for the
+details). In turn, the =code-demo= specifies more properites and
+falls back to =t= for any property not explicitly referenced.
+Finally, the =prose-demo= copies everything in =code-demo=, overrides
+any property therein, and falls back to =t= for every other property.
+
+In the interest of simplicity, Fontaine does not support recursive
+inheritance. If there is a compelling need for it, we can add it in
+future versions.
+
* Installation
:PROPERTIES:
:CUSTOM_ID: h:031b9bea-d42b-4be0-82c7-42712cde94cc
diff --git a/fontaine.el b/fontaine.el
index fdbd984f39..100b8544b2 100644
--- a/fontaine.el
+++ b/fontaine.el
@@ -225,6 +225,18 @@ The properties in detail:
- The `:line-spacing' specifies the value of the `line-spacing'
variable.
+- The `:inherit' contains the name of another named preset. This
+ tells the relevant Fontaine functions to get the properties of
+ that preset and blend them with those of the current one. The
+ properties of the current preset take precedence over those of
+ the inherited one, thus overriding them. In practice, this is
+ a way to have something like an extra-large preset copy the
+ large preset and then only modify its individual properties.
+ Remember that all named presets fall back to the preset whose
+ name is t: the `:inherit' is not a substitute for that generic
+ fallback but rather an extra method of specifying font
+ configuration presets.
+
Use the desired preset with the command `fontaine-set-preset'.
For detailed configuration: Info node `(fontaine) Shared and
@@ -281,12 +293,25 @@ Caveats or further notes:
(const reverse-italic)
(const reverse-oblique)))
- ((const :tag "Line spacing" :line-spacing) ,(get
'line-spacing 'custom-type))))
+ ((const :tag "Line spacing" :line-spacing) ,(get
'line-spacing 'custom-type))
+ ;; FIXME 2023-01-19: Adding the (choice
+ ;; ,@(fontaine--inheritable-presets-widget)) instead
+ ;; of `symbol' does not have the desired effect
+ ;; because it does not re-read `fontaine-presets'.
+ ((const :tag "Inherit another preset" :inherit) symbol)))
:key-type symbol)
- :package-version '(fontaine . "0.4.0")
+ :package-version '(fontaine . "0.5.0")
:group 'fontaine
:link '(info-link "(fontaine) Shared and implicit fallback values for
presets"))
+;; ;; See FIXME above in `fontaine-presets' :type.
+;; ;;
+;; (defun fontaine--inheritable-presets-widget ()
+;; "Return widget with choice among named presets."
+;; (mapcar (lambda (s)
+;; (list 'const s))
+;; (delq t (mapcar #'car fontaine-presets))))
+
(defcustom fontaine-latest-state-file
(locate-user-emacs-file "fontaine-latest-state.eld")
"File to save the latest value of `fontaine-set-preset'.
@@ -374,14 +399,32 @@ combine the other two lists."
;;;; Apply preset configurations
+(defun fontaine--preset-p (preset)
+ "Return non-nil if PRESET is one of the named `fontaine-presets'."
+ (let ((presets (delq t (mapcar #'car fontaine-presets))))
+ (memq preset presets)))
+
+(defun fontaine--get-inherit-name (preset)
+ "Get the `:inherit' value of PRESET."
+ (when-let* ((inherit (plist-get (alist-get preset fontaine-presets)
:inherit))
+ (fontaine--preset-p inherit))
+ inherit))
+
+(defun fontaine--get-preset-properties (preset)
+ "Return list of properties for PRESET in `fontaine-presets'."
+ (let ((presets fontaine-presets))
+ (append (alist-get preset presets)
+ (when-let ((inherit (fontaine--get-inherit-name preset)))
+ (alist-get inherit presets))
+ (alist-get t presets))))
+
(defmacro fontaine--apply-preset (fn doc args)
"Produce function to apply preset.
FN is the symbol of the function, DOC is its documentation, and
ARGS are its routines."
`(defun ,fn (preset &optional frame)
,doc
- (if-let ((properties (append (alist-get preset fontaine-presets)
- (alist-get t fontaine-presets))))
+ (if-let ((properties (fontaine--get-preset-properties preset)))
,args
;; FIXME 2022-09-07: Because we `append' the t of
;; `fontaine-presets' this error is only relevant when the list
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] externals/fontaine 96cece3857: Make it possible to inherit a preset in another preset,
ELPA Syncer <=