commit 5bd8dd24cd6e9490bbe46bac898661484af15573
parent 775b896742a4abffc6a8e943e9d90623fd64b1ff
Author: andsy10 <andsy1016@gmail.com>
Date: Sat, 26 Sep 2026 22:12:25 +0800
Add color-picker and colorful-mode integration
Diffstat:
2 files changed, 88 insertions(+), 1 deletion(-)
diff --git a/lisp/init-kbd.el b/lisp/init-kbd.el
@@ -50,7 +50,9 @@
"t" #'consult-theme
"f" #'describe-face
"k" #'keycast-header-line-mode
- "w" #'global-whitespace-mode)
+ "w" #'global-whitespace-mode
+ "c" #'colorful-mode
+ "p" #'my-pick-color)
;; w for whitespace
(general-def
diff --git a/lisp/init-ui.el b/lisp/init-ui.el
@@ -26,6 +26,91 @@
(load-theme 'my-light t)
(load-theme 'my-dark t))))
+;; color picker
+;; from zHaOdANiuu's ElegantEmacs
+(use-package color-picker
+ :straight (:type git :host github :repo "zHaOdANiuu/color-picker.el")
+ :commands color-picker my-pick-color
+ :custom (color-picker-scale 2.0)
+ :config
+ (defun my-pick-color (arg)
+ "Pick and insert color."
+ (interactive "P")
+ (let ((target (current-buffer)))
+ (color-picker
+ :style (unless arg 'simple)
+ :ok (lambda (color)
+ (with-current-buffer target
+ (when (use-region-p)
+ (delete-region (region-beginning) (region-end)))
+ (insert color)))))))
+
+(use-package colorful-mode
+ :hook (prog-mode . colorful-mode)
+ :custom
+ (colorful-use-prefix t)
+ (colorful-only-strings 'only-prog)
+ :config
+ (add-to-list 'global-colorful-modes 'helpful-mode)
+
+ (when (display-graphic-p)
+ (require 'svg)
+
+ (defvar color-picker-initial-color)
+
+ (defun my-colorful--svg-img (color)
+ (let* ((sz (frame-char-width))
+ (svg (svg-create sz sz)))
+ (svg-node svg 'rect
+ :x 1 :y 1 :width (- sz 2) :height (- sz 2)
+ :fill color :stroke "#ffffff" :stroke-width "0.5")
+ (svg-image svg :ascent 'center)))
+
+ (defun my-colorful--ov-hex (ov)
+ "Return normalized hex color string of colorful overlay OV."
+ (when-let* ((c (overlay-get ov 'colorful--color)))
+ (pcase-let ((`(,r ,g ,b) (color-name-to-rgb c)))
+ (color-rgb-to-hex r g b 2))))
+
+ (defun my-colorful-color-picker (event)
+ "Pick color use color-picker."
+ (interactive "e")
+ (let* ((pos (event-start event))
+ (xy (posn-x-y pos))
+ (ov (colorful--find-overlay (posn-point pos))))
+ (when ov
+ (let ((color-picker-initial-color
+ (or (my-colorful--ov-hex ov) color-picker-initial-color)))
+ (color-picker
+ :style 'simple :display 'frame
+ :x (car xy) :y (cdr xy)
+ :ok (lambda (picked)
+ (with-current-buffer (overlay-buffer ov)
+ (delete-region (overlay-start ov) (overlay-end ov))
+ (insert picked))))))))
+
+ (defvar-keymap my-colorful--color-picker-map
+ "<mouse-1>"
+ #'my-colorful-color-picker)
+
+ (defun colorful--colorize-match (color beg end kind face map)
+ "Overlay match with a face from BEG to END.
+The background uses COLOR color value. The foreground is obtained
+from `readable-foreground-color'."
+ (let ((ov (make-overlay beg end)))
+ (overlay-put ov 'colorful--overlay t)
+ (overlay-put ov 'colorful--color-kind kind)
+ (overlay-put ov 'colorful--color color)
+ (overlay-put ov 'evaporate t)
+ (overlay-put ov
+ 'before-string
+ (propertize
+ " "
+ 'display (my-colorful--svg-img color)
+ 'keymap my-colorful--color-picker-map
+ 'pointer 'hand))
+ (overlay-put ov 'face nil)))))
+
;; line numbers
(use-package display-line-numbers
:straight nil