emacs-config/elpa/solarized-theme-20200411.1026/solarized.el

427 lines
18 KiB
EmacsLisp

;;; solarized.el --- Solarized theme -*- lexical-binding: t -*-
;; Copyright (C) 2011-2019 Bozhidar Batsov
;; Author: Bozhidar Batsov <bozhidar@batsov.com>
;; Author: Thomas Frössman <thomasf@jossystem.se>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Main solarized file
;;; Code:
(require 'cl-lib)
(require 'color)
(require 'solarized-faces)
;;; Options
(defgroup solarized nil
"Solarized theme options.
The theme has to be reloaded after changing anything in this group."
:group 'faces)
(defcustom solarized-theme-dir (locate-user-emacs-file "themes/")
"Directory to save theme file."
:type 'directory
:group 'solarized)
(defcustom solarized-distinct-fringe-background nil
"Make the fringe background different from the normal background color.
Also affects `linum-mode' background."
:type 'boolean
:group 'solarized)
(defcustom solarized-distinct-doc-face nil
"Make `font-lock-doc-face' stand out more.
Related discussion: https://github.com/bbatsov/solarized-emacs/issues/158"
:type 'boolean
:group 'solarized)
(defcustom solarized-use-variable-pitch t
"Use variable pitch face for some headings and titles."
:type 'boolean
:group 'solarized)
(defcustom solarized-use-less-bold nil
"Use bold weight less often."
:type 'boolean
:group 'solarized)
(defcustom solarized-use-more-italic nil
"Use italic slant more often."
:type 'boolean
:group 'solarized)
(defcustom solarized-emphasize-indicators t
"Use more colors for indicators such as git:gutter, flycheck and similar."
:type 'boolean
:group 'solarized)
(defcustom solarized-high-contrast-mode-line nil
"Make the active/inactive mode line stand out more."
:type 'boolean
:group 'solarized)
(defcustom solarized-height-minus-1 0.8
"Font size -1."
:type 'number
:group 'solarized)
(defcustom solarized-height-plus-1 1.1
"Font size +1."
:type 'number
:group 'solarized)
(defcustom solarized-height-plus-2 1.15
"Font size +2."
:type 'number
:group 'solarized)
(defcustom solarized-height-plus-3 1.2
"Font size +3."
:type 'number
:group 'solarized)
(defcustom solarized-height-plus-4 1.3
"Font size +4."
:type 'number
:group 'solarized)
(defcustom solarized-scale-org-headlines t
"Whether `org-mode' headlines should be scaled."
:type 'boolean
:group 'solarized)
(defcustom solarized-scale-outline-headlines t
"Whether `outline-mode' headlines should be scaled."
:type 'boolean
:group 'solarized)
;;; Utilities
(defun solarized-color-clamp-lab (lab)
"Restricts a LAB colorspace color if it is out of bounds."
(list (min (max (nth 0 lab) 0.0) 100.0)
(min (max (nth 1 lab) -128) 127)
(min (max (nth 2 lab) -128) 127)))
;;;###autoload
(defun solarized-color-blend (color1 color2 alpha &optional digits-per-component)
"Blends COLOR1 onto COLOR2 with ALPHA.
COLOR1 and COLOR2 should be color names (e.g. \"white\") or RGB
triplet strings (e.g. \"#ff12ec\").
Alpha should be a float between 0 and 1.
Optional argument DIGITS-PER-COMPONENT can be either 4 (the default) or 2;
use the latter if you need a 24-bit specification of a color."
(let ((args (mapcar 'color-clamp
(apply 'color-lab-to-srgb
(solarized-color-clamp-lab
(cl-mapcar
(lambda (v1 v2) (+ v1 (* alpha (- v2 v1))))
(apply 'color-srgb-to-lab (color-name-to-rgb color2))
(apply 'color-srgb-to-lab (color-name-to-rgb color1))))))))
(if (version< emacs-version "26")
(apply 'color-rgb-to-hex `(,@args))
(apply 'color-rgb-to-hex `(,@args ,digits-per-component)))))
;;;###autoload
(defun solarized-create-color-palette (core-palette)
"Create color-palette from CORE-PALETTE.
The Returned color-palette has the same format as `solarized-color-palette'"
(let ((darkest-base (nth 0 core-palette))
(brightest-base (nth 1 core-palette))
(yellow (nth 2 core-palette))
(orange (nth 3 core-palette))
(red (nth 4 core-palette))
(magenta (nth 5 core-palette))
(violet (nth 6 core-palette))
(blue (nth 7 core-palette))
(cyan (nth 8 core-palette))
(green (nth 9 core-palette)))
`((base03 . ,(solarized-color-blend darkest-base brightest-base 1.00 2))
(base02 . ,(solarized-color-blend darkest-base brightest-base 0.97 2))
(base01 . ,(solarized-color-blend darkest-base brightest-base 0.65 2))
(base00 . ,(solarized-color-blend darkest-base brightest-base 0.60 2))
(base0 . ,(solarized-color-blend darkest-base brightest-base 0.48 2))
(base1 . ,(solarized-color-blend darkest-base brightest-base 0.42 2))
(base2 . ,(solarized-color-blend darkest-base brightest-base 0.06 2))
(base3 . ,(solarized-color-blend darkest-base brightest-base 0.00 2))
;; Solarized accented colors
(yellow . ,yellow)
(orange . ,orange)
(red . ,red)
(magenta . ,magenta)
(violet . ,violet)
(blue . ,blue)
(cyan . ,cyan)
(green . ,green)
;; Darker and lighter accented colors
;; Only use these in exceptional circumstances!
(yellow-d . ,(solarized-color-blend darkest-base yellow 0.80 2))
(yellow-l . ,(solarized-color-blend brightest-base yellow 0.80 2))
(orange-d . ,(solarized-color-blend darkest-base orange 0.80 2))
(orange-l . ,(solarized-color-blend brightest-base orange 0.80 2))
(red-d . ,(solarized-color-blend darkest-base red 0.80 2))
(red-l . ,(solarized-color-blend brightest-base red 0.80 2))
(magenta-d . ,(solarized-color-blend darkest-base magenta 0.80 2))
(magenta-l . ,(solarized-color-blend brightest-base magenta 0.80 2))
(violet-d . ,(solarized-color-blend darkest-base violet 0.80 2))
(violet-l . ,(solarized-color-blend brightest-base violet 0.80 2))
(blue-d . ,(solarized-color-blend darkest-base blue 0.80 2))
(blue-l . ,(solarized-color-blend brightest-base blue 0.80 2))
(cyan-d . ,(solarized-color-blend darkest-base cyan 0.80 2))
(cyan-l . ,(solarized-color-blend brightest-base cyan 0.80 2))
(green-d . ,(solarized-color-blend darkest-base green 0.80 2))
(green-l . ,(solarized-color-blend brightest-base green 0.80 2))
(yellow-1bg . ,(solarized-color-blend darkest-base yellow 0.85 2))
(orange-1bg . ,(solarized-color-blend darkest-base orange 0.85 2))
(red-1bg . ,(solarized-color-blend darkest-base red 0.85 2))
(magenta-1bg . ,(solarized-color-blend darkest-base magenta 0.85 2))
(blue-1bg . ,(solarized-color-blend darkest-base blue 0.85 2))
(cyan-1bg . ,(solarized-color-blend darkest-base cyan 0.85 2))
(green-1bg . ,(solarized-color-blend darkest-base green 0.85 2))
(violet-1bg . ,(solarized-color-blend darkest-base violet 0.85 2))
(yellow-1fg . ,(solarized-color-blend brightest-base yellow 0.30 2))
(orange-1fg . ,(solarized-color-blend brightest-base orange 0.30 2))
(red-1fg . ,(solarized-color-blend brightest-base red 0.30 2))
(magenta-1fg . ,(solarized-color-blend brightest-base magenta 0.30 2))
(violet-1fg . ,(solarized-color-blend brightest-base violet 0.30 2))
(blue-1fg . ,(solarized-color-blend brightest-base blue 0.30 2))
(cyan-1fg . ,(solarized-color-blend brightest-base cyan 0.30 2))
(green-1fg . ,(solarized-color-blend brightest-base green 0.30 2))
(yellow-2bg . ,(solarized-color-blend darkest-base yellow 0.60 2))
(orange-2bg . ,(solarized-color-blend darkest-base orange 0.60 2))
(red-2bg . ,(solarized-color-blend darkest-base red 0.60 2))
(magenta-2bg . ,(solarized-color-blend darkest-base magenta 0.60 2))
(violet-2bg . ,(solarized-color-blend darkest-base violet 0.60 2))
(blue-2bg . ,(solarized-color-blend darkest-base blue 0.60 2))
(cyan-2bg . ,(solarized-color-blend darkest-base cyan 0.60 2))
(green-2bg . ,(solarized-color-blend darkest-base green 0.60 2))
(yellow-2fg . ,(solarized-color-blend brightest-base yellow 0.45 2))
(orange-2fg . ,(solarized-color-blend brightest-base orange 0.45 2))
(red-2fg . ,(solarized-color-blend brightest-base red 0.45 2))
(magenta-2fg . ,(solarized-color-blend brightest-base magenta 0.45 2))
(violet-2fg . ,(solarized-color-blend brightest-base violet 0.45 2))
(blue-2fg . ,(solarized-color-blend brightest-base blue 0.45 2))
(cyan-2fg . ,(solarized-color-blend brightest-base cyan 0.45 2))
(green-2fg . ,(solarized-color-blend brightest-base green 0.45 2)))))
;;; Setup Start
(defmacro solarized-with-color-variables (variant theme-name color-palette &optional childtheme-sexp)
"Eval `solarized-definition' in solarized COLOR-PALETTE for THEME-NAME.
VARIANT is 'dark or 'light.
When optional argument CHILDTHEME-SEXP sexp is supplied it's invoked to further
customize the resulting theme."
(declare (indent defun))
(let ((color-palette* (eval color-palette)))
`(let* ((class '((class color) (min-colors 89)))
(light-class (append '((background light)) class))
(dark-class (append '((background dark)) class))
(theme-name ,theme-name)
(variant ,variant)
,@(mapcar (lambda (elm) `(,(car elm) ,(cdr elm))) color-palette*)
(s-base03 base03)
(s-base02 base02)
(s-base01 base01)
(s-base00 base00)
(s-base3 base3)
(s-base2 base2)
(s-base1 base1)
(s-base0 base0)
;; Solarized palette names, use these instead of -fg -bg...
(base03 (if (eq variant 'light) s-base3 s-base03))
(base02 (if (eq variant 'light) s-base2 s-base02))
(base01 (if (eq variant 'light) s-base1 s-base01))
(base00 (if (eq variant 'light) s-base0 s-base00))
(base0 (if (eq variant 'light) s-base00 s-base0))
(base1 (if (eq variant 'light) s-base01 s-base1))
(base2 (if (eq variant 'light) s-base02 s-base2))
(base3 (if (eq variant 'light) s-base03 s-base3))
;; Line drawing color
;;
;; NOTE only use this for very thin lines that are hard to see using base02, in low
;; color displayes base02 might be used instead
(s-line (if (eq variant 'light) "#cccec4" "#284b54"))
;; Light/Dark adaptive higher/lower contrast accented colors
;;
;; NOTE Only use these in exceptional cirmumstances!
(yellow-hc (if (eq variant 'light) yellow-d yellow-l))
(yellow-lc (if (eq variant 'light) yellow-l yellow-d))
(orange-hc (if (eq variant 'light) orange-d orange-l))
(orange-lc (if (eq variant 'light) orange-l orange-d))
(red-hc (if (eq variant 'light) red-d red-l))
(red-lc (if (eq variant 'light) red-l red-d))
(magenta-hc (if (eq variant 'light) magenta-d magenta-l))
(magenta-lc (if (eq variant 'light) magenta-l magenta-d))
(violet-hc (if (eq variant 'light) violet-d violet-l))
(violet-lc (if (eq variant 'light) violet-l violet-d))
(blue-hc (if (eq variant 'light) blue-d blue-l))
(blue-lc (if (eq variant 'light) blue-l blue-d))
(cyan-hc (if (eq variant 'light) cyan-d cyan-l))
(cyan-lc (if (eq variant 'light) cyan-l cyan-d))
(green-hc (if (eq variant 'light) green-d green-l))
(green-lc (if (eq variant 'light) green-l green-d))
;; customize based face properties
(s-maybe-bold (if solarized-use-less-bold
'unspecified 'bold))
(s-maybe-italic (if solarized-use-more-italic
'italic 'normal))
(s-variable-pitch (if solarized-use-variable-pitch
'variable-pitch 'default))
(s-fringe-bg (if solarized-distinct-fringe-background
base02 base03))
(s-fringe-fg base01)
(s-header-line-fg (if solarized-high-contrast-mode-line
base1 base0))
(s-header-line-bg (if solarized-high-contrast-mode-line
base02 base03))
(s-header-line-underline (if solarized-high-contrast-mode-line
nil base02))
(s-mode-line-fg (if solarized-high-contrast-mode-line
base03 base0))
(s-mode-line-bg (if solarized-high-contrast-mode-line
base0 base02))
(s-mode-line-underline (if solarized-high-contrast-mode-line
nil s-line))
(s-mode-line-buffer-id-fg (if solarized-high-contrast-mode-line
'unspecified base1))
(s-mode-line-inactive-fg (if solarized-high-contrast-mode-line
base0 base01))
(s-mode-line-inactive-bg (if solarized-high-contrast-mode-line
base02 base03))
(s-mode-line-inactive-bc (if solarized-high-contrast-mode-line
base02 base02))
;; diff colors
(s-diff-A-bg red-1bg)
(s-diff-A-fg red-1fg)
(s-diff-fine-A-bg red-2bg)
(s-diff-fine-A-fg red-2fg)
(s-diff-B-bg green-1bg)
(s-diff-B-fg green-1fg)
(s-diff-fine-B-bg green-2bg)
(s-diff-fine-B-fg green-2fg)
(s-diff-Ancestor-bg yellow-1bg)
(s-diff-Ancestor-fg yellow-1fg)
(s-diff-fine-Ancestor-bg yellow-2bg)
(s-diff-fine-Ancestor-fg yellow-2fg)
(s-diff-C-bg blue-1bg)
(s-diff-C-fg blue-1fg)
(s-diff-fine-C-bg blue-2bg)
(s-diff-fine-C-fg blue-2fg)
(s-diff-context-fg base0)
(s-diff-heading-bg base02)
(s-diffstat-added-fg green)
(s-diffstat-changed-fg blue)
(s-diffstat-removed-fg red))
;; NOTE: `custom--inhibit-theme-enable' turn-off needed
;; childtheme works well disscussed in #352
(let ((custom--inhibit-theme-enable nil))
,@solarized-definition
,@(eval childtheme-sexp)))))
(defmacro solarized-with-color-variables-with-palette (variant theme-name core-palette &optional childtheme-sexp)
"Create a VARIANT of the theme named THEME-NAME with CORE-PALETTE.
When optional argument CHILDTHEME-SEXP sexp is supplied it's invoked to further
customize the resulting theme.
CORE-PALETTE is core color-palette."
(declare (indent 2))
(let ((color-palette (solarized-create-color-palette (eval core-palette))))
`(solarized-with-color-variables ,variant ,theme-name ',color-palette ,childtheme-sexp)))
(defun solarized-create-theme-file (variant theme-name color-palette &optional childtheme-sexp overwrite)
"Create a VARIANT of the theme named THEME-NAME with COLOR-PALETTE.
When optional argument CHILDTHEME-SEXP sexp is supplied it's invoked to further
customize the resulting theme.
CORE-PALETTE is core color-palette.
If OVERWRITE is non-nil, overwrite theme file if exist."
(declare (indent 2))
(add-to-list 'custom-theme-load-path solarized-theme-dir)
(let ((path (expand-file-name (format "%s.el" theme-name)
solarized-theme-dir)))
(unless (file-directory-p solarized-theme-dir)
(make-directory solarized-theme-dir))
(when (or overwrite (not (file-readable-p path)))
(with-temp-file (expand-file-name (format "%s-theme.el" theme-name)
solarized-theme-dir)
(mapc (lambda (elm)
(insert (pp-to-string elm)))
`((require 'solarized)
(deftheme ,theme-name
,(format "The %s colour theme of Solarized colour theme flavor." theme-name))
(solarized-with-color-variables ',variant ',theme-name ',color-palette ',childtheme-sexp)
(provide-theme ',theme-name)
(provide ',(intern (format "%s-theme" theme-name)))))))
path))
(defun solarized-create-theme-file-with-palette (variant theme-name core-palette &optional childtheme-sexp overwrite)
"Create a VARIANT of the theme named THEME-NAME with CORE-PALETTE.
When optional argument CHILDTHEME-SEXP sexp is supplied it's invoked to further
customize the resulting theme.
CORE-PALETTE is core color-palette.
If OVERWRITE is non-nil, overwrite theme file if exist."
(declare (indent 2))
(let ((color-palette (solarized-create-color-palette core-palette)))
(apply #'solarized-create-theme-file (list variant theme-name color-palette childtheme-sexp overwrite))))
(define-obsolete-function-alias 'create-solarized-theme-file 'solarized-create-theme-file)
;;; Footer
;;;###autoload
(when (and (boundp 'custom-theme-load-path) load-file-name)
(add-to-list 'custom-theme-load-path
(file-name-as-directory (file-name-directory load-file-name))))
(provide 'solarized)
;; Local Variables:
;; indent-tabs-mode: nil
;; End:
;;; solarized.el ends here