branch: elpa/zenburn-theme
commit da9e29734ddb7cc74c34757f232422736fe054cc
Author: Bozhidar Batsov <[email protected]>
Commit: Bozhidar Batsov <[email protected]>
Introduce semantic color palette
Layer meaning-based names (zenburn-comment, zenburn-string, zenburn-error,
zenburn-diff-added-bg, etc.) on top of the positional palette. Semantic
values can be either hex strings or palette symbols, so user overrides
in zenburn-override-colors-alist flow through to the semantic names
automatically; semantic names can also be overridden directly via the
new zenburn-override-semantic-colors-alist.
Migrate font-lock, basic success/warning, and the diff section to the
new names. The diff section previously hardcoded "#335533"/"#553333"/etc.
backgrounds inline; those now live in named palette entries.
---
CHANGELOG.md | 1 +
zenburn-theme.el | 129 +++++++++++++++++++++++++++++++++++++++++--------------
2 files changed, 98 insertions(+), 32 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e37eb0a885..47427abad0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@
### New features
+* Introduce a semantic color palette layered on top of the positional palette.
Faces now reference meaning-based names like `zenburn-comment`,
`zenburn-string`, `zenburn-keyword`, `zenburn-error`, and
`zenburn-diff-added-bg` instead of `zenburn-green`, `zenburn-red`, etc. Users
can remap meanings without touching the base palette via the new
`zenburn-override-semantic-colors-alist` customization. Migrated so far:
`font-lock`, basic `success`/`warning`, and the `diff` section (which also
[...]
* Add `lsp-mode` and `lsp-ui` support.
* Add `hl-todo` support.
* Add `nerd-icons` support.
diff --git a/zenburn-theme.el b/zenburn-theme.el
index ea5aa9d264..7baf3b4f79 100644
--- a/zenburn-theme.el
+++ b/zenburn-theme.el
@@ -51,6 +51,21 @@ defining them in this alist."
:key-type (string :tag "Name")
:value-type (string :tag " Hex")))
+;;;###autoload
+(defcustom zenburn-override-semantic-colors-alist '()
+ "Place to override default theme semantic colors.
+
+Semantic colors give meaning-based names (like `zenburn-comment'
+or `zenburn-error') to entries in the positional palette. Values
+may be either a hex string or the symbol of a palette entry (for
+example, `zenburn-yellow'). See `zenburn-default-semantic-colors-alist'
+for the list of semantic names that ship with the theme."
+ :group 'zenburn-theme
+ :type '(alist
+ :key-type (string :tag "Name")
+ :value-type (choice (string :tag "Hex")
+ (symbol :tag "Palette name"))))
+
(defvar zenburn-use-variable-pitch nil
"When non-nil, use variable pitch face for some headings and titles.")
@@ -147,17 +162,67 @@ Each element has the form (NAME . HEX).
`+N' suffixes indicate a color is lighter.
`-N' suffixes indicate a color is darker.")
+(defvar zenburn-default-semantic-colors-alist
+ '(;; Status
+ ("zenburn-error" . zenburn-red)
+ ("zenburn-warning" . zenburn-orange)
+ ("zenburn-success" . zenburn-green)
+ ("zenburn-info" . zenburn-blue)
+ ;; Font lock
+ ("zenburn-comment" . zenburn-green)
+ ("zenburn-comment-delimiter" . zenburn-green-2)
+ ("zenburn-doc" . zenburn-green+2)
+ ("zenburn-string" . zenburn-red)
+ ("zenburn-keyword" . zenburn-yellow)
+ ("zenburn-function-name" . zenburn-cyan)
+ ("zenburn-variable-name" . zenburn-orange)
+ ("zenburn-type" . zenburn-blue-1)
+ ("zenburn-constant" . zenburn-green+4)
+ ("zenburn-preprocessor" . zenburn-blue+1)
+ ;; Diff
+ ("zenburn-diff-added-bg" . "#335533")
+ ("zenburn-diff-added-fg" . zenburn-green)
+ ("zenburn-diff-changed-bg" . "#555511")
+ ("zenburn-diff-changed-fg" . zenburn-yellow-1)
+ ("zenburn-diff-removed-bg" . "#553333")
+ ("zenburn-diff-removed-fg" . zenburn-red-2)
+ ("zenburn-diff-refine-added-bg" . "#338833")
+ ("zenburn-diff-refine-added-fg" . zenburn-green+4)
+ ("zenburn-diff-refine-changed-bg" . "#888811")
+ ("zenburn-diff-refine-changed-fg" . zenburn-yellow)
+ ("zenburn-diff-refine-removed-bg" . "#883333")
+ ("zenburn-diff-refine-removed-fg" . zenburn-red))
+ "Semantic color mappings layered on top of `zenburn-default-colors-alist'.
+Each element has the form (NAME . VALUE) where VALUE is either a
+hex string or the symbol of an entry in `zenburn-default-colors-alist'.
+Symbols are resolved against the positional palette at expansion
+time, so user overrides in `zenburn-override-colors-alist' flow
+through automatically.")
+
(defmacro zenburn-with-color-variables (&rest body)
- "`let' bind all colors defined in `zenburn-colors-alist' around BODY.
+ "`let*' bind all Zenburn palette colors around BODY.
+
+Bindings are introduced in order: positional palette first (from
+`zenburn-default-colors-alist' overlaid with
+`zenburn-override-colors-alist'), then the semantic palette (from
+`zenburn-default-semantic-colors-alist' overlaid with
+`zenburn-override-semantic-colors-alist'). Semantic values may
+reference positional palette names as symbols, which resolve against
+the just-introduced bindings.
+
Also bind `class' to ((class color) (min-colors 89))."
(declare (indent 0))
- `(let ((class '((class color) (min-colors 89)))
- ,@(mapcar (lambda (cons)
- (list (intern (car cons)) (cdr cons)))
- (append zenburn-default-colors-alist
- zenburn-override-colors-alist))
- (z-variable-pitch (if zenburn-use-variable-pitch
- 'variable-pitch 'default)))
+ `(let* ((class '((class color) (min-colors 89)))
+ ,@(mapcar (lambda (cons)
+ (list (intern (car cons)) (cdr cons)))
+ (append zenburn-default-colors-alist
+ zenburn-override-colors-alist))
+ ,@(mapcar (lambda (cons)
+ (list (intern (car cons)) (cdr cons)))
+ (append zenburn-default-semantic-colors-alist
+ zenburn-override-semantic-colors-alist))
+ (z-variable-pitch (if zenburn-use-variable-pitch
+ 'variable-pitch 'default)))
,@body))
;;; Theme Faces
@@ -181,8 +246,8 @@ Also bind `class' to ((class color) (min-colors 89))."
:box (:line-width -1 :style released-button)
:extend t))))
`(highlight ((t (:background ,zenburn-bg-05))))
- `(success ((t (:foreground ,zenburn-green :weight bold))))
- `(warning ((t (:foreground ,zenburn-orange :weight bold))))
+ `(success ((t (:foreground ,zenburn-success :weight bold))))
+ `(warning ((t (:foreground ,zenburn-warning :weight bold))))
`(tooltip ((t (:foreground ,zenburn-fg :background ,zenburn-bg+1))))
;;;;; ansi-colors
`(ansi-color-black ((t (:foreground ,zenburn-bg
@@ -277,31 +342,31 @@ Also bind `class' to ((class color) (min-colors 89))."
`(vertical-border ((t (:foreground ,zenburn-fg))))
;;;;; font lock
`(font-lock-builtin-face ((t (:foreground ,zenburn-fg :weight bold))))
- `(font-lock-comment-face ((t (:foreground ,zenburn-green))))
- `(font-lock-comment-delimiter-face ((t (:foreground ,zenburn-green-2))))
- `(font-lock-constant-face ((t (:foreground ,zenburn-green+4))))
- `(font-lock-doc-face ((t (:foreground ,zenburn-green+2))))
- `(font-lock-function-name-face ((t (:foreground ,zenburn-cyan))))
- `(font-lock-keyword-face ((t (:foreground ,zenburn-yellow :weight bold))))
- `(font-lock-negation-char-face ((t (:foreground ,zenburn-yellow :weight
bold))))
- `(font-lock-preprocessor-face ((t (:foreground ,zenburn-blue+1))))
+ `(font-lock-comment-face ((t (:foreground ,zenburn-comment))))
+ `(font-lock-comment-delimiter-face ((t (:foreground
,zenburn-comment-delimiter))))
+ `(font-lock-constant-face ((t (:foreground ,zenburn-constant))))
+ `(font-lock-doc-face ((t (:foreground ,zenburn-doc))))
+ `(font-lock-function-name-face ((t (:foreground ,zenburn-function-name))))
+ `(font-lock-keyword-face ((t (:foreground ,zenburn-keyword :weight bold))))
+ `(font-lock-negation-char-face ((t (:foreground ,zenburn-keyword :weight
bold))))
+ `(font-lock-preprocessor-face ((t (:foreground ,zenburn-preprocessor))))
`(font-lock-regexp-grouping-construct ((t (:foreground ,zenburn-yellow
:weight bold))))
`(font-lock-regexp-grouping-backslash ((t (:foreground ,zenburn-green
:weight bold))))
- `(font-lock-string-face ((t (:foreground ,zenburn-red))))
- `(font-lock-type-face ((t (:foreground ,zenburn-blue-1))))
- `(font-lock-variable-name-face ((t (:foreground ,zenburn-orange))))
+ `(font-lock-string-face ((t (:foreground ,zenburn-string))))
+ `(font-lock-type-face ((t (:foreground ,zenburn-type))))
+ `(font-lock-variable-name-face ((t (:foreground ,zenburn-variable-name))))
`(font-lock-warning-face ((t (:foreground ,zenburn-yellow-2 :weight bold))))
;;;;; font lock (Emacs 29+)
`(font-lock-bracket-face ((t (:foreground ,zenburn-fg))))
`(font-lock-delimiter-face ((t (:foreground ,zenburn-fg))))
`(font-lock-escape-face ((t (:foreground ,zenburn-green :weight bold))))
- `(font-lock-function-call-face ((t (:foreground ,zenburn-cyan))))
+ `(font-lock-function-call-face ((t (:foreground ,zenburn-function-name))))
`(font-lock-misc-punctuation-face ((t (:foreground ,zenburn-fg))))
- `(font-lock-number-face ((t (:foreground ,zenburn-green+4))))
+ `(font-lock-number-face ((t (:foreground ,zenburn-constant))))
`(font-lock-operator-face ((t (:foreground ,zenburn-fg))))
- `(font-lock-property-name-face ((t (:foreground ,zenburn-orange))))
- `(font-lock-property-use-face ((t (:foreground ,zenburn-orange))))
- `(font-lock-variable-use-face ((t (:foreground ,zenburn-orange))))
+ `(font-lock-property-name-face ((t (:foreground ,zenburn-variable-name))))
+ `(font-lock-property-use-face ((t (:foreground ,zenburn-variable-name))))
+ `(font-lock-variable-use-face ((t (:foreground ,zenburn-variable-name))))
`(c-annotation-face ((t (:inherit font-lock-constant-face))))
;;;;; line numbers (Emacs 26.1 and above)
@@ -597,12 +662,12 @@ Also bind `class' to ((class color) (min-colors 89))."
`(denote-faces-prompt-old-name ((t (:foreground ,zenburn-red))))
;;;;; diff
;; Please read (info "(magit)Theming Faces") before changing this.
- `(diff-added ((t (:background "#335533" :foreground
,zenburn-green))))
- `(diff-changed ((t (:background "#555511" :foreground
,zenburn-yellow-1))))
- `(diff-removed ((t (:background "#553333" :foreground
,zenburn-red-2))))
- `(diff-refine-added ((t (:background "#338833" :foreground
,zenburn-green+4))))
- `(diff-refine-changed ((t (:background "#888811" :foreground
,zenburn-yellow))))
- `(diff-refine-removed ((t (:background "#883333" :foreground
,zenburn-red))))
+ `(diff-added ((t (:background ,zenburn-diff-added-bg
:foreground ,zenburn-diff-added-fg))))
+ `(diff-changed ((t (:background ,zenburn-diff-changed-bg
:foreground ,zenburn-diff-changed-fg))))
+ `(diff-removed ((t (:background ,zenburn-diff-removed-bg
:foreground ,zenburn-diff-removed-fg))))
+ `(diff-refine-added ((t (:background ,zenburn-diff-refine-added-bg
:foreground ,zenburn-diff-refine-added-fg))))
+ `(diff-refine-changed ((t (:background ,zenburn-diff-refine-changed-bg
:foreground ,zenburn-diff-refine-changed-fg))))
+ `(diff-refine-removed ((t (:background ,zenburn-diff-refine-removed-bg
:foreground ,zenburn-diff-refine-removed-fg))))
`(diff-header ((,class (:background ,zenburn-bg+2))
(t (:background ,zenburn-fg :foreground ,zenburn-bg))))
`(diff-file-header