e1ad035513
Make rainbow-identifiers not colorize special operators and macros, so they always visually stand out. Rationale behind this change is that special operators and macros in Lisp may be considered "syntax" elements, so it makes sense to have them visually distinguished at all times.
160 lines
6.3 KiB
EmacsLisp
160 lines
6.3 KiB
EmacsLisp
;;; funcs.el --- Colors Layer functions File
|
||
;;
|
||
;; Copyright (c) 2012-2018 Sylvain Benner & Contributors
|
||
;;
|
||
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
|
||
;; URL: https://github.com/syl20bnr/spacemacs
|
||
;;
|
||
;; This file is not part of GNU Emacs.
|
||
;;
|
||
;;; License: GPLv3
|
||
|
||
|
||
;; rainbow-identifiers
|
||
|
||
(defun colors//rainbow-identifiers-mode-maybe ()
|
||
"Enable rainbow identifiers if the major mode is a prog mode."
|
||
(when (derived-mode-p 'prog-mode)
|
||
(rainbow-identifiers-mode)))
|
||
|
||
(defun colors//rainbow-identifiers-ignore-keywords ()
|
||
"Do not colorize stuff with ‘font-lock-keyword-face’."
|
||
(setq-local rainbow-identifiers-faces-to-override
|
||
(delq 'font-lock-keyword-face
|
||
rainbow-identifiers-faces-to-override)))
|
||
|
||
(defun colors//tweak-theme-colors (theme)
|
||
"Tweak color themes by adjusting rainbow-identifiers."
|
||
(interactive)
|
||
;; tweak the saturation and lightness of identifier colors
|
||
(when (not (assq theme (get 'rainbow-identifiers-cie-l*a*b*-saturation
|
||
'theme-value)))
|
||
(let ((sat&light (assq theme colors-theme-identifiers-sat&light)))
|
||
(if sat&light
|
||
(setq rainbow-identifiers-cie-l*a*b*-saturation (cadr sat&light)
|
||
rainbow-identifiers-cie-l*a*b*-lightness (caddr sat&light))
|
||
;; fall back to our defaults if there are no per-theme settings
|
||
(setq rainbow-identifiers-cie-l*a*b*-saturation colors-default-rainbow-identifiers-sat
|
||
rainbow-identifiers-cie-l*a*b*-lightness colors-default-rainbow-identifiers-light))))
|
||
;; it isn't enough to just update the variables! we must now refresh the "font
|
||
;; locking" (syntax highlighting) in all buffers that have rainbow-identifiers-mode
|
||
;; currently active, so that they instantly re-paint with their per-theme values.
|
||
;; this loops through all buffers and marks matching ones for re-painting,
|
||
;; starting with the current buffer first so that the user sees quick results!
|
||
(when (featurep 'rainbow-identifiers)
|
||
(dolist ($buf (buffer-list (current-buffer)))
|
||
(with-current-buffer $buf
|
||
(when (and rainbow-identifiers-mode font-lock-mode)
|
||
(if (fboundp 'font-lock-flush)
|
||
(font-lock-flush) ; use flush if available
|
||
(with-no-warnings (font-lock-fontify-buffer))))))))
|
||
|
||
(defun colors//change-color-mini-mode-doc (component)
|
||
"Display a short documentation in the mini buffer."
|
||
(let ((var (intern (format
|
||
"rainbow-identifiers-cie-l*a*b*-%s" component))))
|
||
(spacemacs/echo "Change color %s mini-mode (value: %s)
|
||
+ to increase %s
|
||
- to decrease %s
|
||
= to reset
|
||
Press any other key to exit." component (eval var) component component)))
|
||
|
||
(defun colors/change-color-component-overlay-map (component)
|
||
"Set a temporary overlay map to easily change a color COMPONENT from
|
||
rainbow-identifier mode. The color COMPONENT can be 'saturation' or
|
||
'lightness'."
|
||
(set-temporary-overlay-map
|
||
(let ((map (make-sparse-keymap))
|
||
(up-func (intern (format "colors/change-color-%s-up" component)))
|
||
(down-func (intern (format "colors/change-color-%s-down" component)))
|
||
(reset-func (intern (format "colors/change-color-%s-reset" component))))
|
||
(define-key map (kbd "+") up-func)
|
||
(define-key map (kbd "-") down-func)
|
||
(define-key map (kbd "=") reset-func)
|
||
map) t)
|
||
(colors//change-color-mini-mode-doc component))
|
||
|
||
(defun colors/init-rainbow-mode ()
|
||
(use-package rainbow-mode
|
||
:commands rainbow-mode
|
||
:init (spacemacs/set-leader-keys "tCc" 'rainbow-mode)
|
||
:config (spacemacs|hide-lighter rainbow-mode)))
|
||
|
||
(defun colors/start-change-color-saturation ()
|
||
"Initiate the overlay map to change the saturation."
|
||
(interactive)
|
||
(colors/change-color-component-overlay-map "saturation"))
|
||
|
||
(defun colors/change-color-saturation-up ()
|
||
"Increase the saturation by 5 units."
|
||
(interactive)
|
||
(colors//change-color-component-func "saturation" 5))
|
||
|
||
(defun colors/change-color-saturation-down ()
|
||
"Decrease the saturation by 5 units."
|
||
(interactive)
|
||
(colors//change-color-component-func "saturation" -5))
|
||
|
||
(defun colors/change-color-saturation-reset ()
|
||
"Reset the saturation to default."
|
||
(interactive)
|
||
(colors//change-color-component-func "saturation" colors-default-rainbow-identifiers-sat t))
|
||
|
||
(defun colors/start-change-color-lightness ()
|
||
"Initiate the overlay map to change the lightness."
|
||
(interactive)
|
||
(colors/change-color-component-overlay-map "lightness"))
|
||
|
||
(defun colors/change-color-lightness-up ()
|
||
"Increase the lightness by 5 units."
|
||
(interactive)
|
||
(colors//change-color-component-func "lightness" 5))
|
||
|
||
(defun colors/change-color-lightness-down ()
|
||
"Decrease the lightness by 5 units."
|
||
(interactive)
|
||
(colors//change-color-component-func "lightness" -5))
|
||
|
||
(defun colors/change-color-lightness-reset ()
|
||
"Reset the lightness to default."
|
||
(interactive)
|
||
(colors//change-color-component-func "lightness" colors-default-rainbow-identifiers-light t))
|
||
|
||
(defun colors//change-color-component-func
|
||
(component inc &optional reset)
|
||
"Change the color component by adding INC value to it. If RESET is not
|
||
nil the color component is set to INC."
|
||
(let* ((var (intern (format
|
||
"rainbow-identifiers-cie-l*a*b*-%s" component)))
|
||
(new-value (+ (eval var) inc)))
|
||
(if reset
|
||
(set var inc)
|
||
(progn
|
||
(if (< new-value 0)
|
||
(setq new-value 0))
|
||
(set var new-value)))
|
||
(if (fboundp 'font-lock-flush)
|
||
(font-lock-flush) ; use flush if available
|
||
(with-no-warnings (font-lock-fontify-buffer)))
|
||
(colors/change-color-component-overlay-map component)))
|
||
|
||
(defun colors/add-theme-sat&light (theme-name sat-light)
|
||
"Easily add personal per-theme rainbow-identifiers
|
||
saturation & lightness settings. Your new values will
|
||
override any previous definitions for that theme.
|
||
|
||
Remember to always refresh the look of your theme after
|
||
you've added any new settings!
|
||
|
||
Example usage:
|
||
(colors/add-theme-sat&light 'leuven '(30 50))
|
||
(colors/add-theme-sat&light 'anothertheme '(90 20))
|
||
(colors/refresh-theme-look)"
|
||
(push (cons theme-name sat-light) colors-theme-identifiers-sat&light))
|
||
|
||
(defun colors/refresh-theme-look ()
|
||
"Refresh and re-apply the look of your current theme.
|
||
Always run this after adding new per-theme settings!"
|
||
(interactive)
|
||
(colors//tweak-theme-colors spacemacs--cur-theme))
|