branch: externals/fontaine commit b0ebd37155c9d74347b1440d64fa0d22ed028318 Author: Protesilaos Stavrou <i...@protesilaos.com> Commit: Protesilaos Stavrou <i...@protesilaos.com>
Remove the command 'fontaine-set-face-font' and related code --- README.org | 28 ++------- fontaine.el | 191 +++--------------------------------------------------------- 2 files changed, 11 insertions(+), 208 deletions(-) diff --git a/README.org b/README.org index 3272a563bf..5c3543d1f0 100644 --- a/README.org +++ b/README.org @@ -66,6 +66,10 @@ modify this GNU manual.” :CUSTOM_ID: h:62d716b4-44f7-4078-85d2-29a7da8ca253 :END: +[ The command ~fontaine-set-face-font~ is removed from the + {{{development-version}}} because it is not consistent with the rest + of the functionality of Fontaine. ] + #+vindex: fontaine-presets Fontaine lets the user specify presets of font configurations and set them on demand on graphical Emacs frames. The user option @@ -165,29 +169,6 @@ argument. As a final step, ~fontaine-set-preset~ calls the ~fontaine-set-preset-hook~. [ This is part of {{{development-version}}}. ] -#+findex: fontaine-set-face-font -#+vindex: fontaine-font-families -The command ~fontaine-set-face-font~ prompts with completion for a face -and then asks the user to specify the value of the relevant properties. -Preferred font families can be defined in the user option -~fontaine-font-families~, otherwise Fontaine will try to find suitable -options among the fonts installed on the system (not always reliable, -depending on the Emacs build and environment it runs in). The list of -faces to choose from is the same as that implied by the -~fontaine-presets~. Properties to change and their respective values -will depend on the face. For example, the ~default~ face requires a -natural number for its height attribute, whereas every other face needs -a floating point (understood as a multiple of the default height). This -command is for interactive use only and is supposed to be used for -previewing certain styles before eventually codifying them as presets. - -Changing the ~bold~ and ~italic~ faces only has a noticeable effect if -the underlying theme does not hardcode a weight and slant but inherits -from those faces instead (e.g. the ~modus-themes~). - -The ~fontaine-set-face-font~ also accepts an optional FRAME argument, -which is the same as what was described above for ~fontaine-set-preset~. - #+vindex: fontaine-latest-state-file #+findex: fontaine-store-latest-preset #+findex: fontaine-restore-latest-preset @@ -655,7 +636,6 @@ Remember to read the relevant doc strings. ;; ;; (info "(elisp) Key Binding Conventions") (define-key global-map (kbd "C-c f") #'fontaine-set-preset) -(define-key global-map (kbd "C-c F") #'fontaine-set-face-font) #+end_src ** Persist font configurations on theme switch diff --git a/fontaine.el b/fontaine.el index 7ecdbc844f..e9dce0f757 100644 --- a/fontaine.el +++ b/fontaine.el @@ -518,7 +518,7 @@ Call `fontaine-set-preset-hook' as a final step." (run-hooks 'fontaine-set-preset-hook))) ;;;###autoload -(defun fontaine-apply-current-preset (&optional _theme) +(defun fontaine-apply-current-preset (&rest _) "Use `fontaine-set-preset' on `fontaine-current-preset'. The value of `fontaine-current-preset' must be one of the keys in `fontaine-presets'. @@ -535,190 +535,13 @@ configurations remain consistent. Some themes that provide hooks of this sort are the `modus-themes', `ef-themes', `standard-themes' (all by Protesilaos). Alternatively, Emacs 29 provides the special -`enable-theme-functions' hook, which passes the THEME argument -for this function." +`enable-theme-functions' hook, which passes a THEME argument +which this function ignores" (interactive) - (when-let* ((current fontaine-current-preset) - ((alist-get current fontaine-presets))) - (fontaine-set-preset current))) - -;;;; Modify individual faces - -(defconst fontaine--font-faces - '(default fixed-pitch fixed-pitch-serif variable-pitch bold italic) - "List of faces whose typographic attributes we may change.") - -(defconst fontaine--font-weights - '( normal regular thin ultralight extralight light semilight - medium semibold bold extrabold ultrabold) - "List of font weights.") - -(defconst fontaine--font-slants - '( normal oblique italic reverse-oblique reverse-italic) - "List of font slants.") - -(defvar fontaine--face-history '() - "Minibuffer history of `fontaine-set-face-font'.") - -(defvar fontaine--default-font-family-history '() - "Minibuffer history of selected `default' font families.") - -;; We have `font-family-list', which is unfiltered. -(defun fontaine--family-list-fixed-pitch (&optional frame) - "Return a list of available monospaced font families. -Target FRAME, if provided as an optional argument." - (seq-uniq - (seq-map - (lambda (fam) - (symbol-name (aref fam 0))) - (seq-filter - (lambda (fam) - (aref fam 5)) - ;; NOTE 2022-04-26: `x-family-fonts' and `x-list-fonts' accept a - ;; pattern, but I cannot find how to use it properly to filter out - ;; certain families. - (x-family-fonts nil frame))))) - -;; NOTE 2022-04-29: This is known to not work on Windows, except for -;; Emacs 29. Read: -;; <https://lists.gnu.org/archive/html/emacs-devel/2022-04/msg01281.html>. -(defun fontaine--family-list-variable-pitch (&optional frame) - "Return a list of available proportionately spaced font families. -Target FRAME, if provided as an optional argument." - (seq-uniq - (seq-map - (lambda (fam) - (symbol-name (aref fam 0))) - (seq-filter - (lambda (fam) - (null (aref fam 5))) - (x-family-fonts nil frame))))) - -(defvar fontaine--natnum-history '() - "Minibuffer history for natural numbers.") - -(defun fontaine--set-default (&optional frame) - "Set `default' attributes, optionally for FRAME." - (let* ((families (or (alist-get 'default fontaine-font-families) - (append (alist-get 'fixed-pitch fontaine-font-families) - (alist-get 'variable-pitch fontaine-font-families)) - (font-family-list))) - (family (completing-read "Font family of `default': " - families nil t - nil 'fontaine--default-font-family-history)) - (weight (intern (completing-read "Select weight for `default': " - fontaine--font-weights nil))) - (height (read-number "Height of `default' face (must be a natural number): " - (and fontaine--natnum-history - (string-to-number (nth 0 fontaine--natnum-history))) - 'fontaine--natnum-history))) - (if (natnump height) - (fontaine--set-face-attributes 'default family weight height frame) - (user-error "Height of `default' face must be a natural number")))) - -(defvar fontaine--float-history '() - "Minibuffer history for floating point numbers.") - -(defvar fontaine--fixed-pitch-font-family-history '() - "Minibuffer history of selected `fixed-pitch' font families.") - -(defun fontaine--set-fixed-pitch (&optional frame serif) - "Set `fixed-pitch' attributes, optionally for FRAME. -If optional SERIF is non-nil, operate on the `fixed-pitch-serif' -face." - (let* ((families (or (alist-get 'fixed-pitch fontaine-font-families) - (fontaine--family-list-fixed-pitch))) - (family (completing-read "Font family of `fixed-pitch': " - families nil t nil - 'fontaine--fixed-pitch-font-family-history)) - (weight (intern (completing-read "Select weight for `fixed-pitch': " - fontaine--font-weights nil))) - (height (read-number "Height of `fixed-pitch' face (must be a floating point): " - 1.0 'fontaine--float-history)) - (face (if serif 'fixed-pitch-serif 'fixed-pitch))) - (if (floatp height) - (fontaine--set-face-attributes face family weight height frame) - (user-error "Height of `fixed-pitch' face must be a floating point")))) - -(defvar fontaine--variable-pitch-font-family-history '() - "Minibuffer history of selected `variable-pitch' font families.") - -(defun fontaine--set-variable-pitch (&optional frame) - "Set `variable-pitch' attributes, optionally for FRAME." - (let* ((families (or (alist-get 'variable-pitch fontaine-font-families) - (fontaine--family-list-variable-pitch))) - (family (completing-read "Font family of `variable-pitch': " - families nil t nil - 'fontaine--variable-pitch-font-family-history)) - (weight (intern (completing-read "Select weight for `variable-pitch': " - fontaine--font-weights nil))) - (height (read-number "Height of `variable-pitch' face (must be a floating point): " - 1.0 'fontaine--float-history))) - (if (floatp height) - (fontaine--set-face-attributes 'variable-pitch family weight height frame) - (user-error "Height of `variable-pitch' face must be a floating point")))) - -(defun fontaine--set-bold (&optional frame) - "Set `bold' attributes, optionally for FRAME." - (let ((weight (intern (completing-read "Select weight for `bold': " - fontaine--font-weights nil t)))) - (fontaine--set-face-attributes 'bold 'unspecified weight 'unspecified frame))) - -(defun fontaine--set-italic (&optional frame) - "Set `italic' attributes, optionally for FRAME." - (let ((slant (intern (completing-read "Select slant for `italic': " - fontaine--font-slants nil t)))) - (fontaine--set-italic-slant 'unspecified slant frame))) - -;;;###autoload -(defun fontaine-set-face-font (face &optional frame) - "Set font and/or other attributes of FACE. - -When called interactively, prompt for FACE and then continue -prompting for the relevant face attributes each of which depends -on the FACE (for example, the `default' FACE accepts a family, a -height as a natural number, and a weight, whereas `bold' only -accepts a weight). - -With regard to the font family that some faces accept, the -candidates are those specified in the user option -`fontaine-font-families'. If none are specified, try to find -relevant installed fonts and provide them as completion -candidates. - -Note that changing the `bold' and `italic' faces only has a -noticeable effect if the underlying does not hardcode a weight -and slant but inherits from those faces instead (e.g. the -`modus-themes'). - -When called from Lisp (albeit discouraged), if FACE is not part -of `fontaine--font-faces', fall back to interactively calling -`fontaine-set-preset'. - -Unless optional FRAME argument is supplied, apply the change to -all frames. If FRAME satisfies `framep', then make the changes -affect only it. If FRAME is non-nil, interpret it as the current -frame and apply the effects to it. - -When called interactively with a universal prefix -argument (\\[universal-argument]), FRAME is interpreted as -non-nil." - (declare (interactive-only t)) - (interactive - (list - (intern - (completing-read "Which face to change? " - fontaine--font-faces nil t nil - 'fontaine--face-history)) - current-prefix-arg)) - (pcase face - ('bold (fontaine--set-bold frame)) - ('default (fontaine--set-default frame)) - ('fixed-pitch (fontaine--set-fixed-pitch frame)) - ('fixed-pitch-serif (fontaine--set-fixed-pitch frame :serif)) - ('italic (fontaine--set-italic frame)) - ('variable-pitch (fontaine--set-variable-pitch frame)) - (_ (call-interactively #'fontaine-set-preset)))) + (if-let ((current fontaine-current-preset) + ((alist-get current fontaine-presets))) + (fontaine-set-preset current) + (user-error "The `fontaine-current-preset' is not among `fontaine-presets'"))) ;;;; Store and restore preset