diff options
| -rw-r--r-- | README.org | 70 | ||||
| -rw-r--r-- | ef-autumn-theme.el | 5 | ||||
| -rw-r--r-- | ef-bio-theme.el | 5 | ||||
| -rw-r--r-- | ef-cherie-theme.el | 5 | ||||
| -rw-r--r-- | ef-cyprus-theme.el | 5 | ||||
| -rw-r--r-- | ef-dark-theme.el | 5 | ||||
| -rw-r--r-- | ef-day-theme.el | 5 | ||||
| -rw-r--r-- | ef-deuteranopia-dark-theme.el | 5 | ||||
| -rw-r--r-- | ef-deuteranopia-light-theme.el | 5 | ||||
| -rw-r--r-- | ef-duo-dark-theme.el | 5 | ||||
| -rw-r--r-- | ef-duo-light-theme.el | 5 | ||||
| -rw-r--r-- | ef-frost-theme.el | 5 | ||||
| -rw-r--r-- | ef-light-theme.el | 5 | ||||
| -rw-r--r-- | ef-night-theme.el | 5 | ||||
| -rw-r--r-- | ef-spring-theme.el | 5 | ||||
| -rw-r--r-- | ef-summer-theme.el | 5 | ||||
| -rw-r--r-- | ef-themes.el | 48 | ||||
| -rw-r--r-- | ef-trio-dark-theme.el | 5 | ||||
| -rw-r--r-- | ef-trio-light-theme.el | 5 | ||||
| -rw-r--r-- | ef-tritanopia-dark-theme.el | 5 | ||||
| -rw-r--r-- | ef-tritanopia-light-theme.el | 5 | ||||
| -rw-r--r-- | ef-winter-theme.el | 5 |
22 files changed, 184 insertions, 34 deletions
@@ -417,6 +417,73 @@ Other examples: (setq ef-themes-region '(intense no-extend neutral)) #+end_src +** Palette overrides +:PROPERTIES: +:CUSTOM_ID: h:4b923795-4b23-4345-81e5-d1c108a84b6a +:END: +#+cindex: Override color values and semantic color mappings + +[ Part of {{{development-version}}}. ] + +Each theme defines its own color palette as well as semantic color +mappings. The former is the set of color values such as what shade of +blue to use. The latter refers to associations between a color value +and a syntactic construct, such as a =variable= for variables in +programming modes or =heading-1= for level 1 headings in Org and +others. + +The definition is stored in the variable =ef-NAME-palette=, where +=NAME= is the specifier of the theme, such as ~ef-summer-palette~ for +the ~ef-summer~ theme. Overrides for those associations are specified +in the variable =ef-NAME-palette-overrides=. + +All associations take the form of =(KEY VALUE)= pairs. For example, +the ~ef-summer-palette~ contains =(blue-warmer "#5250ef")=. Semantic +color mappings are the same, though the =VALUE= is one of the named +colors of the theme. For instance, =ef-summer-palette= maps the +aforementioned =blue-warmer= to =variable= thus =(variable blue-warmer)=. + +The easiest way to learn about a theme's definition is to use the +command ~describe-variable~ (bound to =C-h v= by default) and then +search for the =ef-NAME-palette=. The resulting Help buffer will look +like this: + +#+begin_example +ef-summer-palette is a variable defined in ‘ef-summer-theme.el’. + +Its value is shown below. + +The ‘ef-summer’ palette. + + This variable may be risky if used as a file-local variable. + +Value: +((bg-main "#fff2f3") + (fg-main "#4f4073") + +[... Shortened for the purposes of this manual.] +#+end_example + +The user can study this information to identify the overrides they +wish to make. Then they can specify them and re-load the theme for +changes to take effect. Sample of how to override a color value and a +semantic mapping: + +#+begin_src emacs-lisp +(setq ef-summer-palette-overrides + '((blue-warmer "#5230ff") ; original value is #5250ef + (variable cyan))) ; original value is blue-warmer +#+end_src + +The overrides can contain as many associations as the user needs. + +Changes to color values are reflected in the preview of the theme's +palette ([[#h:8dd67bf5-879e-46e5-b277-5bac141f53d1][Preview theme colors]]). They are shown at the top of the +buffer. In the above example, the first instance of =blue-warmer= is +the override and the second is the original one. + +Contact me if you need further help with this. + * Loading a theme :PROPERTIES: :CUSTOM_ID: h:75d74aea-d17f-497f-a3b8-f0bf4c372de0 @@ -550,6 +617,9 @@ which reflects the given choice, like =ef-summer-preview-colors= for the The command ~ef-themes-preview-colors-current~ skips the minibuffer selection process and just produces a preview for the current Ef theme. +Overrides to color values are reflected in the buffers produced by the +aforementioned commands ([[#h:4b923795-4b23-4345-81e5-d1c108a84b6a][Palette overrides]]). + * Use colors from the active Ef theme :PROPERTIES: :CUSTOM_ID: h:5b74bd9e-e7f2-46b3-af2e-7c45b2e69245 diff --git a/ef-autumn-theme.el b/ef-autumn-theme.el index 4ed9ed3..7f237de 100644 --- a/ef-autumn-theme.el +++ b/ef-autumn-theme.el @@ -202,7 +202,10 @@ (rainbow-8 yellow)) "The `ef-autumn' palette.") - (ef-themes-theme ef-autumn ef-autumn-palette) + (defvar ef-autumn-palette-overrides nil + "Overrides for `ef-autumn-palette'.") + + (ef-themes-theme ef-autumn ef-autumn-palette ef-autumn-palette-overrides) (provide-theme 'ef-autumn)) diff --git a/ef-bio-theme.el b/ef-bio-theme.el index 57b3316..f8b5b71 100644 --- a/ef-bio-theme.el +++ b/ef-bio-theme.el @@ -202,7 +202,10 @@ (rainbow-8 magenta)) "The `ef-bio' palette.") - (ef-themes-theme ef-bio ef-bio-palette) + (defvar ef-bio-palette-overrides nil + "Overrides for `ef-bio-palette'.") + + (ef-themes-theme ef-bio ef-bio-palette ef-bio-palette-overrides) (provide-theme 'ef-bio)) diff --git a/ef-cherie-theme.el b/ef-cherie-theme.el index c21b161..6b21b6b 100644 --- a/ef-cherie-theme.el +++ b/ef-cherie-theme.el @@ -202,7 +202,10 @@ (rainbow-8 magenta-cooler)) "The `ef-cherie' palette.") - (ef-themes-theme ef-cherie ef-cherie-palette) + (defvar ef-cherie-palette-overrides nil + "Overrides for `ef-cherie-palette'.") + + (ef-themes-theme ef-cherie ef-cherie-palette ef-cherie-palette-overrides) (provide-theme 'ef-cherie)) diff --git a/ef-cyprus-theme.el b/ef-cyprus-theme.el index d245e02..e4065dc 100644 --- a/ef-cyprus-theme.el +++ b/ef-cyprus-theme.el @@ -202,7 +202,10 @@ (rainbow-8 red)) "The `ef-cyprus' palette.") - (ef-themes-theme ef-cyprus ef-cyprus-palette) + (defvar ef-cyprus-palette-overrides nil + "Overrides for `ef-cyprus-palette'.") + + (ef-themes-theme ef-cyprus ef-cyprus-palette ef-cyprus-palette-overrides) (provide-theme 'ef-cyprus)) diff --git a/ef-dark-theme.el b/ef-dark-theme.el index 5b8069a..126815f 100644 --- a/ef-dark-theme.el +++ b/ef-dark-theme.el @@ -202,7 +202,10 @@ (rainbow-8 yellow)) "The `ef-dark' palette.") - (ef-themes-theme ef-dark ef-dark-palette) + (defvar ef-dark-palette-overrides nil + "Overrides for `ef-dark-palette'.") + + (ef-themes-theme ef-dark ef-dark-palette ef-dark-palette-overrides) (provide-theme 'ef-dark)) diff --git a/ef-day-theme.el b/ef-day-theme.el index 65f036c..e46ae82 100644 --- a/ef-day-theme.el +++ b/ef-day-theme.el @@ -202,7 +202,10 @@ (rainbow-8 green-cooler)) "The `ef-day' palette.") - (ef-themes-theme ef-day ef-day-palette) + (defvar ef-day-palette-overrides nil + "Overrides for `ef-day-palette'.") + + (ef-themes-theme ef-day ef-day-palette ef-day-palette-overrides) (provide-theme 'ef-day)) diff --git a/ef-deuteranopia-dark-theme.el b/ef-deuteranopia-dark-theme.el index 9bee52f..5b1a352 100644 --- a/ef-deuteranopia-dark-theme.el +++ b/ef-deuteranopia-dark-theme.el @@ -205,7 +205,10 @@ (rainbow-8 magenta-faint)) "The `ef-deuteranopia-dark' palette.") - (ef-themes-theme ef-deuteranopia-dark ef-deuteranopia-dark-palette) + (defvar ef-deuteranopia-dark-palette-overrides nil + "Overrides for `ef-deuteranopia-dark-palette'.") + + (ef-themes-theme ef-deuteranopia-dark ef-deuteranopia-dark-palette ef-deuteranopia-dark-palette-overrides) (provide-theme 'ef-deuteranopia-dark)) diff --git a/ef-deuteranopia-light-theme.el b/ef-deuteranopia-light-theme.el index 57b299a..acc1123 100644 --- a/ef-deuteranopia-light-theme.el +++ b/ef-deuteranopia-light-theme.el @@ -205,7 +205,10 @@ (rainbow-8 cyan)) "The `ef-deuteranopia-light' palette.") - (ef-themes-theme ef-deuteranopia-light ef-deuteranopia-light-palette) + (defvar ef-deuteranopia-light-palette-overrides nil + "Overrides for `ef-deuteranopia-light-palette'.") + + (ef-themes-theme ef-deuteranopia-light ef-deuteranopia-light-palette ef-deuteranopia-light-palette-overrides) (provide-theme 'ef-deuteranopia-light)) diff --git a/ef-duo-dark-theme.el b/ef-duo-dark-theme.el index 22c476f..056005f 100644 --- a/ef-duo-dark-theme.el +++ b/ef-duo-dark-theme.el @@ -205,7 +205,10 @@ (rainbow-8 green-cooler)) "The `ef-duo-dark' palette.") - (ef-themes-theme ef-duo-dark ef-duo-dark-palette) + (defvar ef-duo-dark-palette-overrides nil + "Overrides for `ef-duo-dark-palette'.") + + (ef-themes-theme ef-duo-dark ef-duo-dark-palette ef-duo-dark-palette-overrides) (provide-theme 'ef-duo-dark)) diff --git a/ef-duo-light-theme.el b/ef-duo-light-theme.el index 0ad7383..d83f1ce 100644 --- a/ef-duo-light-theme.el +++ b/ef-duo-light-theme.el @@ -206,7 +206,10 @@ (rainbow-8 green-cooler)) "The `ef-duo-light' palette.") - (ef-themes-theme ef-duo-light ef-duo-light-palette) + (defvar ef-duo-light-palette-overrides nil + "Overrides for `ef-duo-light-palette'.") + + (ef-themes-theme ef-duo-light ef-duo-light-palette ef-duo-light-palette-overrides) (provide-theme 'ef-duo-light)) diff --git a/ef-frost-theme.el b/ef-frost-theme.el index 780dcf3..3411b12 100644 --- a/ef-frost-theme.el +++ b/ef-frost-theme.el @@ -202,7 +202,10 @@ (rainbow-8 cyan-warmer)) "The `ef-frost' palette.") - (ef-themes-theme ef-frost ef-frost-palette) + (defvar ef-frost-palette-overrides nil + "Overrides for `ef-frost-palette'.") + + (ef-themes-theme ef-frost ef-frost-palette ef-frost-palette-overrides) (provide-theme 'ef-frost)) diff --git a/ef-light-theme.el b/ef-light-theme.el index 28c6aac..06f1d9c 100644 --- a/ef-light-theme.el +++ b/ef-light-theme.el @@ -202,7 +202,10 @@ (rainbow-8 yellow)) "The `ef-light' palette.") - (ef-themes-theme ef-light ef-light-palette) + (defvar ef-light-palette-overrides nil + "Overrides for `ef-light-palette'.") + + (ef-themes-theme ef-light ef-light-palette ef-light-palette-overrides) (provide-theme 'ef-light)) diff --git a/ef-night-theme.el b/ef-night-theme.el index 8b5c572..71df32e 100644 --- a/ef-night-theme.el +++ b/ef-night-theme.el @@ -202,7 +202,10 @@ (rainbow-8 green-warmer)) "The `ef-night' palette.") - (ef-themes-theme ef-night ef-night-palette) + (defvar ef-night-palette-overrides nil + "Overrides for `ef-night-palette'.") + + (ef-themes-theme ef-night ef-night-palette ef-night-palette-overrides) (provide-theme 'ef-night)) diff --git a/ef-spring-theme.el b/ef-spring-theme.el index 3b1fdc6..f2ab6e5 100644 --- a/ef-spring-theme.el +++ b/ef-spring-theme.el @@ -202,7 +202,10 @@ (rainbow-8 yellow-cooler)) "The `ef-spring' palette.") - (ef-themes-theme ef-spring ef-spring-palette) + (defvar ef-spring-palette-overrides nil + "Overrides for `ef-spring-palette'.") + + (ef-themes-theme ef-spring ef-spring-palette ef-spring-palette-overrides) (provide-theme 'ef-spring)) diff --git a/ef-summer-theme.el b/ef-summer-theme.el index ccf5af3..d970dec 100644 --- a/ef-summer-theme.el +++ b/ef-summer-theme.el @@ -202,7 +202,10 @@ (rainbow-8 yellow-cooler)) "The `ef-summer' palette.") - (ef-themes-theme ef-summer ef-summer-palette) + (defvar ef-summer-palette-overrides nil + "Overrides for `ef-summer-palette'.") + + (ef-themes-theme ef-summer ef-summer-palette ef-summer-palette-overrides) (provide-theme 'ef-summer)) diff --git a/ef-themes.el b/ef-themes.el index f2ce782..58f857b 100644 --- a/ef-themes.el +++ b/ef-themes.el @@ -415,15 +415,32 @@ foreground that is used with any of the intense backgrounds." "Return first enabled Ef theme." (car (ef-themes--list-enabled-themes))) -(defun ef-themes--palette (theme) - "Return THEME palette as a symbol." - (when theme - (intern (format "%s-palette" theme)))) - -(defun ef-themes--current-theme-palette () - "Return palette of active Ef theme, else produce `user-error'." - (if-let* ((palette (ef-themes--palette (ef-themes--current-theme)))) - (symbol-value palette) +(defun ef-themes--palette-symbol (theme &optional overrides) + "Return THEME palette as a symbol. +With optional OVERRIDES, return THEME palette overrides as a +symbol." + (when-let ((suffix (cond + ((and theme overrides) + "palette-overrides") + (theme + "palette")))) + (intern (format "%s-%s" theme suffix)))) + +(defun ef-themes--palette-value (theme &optional overrides) + "Return palette value of THEME with optional OVERRIDES." + (let ((base-value (symbol-value (ef-themes--palette-symbol theme)))) + (if overrides + (append (symbol-value (ef-themes--palette-symbol theme :overrides)) base-value) + base-value))) + +(defun ef-themes--current-theme-palette (&optional overrides) + "Return palette value of active Ef theme, else produce `user-error'. +With optional OVERRIDES return palette value plus whatever +overrides." + (if-let ((theme (ef-themes--current-theme))) + (if overrides + (ef-themes--palette-value theme :overrides) + (ef-themes--palette-value theme)) (user-error "No enabled Ef theme could be found"))) (defun ef-themes--choose-subset () @@ -552,7 +569,7 @@ symbol." Routine for `ef-themes-preview-colors'." (let ((palette (seq-remove (lambda (cell) (symbolp (cadr cell))) - (symbol-value (ef-themes--palette theme)))) + (ef-themes--palette-value theme :overrides))) (current-buffer buffer) (current-theme theme)) (with-help-window buffer @@ -1953,17 +1970,20 @@ Helper function for `ef-themes-preview-colors'." ;;;; Instantiate an Ef theme ;;;###autoload -(defmacro ef-themes-theme (name palette) +(defmacro ef-themes-theme (name palette &optional overrides) "Bind NAME's color PALETTE around face specs and variables. Face specifications are passed to `custom-theme-set-faces'. While variables are handled by `custom-theme-set-variables'. Those are stored in `ef-themes-faces' and -`ef-themes-custom-variables' respectively." +`ef-themes-custom-variables' respectively. + +Optional OVERRIDES are appended to PALETTE, overriding +corresponding entries." (declare (indent 0)) (let ((sym (gensym)) (colors (mapcar #'car (symbol-value palette)))) `(let* ((c '((class color) (min-colors 256))) - (,sym ,palette) + (,sym (append ,overrides ,palette)) ,@(mapcar (lambda (color) (list color `(let* ((value (car (alist-get ',color ,sym)))) @@ -1987,7 +2007,7 @@ Those are stored in `ef-themes-faces' and ;; inside a function. (colors (mapcar #'car (ef-themes--current-theme-palette)))) `(let* ((c '((class color) (min-colors 256))) - (,sym (ef-themes--current-theme-palette)) + (,sym (ef-themes--current-theme-palette :overrides)) ,@(mapcar (lambda (color) (list color `(let* ((value (car (alist-get ',color ,sym)))) diff --git a/ef-trio-dark-theme.el b/ef-trio-dark-theme.el index 177b33e..805f601 100644 --- a/ef-trio-dark-theme.el +++ b/ef-trio-dark-theme.el @@ -202,7 +202,10 @@ (rainbow-8 yellow-cooler)) "The `ef-trio-dark' palette.") - (ef-themes-theme ef-trio-dark ef-trio-dark-palette) + (defvar ef-trio-dark-palette-overrides nil + "Overrides for `ef-trio-dark-palette'.") + + (ef-themes-theme ef-trio-dark ef-trio-dark-palette ef-trio-dark-palette-overrides) (provide-theme 'ef-trio-dark)) diff --git a/ef-trio-light-theme.el b/ef-trio-light-theme.el index 05bbd72..5c8f437 100644 --- a/ef-trio-light-theme.el +++ b/ef-trio-light-theme.el @@ -202,7 +202,10 @@ (rainbow-8 yellow-cooler)) "The `ef-trio-light' palette.") - (ef-themes-theme ef-trio-light ef-trio-light-palette) + (defvar ef-trio-light-palette-overrides nil + "Overrides for `ef-trio-light-palette'.") + + (ef-themes-theme ef-trio-light ef-trio-light-palette ef-trio-light-palette-overrides) (provide-theme 'ef-trio-light)) diff --git a/ef-tritanopia-dark-theme.el b/ef-tritanopia-dark-theme.el index b9c8e6f..88576c1 100644 --- a/ef-tritanopia-dark-theme.el +++ b/ef-tritanopia-dark-theme.el @@ -205,7 +205,10 @@ (rainbow-8 red-faint)) "The `ef-tritanopia-dark' palette.") - (ef-themes-theme ef-tritanopia-dark ef-tritanopia-dark-palette) + (defvar ef-tritanopia-dark-palette-overrides nil + "Overrides for `ef-tritanopia-dark-palette'.") + + (ef-themes-theme ef-tritanopia-dark ef-tritanopia-dark-palette ef-tritanopia-dark-palette-overrides) (provide-theme 'ef-tritanopia-dark)) diff --git a/ef-tritanopia-light-theme.el b/ef-tritanopia-light-theme.el index fb408a4..126c181 100644 --- a/ef-tritanopia-light-theme.el +++ b/ef-tritanopia-light-theme.el @@ -205,7 +205,10 @@ (rainbow-8 red-faint)) "The `ef-tritanopia-light' palette.") - (ef-themes-theme ef-tritanopia-light ef-tritanopia-light-palette) + (defvar ef-tritanopia-light-palette-overrides nil + "Overrides for `ef-tritanopia-light-palette'.") + + (ef-themes-theme ef-tritanopia-light ef-tritanopia-light-palette ef-tritanopia-light-palette-overrides) (provide-theme 'ef-tritanopia-light)) diff --git a/ef-winter-theme.el b/ef-winter-theme.el index f17a342..b361cfe 100644 --- a/ef-winter-theme.el +++ b/ef-winter-theme.el @@ -202,7 +202,10 @@ (rainbow-8 cyan-warmer)) "The `ef-winter' palette.") - (ef-themes-theme ef-winter ef-winter-palette) + (defvar ef-winter-palette-overrides nil + "Overrides for `ef-winter-palette'.") + + (ef-themes-theme ef-winter ef-winter-palette ef-winter-palette-overrides) (provide-theme 'ef-winter)) |
