General refactor

In preparation for some big changes. I'd like to split out themes into
their own plugins and facilitate other users pulling in doom-themes to
publish their own derivatives.
This commit is contained in:
Henrik Lissner 2019-06-29 11:57:01 +02:00
parent 06a6292c4e
commit bda168b670
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
7 changed files with 532 additions and 524 deletions

View file

@ -1,6 +1,6 @@
;;; doom-themes-common.el -*- lexical-binding: t; -*-
;;; doom-themes-base.el -*- lexical-binding: t; -*-
(defvar doom-themes-common-faces
(defvar doom-themes-base-faces
'(;; --- custom faces -----------------------
(doom-modeline-error
:background (doom-darken red 0.25)
@ -1217,6 +1217,7 @@
(org-table :foreground violet)
(org-tag :foreground doc-comments :weight 'normal)
(org-ref-cite-face :foreground yellow :weight 'light :underline t)
(org-latex-and-related :foreground magenta)
(org-todo :foreground green :bold 'inherit)
(org-verbatim :foreground green)
(org-warning :foreground warning)
@ -1286,7 +1287,7 @@
(web-mode-html-tag-bracket-face :foreground operators))
"TODO")
(defvar doom-themes-common-vars
(defvar doom-themes-base-vars
'((ansi-color-names-vector
(vconcat (mapcar #'doom-color '(bg red green yellow blue magenta cyan fg))))
@ -1321,171 +1322,5 @@
(vc-annotate-background (doom-color 'bg)))
"TODO")
;;
;; Library
;;
(defvar doom-themes--colors)
(defvar doom--min-colors '(257 256 16))
(defvar doom--quoted-p nil)
(defvar doom-themes--faces nil)
(defun doom-themes--colors-p (item)
(declare (pure t) (side-effect-free t))
(when item
(cond ((listp item)
(let ((car (car item)))
(cond ((memq car '(quote doom-color)) nil)
((memq car '(backquote \`))
(let ((doom--quoted-p t))
(doom-themes--colors-p (cdr item))))
((eq car '\,)
(let (doom--quoted-p)
(doom-themes--colors-p (cdr item))))
((or (doom-themes--colors-p car)
(doom-themes--colors-p (cdr-safe item)))))))
((and (symbolp item)
(not (keywordp item))
(not doom--quoted-p)
(not (equal (substring (symbol-name item) 0 1) "-"))
(assq item doom-themes--colors))))))
(defun doom-themes--apply-faces (new-faces &optional default-faces)
(declare (pure t) (side-effect-free t))
(let ((default-faces (or default-faces doom-themes-common-faces))
(faces (make-hash-table :test #'eq :size (+ (length default-faces) (length new-faces))))
(directives (make-hash-table :test #'eq)))
(dolist (spec (append (mapcar #'copy-sequence default-faces) new-faces))
(if (listp (car spec))
(cl-destructuring-bind (face action &optional arg) (car spec)
(unless (assq face new-faces)
(puthash face (list action arg (cdr spec))
directives)))
(puthash (car spec) (cdr spec) faces)))
(cl-loop for face being the hash-keys of directives
for (action target spec) = (gethash face directives)
unless (memq action '(&inherit &extend &override))
do (error "Invalid operation (%s) for '%s' face" action face)
if (eq (car spec) 'quote)
do (error "Can't extend literal face spec (for '%s')" face)
;; TODO Add &all/&light/&dark extension support
else if (memq (car spec) '(&all &light &dark))
do (error "Can't extend face with &all, &light or &dark specs (for '%s')" face)
else do
(puthash face
(let ((old-spec (gethash (or target face) faces))
(plist spec))
;; remove duplicates
(while (keywordp (car plist))
(setq old-spec (plist-put old-spec (car plist) (cadr plist))
plist (cddr plist)))
old-spec)
faces))
(let (results)
(maphash (lambda (face plist)
(when (keywordp (car plist))
;; TODO Clean up duplicates in &all/&light/&dark blocks
(dolist (prop (append (unless doom-themes-enable-bold '(:weight normal :bold nil))
(unless doom-themes-enable-italic '(:slant normal :italic nil))))
(when (and (plist-member plist prop)
(not (eq (plist-get plist prop) 'inherit)))
(plist-put plist prop
(if (memq prop '(:weight :slant))
(quote 'normal))))))
(push (cons face plist) results))
faces)
(nreverse results))))
(defun doom-themes--colorize (item type)
(declare (pure t) (side-effect-free t))
(when item
(let ((doom--quoted-p doom--quoted-p))
(cond ((listp item)
(cond ((memq (car item) '(quote doom-color))
item)
((eq (car item) 'doom-ref)
(doom-themes--colorize
(apply #'doom-ref (cdr item)) type))
((let* ((item (append item nil))
(car (car item))
(doom--quoted-p
(cond ((memq car '(backquote \`)) t)
((eq car '\,) nil)
(t doom--quoted-p))))
(cons car
(cl-loop
for i in (cdr item)
collect (doom-themes--colorize i type)))))))
((and (symbolp item)
(not (keywordp item))
(not doom--quoted-p)
(not (equal (substring (symbol-name item) 0 1) "-"))
(assq item doom-themes--colors))
`(doom-color ',item ',type))
(item)))))
(defun doom-themes--build-face (face)
(declare (pure t) (side-effect-free t))
`(list
',(car face)
,(let ((face-body (cdr face)))
(cond ((keywordp (car face-body))
(let ((real-attrs face-body)
defs)
(if (doom-themes--colors-p real-attrs)
(dolist (cl doom--min-colors `(list ,@(nreverse defs)))
(push `(list '((class color) (min-colors ,cl))
(list ,@(doom-themes--colorize real-attrs cl)))
defs))
`(list (list 't (list ,@real-attrs))))))
((memq (car-safe (car face-body)) '(quote backquote \`))
(car face-body))
((let (all-attrs defs)
(dolist (attrs face-body `(list ,@(nreverse defs)))
(cond ((eq (car attrs) '&all)
(setq all-attrs (append all-attrs (cdr attrs))))
((memq (car attrs) '(&dark &light))
(let ((bg (if (eq (car attrs) '&dark) 'dark 'light))
(real-attrs (append all-attrs (cdr attrs) '())))
(cond ((doom-themes--colors-p real-attrs)
(dolist (cl doom--min-colors)
(push `(list '((class color) (min-colors ,cl) (background ,bg))
(list ,@(doom-themes--colorize real-attrs cl)))
defs)))
((push `(list '((background ,bg)) (list ,@real-attrs))
defs)))))))))))))
;;
;; Public functions
;;
(defun doom-themes-prepare-facelist (custom-faces)
"Return an alist of face definitions for `custom-theme-set-faces'.
Faces in EXTRA-FACES override the default faces."
(declare (pure t) (side-effect-free t))
(setq doom-themes--faces (doom-themes--apply-faces custom-faces))
(mapcar #'doom-themes--build-face doom-themes--faces))
(defun doom-themes-prepare-varlist (vars)
"Return an alist of variable definitions for `custom-theme-set-variables'.
Variables in EXTRA-VARS override the default ones."
(declare (pure t) (side-effect-free t))
(cl-loop for (var val) in (append doom-themes-common-vars vars)
collect `(list ',var ,val)))
(provide 'doom-themes-common)
(provide 'doom-themes-base)
;;; doom-themes-common.el ends here

View file

@ -1,68 +1,35 @@
;;; doom-themes-neotree.el -*- lexical-binding: t; -*-
;;; doom-themes-ext-neotree.el -*- lexical-binding: t; -*-
(unless doom-themes--inhibit-warning
(message "doom-themes: loading `doom-themes-neotree' directly is obsolete, call `doom-themes-neotree-config' instead"))
(defgroup doom-neotree nil
(defgroup doom-themes-neotree nil
"Options for doom's neotree theme"
:group 'doom-themes)
;;
(defface doom-neotree-dir-face '((t (:inherit neo-dir-link-face)))
"Face for directory labels."
:group 'doom-neotree)
(defface doom-neotree-file-face '((t (:inherit neo-file-link-face)))
"Face for file name labels."
:group 'doom-neotree)
;; file type faces
(defface doom-neotree-hidden-file-face '((t (:inherit font-lock-comment-face)))
"Face for labels of hidden files. See `doom-neotree-file-face-re-alist'."
:group 'doom-neotree)
(defface doom-neotree-text-file-face '((t (:inherit neo-file-link-face)))
"Face for labels of text/documentation files (readmes, org files, etc). See
`doom-neotree-file-face-re-alist'."
:group 'doom-neotree)
(defface doom-neotree-media-file-face '((t (:inherit neo-file-link-face)))
"Face for labels of media files. See `doom-neotree-file-face-re-alist'."
:group 'doom-neotree)
(defface doom-neotree-data-file-face '((t (:inherit neo-file-link-face)))
"Face for labels of data files (json, yaml, xml, etc). See
`doom-neotree-file-face-re-alist'."
:group 'doom-neotree)
(defface doom-neotree-executable-file-face '((t (:inherit neo-file-link-face)))
"TODO"
:group 'doom-neotree)
;;
(defcustom doom-neotree-project-size 1.4
;;; Variables
(defcustom doom-themes-neotree-project-size 1.4
"What :height to display the project icon at the top at."
:type 'float
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defcustom doom-neotree-folder-size 1.05
(defcustom doom-themes-neotree-folder-size 1.05
"What :height to display the folder icons at."
:type 'float
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defcustom doom-neotree-chevron-size 0.8
(defcustom doom-themes-neotree-chevron-size 0.8
"What :height to display the chevron icons at."
:type 'float
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defcustom doom-neotree-line-spacing 2
(defcustom doom-themes-neotree-line-spacing 2
"Line-spacing for neotree buffer."
:type 'symbol
:group 'doom-neotree)
:group 'doom-themes-neotree)
(define-obsolete-variable-alias 'doom-neotree-enable-file-icons 'doom-neotree-file-icons)
(defcustom doom-neotree-file-icons 'simple
(define-obsolete-variable-alias 'doom-themes-neotree-enable-file-icons 'doom-themes-neotree-file-icons)
(defcustom doom-themes-neotree-file-icons 'simple
"The style to use for the file icons. Can be nil (disabled), non-nil (for a
diverse iconset), or 'simple, which is closest's to Atom's style as it only
distinguishes text, source, pdfs, images and binary files."
@ -70,63 +37,63 @@ distinguishes text, source, pdfs, images and binary files."
(const :tag "A diverse array of file icons based on file type" t)
(const :tag "Minimalistic file icons (like Atom's)" 'simple)
(const :tag "Disable file icons" nil))
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defcustom doom-neotree-enable-folder-icons t
(defcustom doom-themes-neotree-enable-folder-icons t
"If non-nil, display folder icons next to each file. Different icons are used
depending on whether the folder is a repo, symlink or regular folder."
:type 'boolean
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defcustom doom-neotree-enable-open-chevron-icons t
(defcustom doom-themes-neotree-enable-open-chevron-icons t
"If non-nil, display the chevron-down icon next to each expanded folder."
:type 'boolean
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defcustom doom-neotree-enable-closed-chevron-icons t
(defcustom doom-themes-neotree-enable-closed-chevron-icons t
"If non-nil, display the chevron-right icon next to each collapsed folder."
:type 'boolean
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defcustom doom-neotree-enable-variable-pitch nil
"If non-nil, labels will use the `doom-neotree-dir-face' and
`doom-neotree-dir-face' faces, which inherit from the `variable-pitch' face."
(defcustom doom-themes-neotree-enable-variable-pitch nil
"If non-nil, labels will use the `doom-themes-neotree-dir-face' and
`doom-themes-neotree-dir-face' faces, which inherit from the `variable-pitch' face."
:type 'boolean
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defcustom doom-neotree-enable-type-colors t
(defcustom doom-themes-neotree-enable-type-colors t
"If non-nil, color each file/folder based on the categories determined by
`doom-neotree-file-face-re-alist'."
`doom-themes-neotree-file-face-re-alist'."
:type 'boolean
:group 'doom-neotree)
:group 'doom-themes-neotree)
(defun doom--neo-is-repo-dir-p (path)
(defun doom-themes--neo-is-repo-dir-p (path)
(or (file-exists-p (format "%s/.git" path))
(all-the-icons-dir-is-submodule path)))
(defvar doom-neotree-dir-rules
(defvar doom-themes-neotree-dir-rules
(eval-when-compile
`(("/\\(?:node_modules\\|vendor\\)$"
:face doom-neotree-hidden-file-face)
:face doom-themes-neotree-hidden-file-face)
("/\\.[^$/#]+$"
:face doom-neotree-hidden-file-face)
:face doom-themes-neotree-hidden-file-face)
(file-symlink-p
:icon (all-the-icons-octicon "file-symlink-directory"))
(doom--neo-is-repo-dir-p
(doom-themes--neo-is-repo-dir-p
:icon (all-the-icons-octicon "file-submodule"))
(t :icon (all-the-icons-octicon "file-directory"))))
"TODO")
(defvar doom-neotree-file-rules
(defvar doom-themes-neotree-file-rules
(eval-when-compile
`((file-symlink-p
:icon (all-the-icons-octicon "file-symlink-file"))
(file-executable-p
:face doom-neotree-executable-file-face
:face doom-themes-neotree-executable-file-face
:icon (all-the-icons-octicon "file-binary"))
("\\.\\(?:md\\|org\\|rst\\|log\\)\\|/[A-Z_-]+\\(?:\\.[a-z]+\\)?$"
:face doom-neotree-text-file-face
:face doom-themes-neotree-text-file-face
:icon (all-the-icons-octicon "file-text"))
(,(concat "\\." (regexp-opt '("htm" "html" "phtml" "tpl" "erb" "mustache"
"twig" "ejs" "erb" "jsx" "haml" "inky-haml"
@ -145,37 +112,75 @@ depending on whether the folder is a repo, symlink or regular folder."
"mov" "avi" "mp4" "webm" "mkv" ; video
"wav" "mp3" "ogg" "midi")) ; audio
"$")
:face doom-neotree-data-file-face
:face doom-themes-neotree-data-file-face
:icon (all-the-icons-octicon "file-media"))
(,(concat "\\.\\(?:[gl]?zip\\|bzip2\\|deb\\|dmg\\|iso\\|7z\\|rpm\\|pkg\\|dat\\|[rjt]ar\\(?:\\.gz\\)?\\)$")
:face doom-neotree-data-file-face
:face doom-themes-neotree-data-file-face
:icon (all-the-icons-octicon "file-zip"))
("\\.pdf$"
:face doom-neotree-data-file-face
:face doom-themes-neotree-data-file-face
:icon (all-the-icons-octicon "file-pdf"))
("\\.\\(?:lock\\|resolved\\|dll\\|so\\|pyc\\|elc\\|class\\|css\\.map\\)$"
:face doom-neotree-hidden-file-face
:face doom-themes-neotree-hidden-file-face
:icon (all-the-icons-octicon "file-binary"))
("/\\.[^$/#]+$"
:face doom-neotree-hidden-file-face)
:face doom-themes-neotree-hidden-file-face)
(t :icon (all-the-icons-octicon "file-text"))))
"TODO")
;;
(defun doom--neotree-no-fringes ()
"Remove fringes in neotree. They get reset each time you select the neotree
pane and are highlighted incorrectly."
;;; Faces
(defface doom-themes-neotree-dir-face '((t (:inherit neo-dir-link-face)))
"Face for directory labels."
:group 'doom-themes-neotree)
(defface doom-themes-neotree-file-face '((t (:inherit neo-file-link-face)))
"Face for file name labels."
:group 'doom-themes-neotree)
;; file type faces
(defface doom-themes-neotree-hidden-file-face '((t (:inherit font-lock-comment-face)))
"Face for labels of hidden files. See `doom-themes-neotree-file-face-re-alist'."
:group 'doom-themes-neotree)
(defface doom-themes-neotree-text-file-face '((t (:inherit neo-file-link-face)))
"Face for labels of text/documentation files (readmes, org files, etc). See
`doom-themes-neotree-file-face-re-alist'."
:group 'doom-themes-neotree)
(defface doom-themes-neotree-media-file-face '((t (:inherit neo-file-link-face)))
"Face for labels of media files. See `doom-themes-neotree-file-face-re-alist'."
:group 'doom-themes-neotree)
(defface doom-themes-neotree-data-file-face '((t (:inherit neo-file-link-face)))
"Face for labels of data files (json, yaml, xml, etc). See
`doom-themes-neotree-file-face-re-alist'."
:group 'doom-themes-neotree)
(defface doom-themes-neotree-executable-file-face '((t (:inherit neo-file-link-face)))
"TODO"
:group 'doom-themes-neotree)
;;
;;; Helpers
(defun doom-themes--neotree-no-fringes ()
"Remove fringes in neotree.
They are reset each time you select the neotree pane and highlighted
incorrectly, so remove them."
(set-window-fringes neo-global--window 0 0))
(defun doom--neotree-setup (&rest _)
(setq line-spacing doom-neotree-line-spacing
(defun doom-themes--neotree-setup (&rest _)
(setq line-spacing doom-themes-neotree-line-spacing
tab-width 1)
(when (featurep 'hl-line)
(set (make-local-variable 'hl-line-sticky-flag) t)
(hl-line-mode +1)))
(defun doom-neotree-spec (node rules)
(defun doom-themes-neotree-spec (node rules)
(let (case-fold-search)
(cl-loop for spec in rules
for pred = (car spec)
@ -188,7 +193,7 @@ pane and are highlighted incorrectly."
(defun doom--neotree-insert-file-icon (node icon &optional faces)
(if node
(cond ((eq doom-neotree-file-icons 'simple)
(cond ((eq doom-themes-neotree-file-icons 'simple)
(propertize
(if icon
(apply (car icon) (cdr icon))
@ -205,23 +210,23 @@ pane and are highlighted incorrectly."
(all-the-icons-octicon
(format "chevron-%s" (if (eq type 'open) "down" "right"))
:v-adjust 0.1
:height doom-neotree-chevron-size
:height doom-themes-neotree-chevron-size
:face `(:inherit ,faces
:family ,(all-the-icons-octicon-family)
:height ,doom-neotree-chevron-size))
:height ,doom-themes-neotree-chevron-size))
"\t")
"\t"
(when doom-neotree-enable-folder-icons
(when doom-themes-neotree-enable-folder-icons
(all-the-icons-octicon
(cond ((file-symlink-p node) "file-symlink-directory")
((file-exists-p (format "%s/.git" node)) "file-submodule")
((all-the-icons-dir-is-submodule node) "file-submodule")
("file-directory"))
:v-adjust 0
:height doom-neotree-folder-size
:height doom-themes-neotree-folder-size
:face `(:inherit ,faces
:family ,(all-the-icons-octicon-family)
:height ,doom-neotree-folder-size)))))
:height ,doom-themes-neotree-folder-size)))))
(defun doom--neotree-insert-icon (type node &optional icon faces)
"Custom hybrid unicode theme with leading whitespace."
@ -231,35 +236,38 @@ pane and are highlighted incorrectly."
(insert
(concat spc
(doom--neotree-insert-dir-icon
node (if doom-neotree-enable-open-chevron-icons type)
node (if doom-themes-neotree-enable-open-chevron-icons type)
faces)
vspc)))
((eq type 'close)
(insert
(concat spc
(doom--neotree-insert-dir-icon
node (if doom-neotree-enable-closed-chevron-icons type)
node (if doom-themes-neotree-enable-closed-chevron-icons type)
faces)
vspc)))
((eq type 'leaf)
(insert
(concat (when (or doom-neotree-enable-open-chevron-icons
doom-neotree-enable-closed-chevron-icons)
(concat (when (or doom-themes-neotree-enable-open-chevron-icons
doom-themes-neotree-enable-closed-chevron-icons)
spc)
(when doom-neotree-enable-folder-icons spc)
(when doom-neotree-file-icons
(when doom-themes-neotree-enable-folder-icons spc)
(when doom-themes-neotree-file-icons
(concat spc (doom--neotree-insert-file-icon node icon faces)))
vspc))))))
;;
(defun doom-neotree-insert-root (node)
;;; Public library
(defun doom-themes-neotree-insert-root (node)
;; insert icon
(when (display-graphic-p)
(insert
(concat (propertize "\t" 'face 'neo-root-dir-face)
(all-the-icons-octicon
"repo"
:height doom-neotree-project-size
:height doom-themes-neotree-project-size
:face 'neo-root-dir-face
:v-adjust -0.1)
(propertize " " 'face 'neo-root-dir-face))))
@ -268,12 +276,12 @@ pane and are highlighted incorrectly."
(propertize
(concat (or (neo-path--file-short-name node) "-")
"\n")
'face `(:inherit ,(append (if doom-neotree-enable-variable-pitch '(variable-pitch))
'face `(:inherit ,(append (if doom-themes-neotree-enable-variable-pitch '(variable-pitch))
'(neo-root-dir-face))))))
(defun doom-neotree-insert-dir (node depth expanded)
(defun doom-themes-neotree-insert-dir (node depth expanded)
(let ((short-name (neo-path--file-short-name node))
(faces '(doom-neotree-dir-face))
(faces '(doom-themes-neotree-dir-face))
icon-text)
;; insert indentation
(insert-char ?\s (* (- depth 1) 2))
@ -286,7 +294,7 @@ pane and are highlighted incorrectly."
(not (eq (cdr vc) 'neo-vc-up-to-date-face))
(setq faces (list (cdr vc))))
(cl-destructuring-bind (&key face icon)
(doom-neotree-spec node doom-neotree-dir-rules)
(doom-themes-neotree-spec node doom-themes-neotree-dir-rules)
(if face (push face faces))
(if icon (setq icon-text icon)))))
;; insert icon
@ -295,7 +303,7 @@ pane and are highlighted incorrectly."
(doom--neotree-insert-icon type node icon-text faces)
(neo-buffer--insert-fold-symbol type node)))
;; insert label button
(when doom-neotree-enable-variable-pitch
(when doom-themes-neotree-enable-variable-pitch
(push 'variable-pitch faces))
(insert-button short-name
'follow-link t
@ -306,10 +314,10 @@ pane and are highlighted incorrectly."
(neo-buffer--node-list-set nil node)
(neo-buffer--newline-and-begin)))
(defun doom-neotree-insert-file (node depth)
(defun doom-themes-neotree-insert-file (node depth)
(let ((short-name (neo-path--file-short-name node))
(vc (if neo-vc-integration (neo-vc-for-node node)))
(faces '(doom-neotree-file-face))
(faces '(doom-themes-neotree-file-face))
icon-text)
;; insert indentation
(insert-char ?\s (* (- depth 1) 2))
@ -318,7 +326,7 @@ pane and are highlighted incorrectly."
(not (eq (cdr vc) 'neo-vc-up-to-date-face))
(setq faces (list (cdr vc))))
(cl-destructuring-bind (&key face icon)
(doom-neotree-spec node doom-neotree-file-rules)
(doom-themes-neotree-spec node doom-themes-neotree-file-rules)
(if face (push face faces))
(if icon (setq icon-text icon))))
;; insert icon
@ -326,7 +334,7 @@ pane and are highlighted incorrectly."
(doom--neotree-insert-icon 'leaf node icon-text faces)
(neo-buffer--insert-fold-symbol 'leaf node))
;; insert label button
(when doom-neotree-enable-variable-pitch
(when doom-themes-neotree-enable-variable-pitch
(push 'variable-pitch faces))
(insert-button short-name
'follow-link t
@ -337,23 +345,30 @@ pane and are highlighted incorrectly."
(neo-buffer--node-list-set nil node)
(neo-buffer--newline-and-begin)))
;;
(eval-after-load 'neotree
(lambda ()
(unless (require 'all-the-icons nil t)
(error "all-the-icons isn't installed"))
;; Enable buffer-local hl-line and adjust line-spacing
(add-hook 'neo-after-create-hook #'doom--neotree-setup)
;; Incompatible
(setq neo-vc-integration nil)
;; Remove fringes in Neotree pane
(advice-add #'neo-global--select-window :after #'doom--neotree-no-fringes)
;; Patch neotree to use `doom--neotree-insert-icon'
(advice-add #'neo-buffer--insert-file-entry :override #'doom-neotree-insert-file)
(advice-add #'neo-buffer--insert-dir-entry :override #'doom-neotree-insert-dir)
;; Shorter pwd in neotree override
(advice-add #'neo-buffer--insert-root-entry :override #'doom-neotree-insert-root)))
;;; Bootstrap
(provide 'doom-themes-neotree)
(with-eval-after-load 'neotree
(unless (require 'all-the-icons nil t)
(error "all-the-icons isn't installed"))
;; Incompatible with this theme
(setq neo-vc-integration nil)
;; Enable buffer-local hl-line and adjust line-spacing
(add-hook 'neo-after-create-hook #'doom-themes--neotree-setup)
;; Remove fringes in Neotree pane
(advice-add #'neo-global--select-window :after #'doom-themes--neotree-no-fringes)
;; Patch neotree to use `doom--neotree-insert-icon'
(advice-add #'neo-buffer--insert-file-entry :override #'doom-themes-neotree-insert-file)
(advice-add #'neo-buffer--insert-dir-entry :override #'doom-themes-neotree-insert-dir)
;; Shorter pwd in neotree override
(advice-add #'neo-buffer--insert-root-entry :override #'doom-themes-neotree-insert-root))
;;;###autoload
(defun doom-themes-neotree-config ()
"Install doom-themes' neotree configuration.
Includes an Atom-esque icon theme and highlighting based on filetype.")
(provide 'doom-themes-ext-neotree)
;;; doom-themes-neotree.el ends here

View file

@ -1,27 +1,27 @@
;;; doom-themes-org.el --- improve org-mode support for doom-themes -*- lexical-binding: t; -*-
;;; doom-themes-ext-org.el --- improve org-mode support for doom-themes -*- lexical-binding: t; -*-
(defgroup doom-org nil
(defgroup doom-themes-org nil
"Options for doom's org customizations."
:group 'doom-themes)
(defcustom doom-org-special-tags t
"If non-nil, highlight #hashtags and @attags especially."
:type 'boolean
:group 'doom-org)
:group 'doom-themes-org)
;; TODO Remove this once released with org-mode
(defface org-upcoming-distant-deadline '((t :inherit font-lock-comment-face))
"Face for items scheduled previously, not done, and have a distant deadline.
See also `org-agenda-deadline-faces'."
:group 'doom-org)
:group 'doom-themes-org)
;;
(defsubst doom-org--tag-face (n)
(defsubst doom-themes--org-tag-face (n)
(let ((kwd (match-string n)))
(or (and (equal kwd "#") 'org-tag)
(and (equal kwd "@") 'org-formula))))
(defun doom-org-custom-fontification ()
(defun doom-themes-enable-org-fontification ()
"Correct (and improve) org-mode's font-lock keywords.
1. Re-set `org-todo' & `org-headline-done' faces, to make them respect
@ -65,7 +65,7 @@ See also `org-agenda-deadline-faces'."
("^ *\\(-----+\\)$" 1 'org-meta-line))
;; custom #hashtags & @at-tags for another level of organization
(when doom-org-special-tags
'(("\\s-\\(\\([#@]\\)[^+ \n.,]+\\)" 1 (doom-org--tag-face 2) prepend)))))))
'(("\\s-\\(\\([#@]\\)[^+ \n.,]+\\)" 1 (doom-themes--org-tag-face 2) prepend)))))))
;; Bootstrap
@ -80,7 +80,11 @@ See also `org-agenda-deadline-faces'."
(0.5 . org-upcoming-deadline)
(0.0 . org-upcoming-distant-deadline)))
(add-hook 'org-font-lock-set-keywords-hook #'doom-org-custom-fontification)
(add-hook 'org-font-lock-set-keywords-hook #'doom-themes-enable-org-fontification)
;;;###autoload
(defun doom-themes-org-config ()
"Enable custom fontification & improves theme integration with org-mode.")
(provide 'doom-themes-org)
;;; doom-themes-org.el ends here

173
doom-themes-ext-treemacs.el Normal file
View file

@ -0,0 +1,173 @@
;;; doom-themes-ext-treemacs.el --- description -*- lexical-binding: t; -*-
(defgroup doom-themes-treemacs nil
"Options for doom's treemacs theme"
:group 'doom-themes)
;;
;;; Variables
(defcustom doom-themes-treemacs-enable-variable-pitch t
"If non-nil, the labels for files, folders and projects are displayed with the
variable-pitch face."
:type 'boolean
:group 'doom-themes-treemacs)
(defcustom doom-themes-treemacs-line-spacing 1
"Line-spacing for treemacs buffer."
:type 'integer
:group 'doom-themes-treemacs)
;;
;;; Library
(defun doom-themes-hide-fringes ()
"Remove fringes in currnent window."
(when (display-graphic-p)
(set-window-fringes nil 0 0)))
(defun doom-themes-setup-treemacs (&rest _)
"Set up `line-spacing' and `tab-width'."
(setq line-spacing doom-themes-treemacs-line-spacing
tab-width 1))
(defun doom-themes-hide-modeline ()
(setq mode-line-format nil))
(defun doom-themes-enable-treemacs-variable-pitch-labels (&rest _)
(when doom-themes-treemacs-enable-variable-pitch
(dolist (face '(treemacs-root-face
treemacs-git-unmodified-face
treemacs-git-modified-face
treemacs-git-renamed-face
treemacs-git-ignored-face
treemacs-git-untracked-face
treemacs-git-added-face
treemacs-git-conflict-face
treemacs-directory-face
treemacs-directory-collapsed-face
treemacs-file-face
treemacs-tags-face))
(let ((faces (face-attribute face :inherit nil)))
(set-face-attribute
face nil :inherit
`(variable-pitch ,@(delq 'unspecified (if (listp faces) faces (list faces)))))))))
;;
;;; Bootstrap
(eval-when-compile
(require 'treemacs-themes nil t) ; For `treemacs-create-theme'
(require 'treemacs-icons nil t)) ; For `treemacs-create-icon'
(with-eval-after-load 'treemacs
(unless (require 'all-the-icons nil t)
(error "all-the-icons isn't installed"))
(add-hook 'treemacs-mode-hook #'doom-themes-setup-treemacs)
;; The modeline isn't useful in treemacs
(add-hook 'treemacs-mode-hook #'doom-themes-hide-modeline)
;; Disable fringes (and reset them everytime treemacs is selected because it
;; may change due to outside factors)
(add-hook 'treemacs-mode-hook #'doom-themes-hide-fringes)
(advice-add #'treemacs-select-window :after #'doom-themes-hide-fringes)
;; variable-pitch labels for files/folders
(doom-themes-enable-treemacs-variable-pitch-labels)
(advice-add #'load-theme :after #'doom-themes-enable-treemacs-variable-pitch-labels)
;; minimalistic atom-inspired icon theme
(treemacs-create-theme "doom"
:config
(let ((face-spec '(:inherit font-lock-doc-face :slant normal)))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "repo" :v-adjust -0.1 :face face-spec))
:extensions (root))
(treemacs-create-icon
:icon (format "%s\t%s\t"
(all-the-icons-octicon "chevron-down" :height 0.75 :v-adjust 0.1 :face face-spec)
(all-the-icons-octicon "file-directory" :v-adjust 0 :face face-spec))
:extensions (dir-open))
(treemacs-create-icon
:icon (format "%s\t%s\t"
(all-the-icons-octicon "chevron-right" :height 0.75 :v-adjust 0.1 :face face-spec)
(all-the-icons-octicon "file-directory" :v-adjust 0 :face face-spec))
:extensions (dir-closed))
(treemacs-create-icon
:icon (format "%s\t%s\t"
(all-the-icons-octicon "chevron-down" :height 0.75 :v-adjust 0.1 :face face-spec)
(all-the-icons-octicon "package" :v-adjust 0 :face face-spec)) :extensions (tag-open))
(treemacs-create-icon
:icon (format "%s\t%s\t"
(all-the-icons-octicon "chevron-right" :height 0.75 :v-adjust 0.1 :face face-spec)
(all-the-icons-octicon "package" :v-adjust 0 :face face-spec))
:extensions (tag-closed))
(treemacs-create-icon
:icon (format "%s\t" (all-the-icons-octicon "tag" :height 0.9 :v-adjust 0 :face face-spec))
:extensions (tag-leaf))
(treemacs-create-icon
:icon (format "%s\t" (all-the-icons-octicon "flame" :v-adjust 0 :face face-spec))
:extensions (error))
(treemacs-create-icon
:icon (format "%s\t" (all-the-icons-octicon "stop" :v-adjust 0 :face face-spec))
:extensions (warning))
(treemacs-create-icon
:icon (format "%s\t" (all-the-icons-octicon "info" :height 0.75 :v-adjust 0.1 :face face-spec))
:extensions (info))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-media" :v-adjust 0 :face face-spec))
:extensions ("png" "jpg" "jpeg" "gif" "ico" "tif" "tiff" "svg" "bmp"
"psd" "ai" "eps" "indd" "mov" "avi" "mp4" "webm" "mkv"
"wav" "mp3" "ogg" "midi"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-code" :v-adjust 0 :face face-spec))
:extensions ("yml" "yaml" "sh" "zsh" "fish" "c" "h" "cpp" "cxx" "hpp"
"tpp" "cc" "hh" "hs" "lhs" "cabal" "py" "pyc" "rs" "el"
"elc" "clj" "cljs" "cljc" "ts" "tsx" "vue" "css" "html"
"htm" "dart" "java" "kt" "scala" "sbt" "go" "js" "jsx"
"hy" "json" "jl" "ex" "exs" "eex" "ml" "mli" "pp" "dockerfile"
"vagrantfile" "j2" "jinja2" "tex" "racket" "rkt" "rktl" "rktd"
"scrbl" "scribble" "plt" "makefile" "elm" "xml" "xsl" "rb"
"scss" "lua" "lisp" "scm" "sql" "toml" "nim" "pl" "pm" "perl"
"vimrc" "tridactylrc" "vimperatorrc" "ideavimrc" "vrapperrc"
"cask" "r" "re" "rei" "bashrc" "zshrc" "inputrc" "editorconfig"
"gitconfig"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "book" :v-adjust 0 :face face-spec))
:extensions ("lrf" "lrx" "cbr" "cbz" "cb7" "cbt" "cba" "chm" "djvu"
"doc" "docx" "pdb" "pdb" "fb2" "xeb" "ceb" "inf" "azw"
"azw3" "kf8" "kfx" "lit" "prc" "mobi" "exe" "or" "html"
"pkg" "opf" "txt" "pdb" "ps" "rtf" "pdg" "xml" "tr2"
"tr3" "oxps" "xps"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-text" :v-adjust 0 :face face-spec))
:extensions ("md" "markdown" "rst" "log" "org" "txt"
"CONTRIBUTE" "LICENSE" "README" "CHANGELOG"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-binary" :v-adjust 0 :face face-spec))
:extensions ("exe" "dll" "obj" "so" "o" "out"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-pdf" :v-adjust 0 :face face-spec))
:extensions ("pdf"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-zip" :v-adjust 0 :face face-spec))
:extensions ("zip" "7z" "tar" "gz" "rar" "tgz"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-text" :v-adjust 0 :face face-spec))
:extensions (fallback))))
(treemacs-load-theme "doom"))
;;;###autoload
(defun doom-themes-treemacs-config ()
"Install doom-themes' treemacs configuration.
Includes an Atom-esque icon theme and highlighting based on filetype.")
(provide 'doom-themes-ext-treemacs)
;;; doom-themes-treemacs.el ends here

View file

@ -0,0 +1,36 @@
;;; doom-themes-ext-visual-bell.el --- flash mode-line on error -*- lexical-binding: t; -*-
(defface doom-visual-bell '((t (:inherit error :inverse-video t)))
"Face to use for the mode-line when `doom-themes-visual-bell-config' is used."
:group 'doom-themes)
(defvar doom-themes--bell-p nil)
;;;###autoload
(defun doom-themes-visual-bell-fn ()
"Blink the mode-line red briefly. Set `ring-bell-function' to this to use it."
(unless doom-themes--bell-p
(let ((old-remap (copy-alist face-remapping-alist)))
(setq doom-themes--bell-p t)
(setq face-remapping-alist
(append (delete (assq 'mode-line face-remapping-alist)
face-remapping-alist)
'((mode-line doom-visual-bell))))
(force-mode-line-update)
(run-with-timer 0.15 nil
(lambda (remap buf)
(with-current-buffer buf
(when (assq 'mode-line face-remapping-alist)
(setq face-remapping-alist remap
doom-themes--bell-p nil))
(force-mode-line-update)))
old-remap
(current-buffer)))))
;;;###autoload
(defun doom-themes-visual-bell-config ()
"Enable flashing the mode-line on error."
(setq ring-bell-function #'doom-themes-visual-bell-fn
visible-bell t))
(provide 'doom-themes-ext-visual-bell)
;;; doom-themes-ext-visual-bell.el ends here

View file

@ -1,161 +0,0 @@
;;; doom-themes-treemacs.el --- description -*- lexical-binding: t; -*-
;;
;;; Variables
(defgroup doom-treemacs nil
"Options for doom's treemacs theme"
:group 'doom-themes)
(defcustom doom-treemacs-enable-variable-pitch t
"If non-nil, the labels for files, folders and projects are displayed with the
variable-pitch face."
:type 'boolean
:group 'doom-treemacs)
(defcustom doom-treemacs-line-spacing 1
"Line-spacing for treemacs buffer."
:type 'integer
:group 'doom-treemacs)
;;
;;; Library
(defun doom--treemacs-no-fringes ()
"Remove fringes in treemacs. They get reset each time you select the neotree
pane and are highlighted incorrectly when used with `solaire-mode'."
(when (display-graphic-p)
(set-window-fringes nil 0 0)))
(defun doom--treemacs-setup (&rest _)
(setq line-spacing doom-treemacs-line-spacing
tab-width 1))
(defun doom--treemacs-hide-modeline ()
(setq mode-line-format nil))
(defun doom--treemacs-variable-pitch-labels (&rest _)
(when doom-treemacs-enable-variable-pitch
(dolist (face '(treemacs-root-face
treemacs-git-unmodified-face
treemacs-git-modified-face
treemacs-git-renamed-face
treemacs-git-ignored-face
treemacs-git-untracked-face
treemacs-git-added-face
treemacs-git-conflict-face
treemacs-directory-face
treemacs-directory-collapsed-face
treemacs-file-face
treemacs-tags-face))
(let ((faces (face-attribute face :inherit nil)))
(set-face-attribute
face nil :inherit
`(variable-pitch ,@(delq 'unspecified (if (listp faces) faces (list faces)))))))))
;;
;;; Bootstrap
(defvar all-the-icons-default-adjust)
(eval-after-load 'treemacs
(lambda ()
(unless (require 'all-the-icons nil t)
(error "all-the-icons isn't installed"))
(add-hook 'treemacs-mode-hook #'doom--treemacs-setup)
(add-hook 'treemacs-mode-hook #'doom--treemacs-hide-modeline)
;; no fringes in treemacs window
(add-hook 'treemacs-mode-hook #'doom--treemacs-no-fringes)
(advice-add #'treemacs-select-window :after #'doom--treemacs-no-fringes)
;; variable-pitch labels for files/folders
(doom--treemacs-variable-pitch-labels)
(advice-add #'load-theme :after #'doom--treemacs-variable-pitch-labels)
;; minimalistic atom-inspired icon theme
(treemacs-create-theme "Doom"
:config
(let ((face-spec '(:inherit font-lock-doc-face :slant normal)))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "repo" :v-adjust -0.1 :face face-spec))
:extensions (root))
(treemacs-create-icon
:icon (format "%s\t%s\t"
(all-the-icons-octicon "chevron-down" :height 0.75 :v-adjust 0.1 :face face-spec)
(all-the-icons-octicon "file-directory" :v-adjust 0 :face face-spec))
:extensions (dir-open))
(treemacs-create-icon
:icon (format "%s\t%s\t"
(all-the-icons-octicon "chevron-right" :height 0.75 :v-adjust 0.1 :face face-spec)
(all-the-icons-octicon "file-directory" :v-adjust 0 :face face-spec))
:extensions (dir-closed))
(treemacs-create-icon
:icon (format "%s\t%s\t"
(all-the-icons-octicon "chevron-down" :height 0.75 :v-adjust 0.1 :face face-spec)
(all-the-icons-octicon "package" :v-adjust 0 :face face-spec)) :extensions (tag-open))
(treemacs-create-icon
:icon (format "%s\t%s\t"
(all-the-icons-octicon "chevron-right" :height 0.75 :v-adjust 0.1 :face face-spec)
(all-the-icons-octicon "package" :v-adjust 0 :face face-spec))
:extensions (tag-closed))
(treemacs-create-icon
:icon (format "%s\t" (all-the-icons-octicon "tag" :height 0.9 :v-adjust 0 :face face-spec))
:extensions (tag-leaf))
(treemacs-create-icon
:icon (format "%s\t" (all-the-icons-octicon "flame" :v-adjust 0 :face face-spec))
:extensions (error))
(treemacs-create-icon
:icon (format "%s\t" (all-the-icons-octicon "stop" :v-adjust 0 :face face-spec))
:extensions (warning))
(treemacs-create-icon
:icon (format "%s\t" (all-the-icons-octicon "info" :height 0.75 :v-adjust 0.1 :face face-spec))
:extensions (info))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-media" :v-adjust 0 :face face-spec))
:extensions ("png" "jpg" "jpeg" "gif" "ico" "tif" "tiff" "svg" "bmp"
"psd" "ai" "eps" "indd" "mov" "avi" "mp4" "webm" "mkv"
"wav" "mp3" "ogg" "midi"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-code" :v-adjust 0 :face face-spec))
:extensions ("yml" "yaml" "sh" "zsh" "fish" "c" "h" "cpp" "cxx" "hpp"
"tpp" "cc" "hh" "hs" "lhs" "cabal" "py" "pyc" "rs" "el"
"elc" "clj" "cljs" "cljc" "ts" "tsx" "vue" "css" "html"
"htm" "dart" "java" "kt" "scala" "sbt" "go" "js" "jsx"
"hy" "json" "jl" "ex" "exs" "eex" "ml" "mli" "pp" "dockerfile"
"vagrantfile" "j2" "jinja2" "tex" "racket" "rkt" "rktl" "rktd"
"scrbl" "scribble" "plt" "makefile" "elm" "xml" "xsl" "rb"
"scss" "lua" "lisp" "scm" "sql" "toml" "nim" "pl" "pm" "perl"
"vimrc" "tridactylrc" "vimperatorrc" "ideavimrc" "vrapperrc"
"cask" "r" "re" "rei" "bashrc" "zshrc" "inputrc" "editorconfig"
"gitconfig"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "book" :v-adjust 0 :face face-spec))
:extensions ("lrf" "lrx" "cbr" "cbz" "cb7" "cbt" "cba" "chm" "djvu"
"doc" "docx" "pdb" "pdb" "fb2" "xeb" "ceb" "inf" "azw"
"azw3" "kf8" "kfx" "lit" "prc" "mobi" "exe" "or" "html"
"pkg" "opf" "txt" "pdb" "ps" "rtf" "pdg" "xml" "tr2"
"tr3" "oxps" "xps"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-text" :v-adjust 0 :face face-spec))
:extensions ("md" "markdown" "rst" "log" "org" "txt"
"CONTRIBUTE" "LICENSE" "README" "CHANGELOG"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-binary" :v-adjust 0 :face face-spec))
:extensions ("exe" "dll" "obj" "so" "o" "out"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-pdf" :v-adjust 0 :face face-spec))
:extensions ("pdf"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-zip" :v-adjust 0 :face face-spec))
:extensions ("zip" "7z" "tar" "gz" "rar" "tgz"))
(treemacs-create-icon
:icon (format " %s\t" (all-the-icons-octicon "file-text" :v-adjust 0 :face face-spec))
:extensions (fallback))))
(treemacs-load-theme "Doom")))
(provide 'doom-themes-treemacs)
;;; doom-themes-treemacs.el ends here

View file

@ -67,15 +67,16 @@
;;; Code:
(require 'cl-lib)
(require 'doom-themes-common)
(require 'doom-themes-base)
(defgroup doom-themes nil
"Options for doom-themes."
:group 'faces)
(defface doom-modeline-error '((t (:inherit error :inverse-video t)))
"Face to use for the mode-line when `doom-themes-visual-bell-config' is used."
:group 'doom-themes)
(defcustom doom-themes-padded-modeline nil
"Default value for padded-modeline setting for themes that support it."
:group 'doom-themes
:type '(or integer boolean))
;;
(defcustom doom-themes-enable-bold t
@ -88,20 +89,154 @@
:group 'doom-themes
:type 'boolean)
(defcustom doom-themes-padded-modeline nil
"Default value for padded-modeline setting for themes that support it."
:group 'doom-themes
:type '(or integer boolean))
(define-obsolete-variable-alias 'doom-enable-italic 'doom-themes-enable-italic "1.2.9")
(define-obsolete-variable-alias 'doom-enable-bold 'doom-themes-enable-bold "1.2.9")
;;
;;; API
(defvar doom-themes--colors nil)
(defvar doom-themes--inhibit-warning nil)
(defvar doom-themes--bell-p nil)
(defvar doom--min-colors '(257 256 16))
(defvar doom--quoted-p nil)
(defvar doom-themes--faces nil)
(defun doom-themes--colors-p (item)
(declare (pure t) (side-effect-free t))
(when item
(cond ((listp item)
(let ((car (car item)))
(cond ((memq car '(quote doom-color)) nil)
((memq car '(backquote \`))
(let ((doom--quoted-p t))
(doom-themes--colors-p (cdr item))))
((eq car '\,)
(let (doom--quoted-p)
(doom-themes--colors-p (cdr item))))
((or (doom-themes--colors-p car)
(doom-themes--colors-p (cdr-safe item)))))))
((and (symbolp item)
(not (keywordp item))
(not doom--quoted-p)
(not (equal (substring (symbol-name item) 0 1) "-"))
(assq item doom-themes--colors))))))
(defun doom-themes--apply-faces (new-faces &optional default-faces)
(declare (pure t) (side-effect-free t))
(let ((default-faces (or default-faces doom-themes-base-faces))
(faces (make-hash-table :test #'eq :size (+ (length default-faces) (length new-faces))))
(directives (make-hash-table :test #'eq)))
(dolist (spec (append (mapcar #'copy-sequence default-faces) new-faces))
(if (listp (car spec))
(cl-destructuring-bind (face action &optional arg) (car spec)
(unless (assq face new-faces)
(puthash face (list action arg (cdr spec))
directives)))
(puthash (car spec) (cdr spec) faces)))
(cl-loop for face being the hash-keys of directives
for (action target spec) = (gethash face directives)
unless (memq action '(&inherit &extend &override))
do (error "Invalid operation (%s) for '%s' face" action face)
if (eq (car spec) 'quote)
do (error "Can't extend literal face spec (for '%s')" face)
;; TODO Add &all/&light/&dark extension support
else if (memq (car spec) '(&all &light &dark))
do (error "Can't extend face with &all, &light or &dark specs (for '%s')" face)
else do
(puthash face
(let ((old-spec (gethash (or target face) faces))
(plist spec))
;; remove duplicates
(while (keywordp (car plist))
(setq old-spec (plist-put old-spec (car plist) (cadr plist))
plist (cddr plist)))
old-spec)
faces))
(let (results)
(maphash (lambda (face plist)
(when (keywordp (car plist))
;; TODO Clean up duplicates in &all/&light/&dark blocks
(dolist (prop (append (unless doom-themes-enable-bold '(:weight normal :bold nil))
(unless doom-themes-enable-italic '(:slant normal :italic nil))))
(when (and (plist-member plist prop)
(not (eq (plist-get plist prop) 'inherit)))
(plist-put plist prop
(if (memq prop '(:weight :slant))
(quote 'normal))))))
(push (cons face plist) results))
faces)
(nreverse results))))
(defun doom-themes--colorize (item type)
(declare (pure t) (side-effect-free t))
(when item
(let ((doom--quoted-p doom--quoted-p))
(cond ((listp item)
(cond ((memq (car item) '(quote doom-color))
item)
((eq (car item) 'doom-ref)
(doom-themes--colorize
(apply #'doom-ref (cdr item)) type))
((let* ((item (append item nil))
(car (car item))
(doom--quoted-p
(cond ((memq car '(backquote \`)) t)
((eq car '\,) nil)
(t doom--quoted-p))))
(cons car
(cl-loop
for i in (cdr item)
collect (doom-themes--colorize i type)))))))
((and (symbolp item)
(not (keywordp item))
(not doom--quoted-p)
(not (equal (substring (symbol-name item) 0 1) "-"))
(assq item doom-themes--colors))
`(doom-color ',item ',type))
(item)))))
(defun doom-themes--build-face (face)
(declare (pure t) (side-effect-free t))
`(list
',(car face)
,(let ((face-body (cdr face)))
(cond ((keywordp (car face-body))
(let ((real-attrs face-body)
defs)
(if (doom-themes--colors-p real-attrs)
(dolist (cl doom--min-colors `(list ,@(nreverse defs)))
(push `(list '((class color) (min-colors ,cl))
(list ,@(doom-themes--colorize real-attrs cl)))
defs))
`(list (list 't (list ,@real-attrs))))))
((memq (car-safe (car face-body)) '(quote backquote \`))
(car face-body))
((let (all-attrs defs)
(dolist (attrs face-body `(list ,@(nreverse defs)))
(cond ((eq (car attrs) '&all)
(setq all-attrs (append all-attrs (cdr attrs))))
((memq (car attrs) '(&dark &light))
(let ((bg (if (eq (car attrs) '&dark) 'dark 'light))
(real-attrs (append all-attrs (cdr attrs) '())))
(cond ((doom-themes--colors-p real-attrs)
(dolist (cl doom--min-colors)
(push `(list '((class color) (min-colors ,cl) (background ,bg))
(list ,@(doom-themes--colorize real-attrs cl)))
defs)))
((push `(list '((background ,bg)) (list ,@real-attrs))
defs)))))))))))))
;; Color helper functions
;;
;;; Color helper functions
;; Shamelessly *borrowed* from solarized
;;;###autoload
(defun doom-name-to-rgb (color)
@ -130,7 +265,7 @@ float between 0 and 1)"
for other in (doom-name-to-rgb color2)
collect (+ (* alpha it) (* other (- 1 alpha))))))
(t color1))))
(color1))))
;;;###autoload
(defun doom-darken (color alpha)
@ -142,8 +277,7 @@ float between 0 and 1)"
((listp color)
(cl-loop for c in color collect (doom-darken c alpha)))
(t
(doom-blend color "#000000" (- 1 alpha)))))
((doom-blend color "#000000" (- 1 alpha)))))
;;;###autoload
(defun doom-lighten (color alpha)
@ -155,8 +289,7 @@ between 0 and 1)."
((listp color)
(cl-loop for c in color collect (doom-lighten c alpha)))
(t
(doom-blend color "#FFFFFF" (- 1 alpha)))))
((doom-blend color "#FFFFFF" (- 1 alpha)))))
;;;###autoload
(defun doom-color (name &optional type)
@ -189,6 +322,26 @@ between 0 and 1)."
prop face (if class (format "'s '%s' class" class) "")))
(plist-get spec prop)))
;;
;;; Defining themes
(defun doom-themes-prepare-facelist (custom-faces)
"Return an alist of face definitions for `custom-theme-set-faces'.
Faces in EXTRA-FACES override the default faces."
(declare (pure t) (side-effect-free t))
(setq doom-themes--faces (doom-themes--apply-faces custom-faces))
(mapcar #'doom-themes--build-face doom-themes--faces))
(defun doom-themes-prepare-varlist (vars)
"Return an alist of variable definitions for `custom-theme-set-variables'.
Variables in EXTRA-VARS override the default ones."
(declare (pure t) (side-effect-free t))
(cl-loop for (var val) in (append doom-themes-base-vars vars)
collect `(list ',var ,val)))
;;;###autoload
(defun doom-themes-set-faces (theme &rest faces)
"Customize THEME (a symbol) with FACES.
@ -231,53 +384,6 @@ theme face specs. These is a simplified spec. For example:
(unless italic (set-face-italic 'italic nil))
(provide-theme ',name))))
;;;###autoload
(defun doom-themes-org-config ()
"Enable custom fontification and improves doom-themes integration with org-mode."
(require 'doom-themes-org))
;;;###autoload
(defun doom-themes-neotree-config ()
"Install doom-themes' neotree configuration.
Includes an Atom-esque icon theme and highlighting based on filetype."
(let ((doom-themes--inhibit-warning t))
(require 'doom-themes-neotree)))
;;;###autoload
(defun doom-themes-treemacs-config ()
"Install doom-themes' treemacs configuration.
Includes an Atom-esque icon theme and highlighting based on filetype."
(require 'doom-themes-treemacs))
;;;###autoload
(defun doom-themes-visual-bell-config ()
"Enable flashing the mode-line on error."
(setq ring-bell-function #'doom-themes-visual-bell-fn
visible-bell t))
;;;###autoload
(defun doom-themes-visual-bell-fn ()
"Blink the mode-line red briefly. Set `ring-bell-function' to this to use it."
(unless doom-themes--bell-p
(let ((old-remap (copy-alist face-remapping-alist)))
(setq doom-themes--bell-p t)
(setq face-remapping-alist
(append (delete (assq 'mode-line face-remapping-alist)
face-remapping-alist)
'((mode-line doom-modeline-error))))
(force-mode-line-update)
(run-with-timer 0.15 nil
(lambda (remap buf)
(with-current-buffer buf
(when (assq 'mode-line face-remapping-alist)
(setq face-remapping-alist remap
doom-themes--bell-p nil))
(force-mode-line-update)))
old-remap
(current-buffer)))))
;;;###autoload
(when (and (boundp 'custom-theme-load-path) load-file-name)
(let* ((base (file-name-directory load-file-name))