给colorful-mode添加颜色选择器

a

这是代码

(use-package color-picker
  :vc (:url "https://github.com/zHaOdANiuu/color-picker.el" :rev :newest)
  :commands color-picker
  :custom (color-picker-scale 2.0))

(use-package colorful-mode
  :hook (prog-mode . colorful-mode)
  :custom
  (colorful-use-prefix t)
  (colorful-only-strings 'only-prog)
  (css-fontify-colors nil)
  :config
  (add-to-list 'global-colorful-modes 'helpful-mode)

  (when (display-graphic-p)
    (require 'svg)

    (defvar-keymap my-colorful--color-picker-map
      "<mouse-1>"
      (lambda (event)
        (interactive "e")
        (when-let* ((ov (colorful--find-overlay))
                    (beg (overlay-start ov))
                    (end (overlay-end ov))
                    (buf (window-buffer (posn-window (event-start event)))))
          (let* ((pos (event-start event))
                 (xy (posn-x-y pos)))
            (color-picker
             :style 'simple :display 'frame
             :x (car xy) :y (cdr xy)
             :ok (lambda (picked)
                   (with-current-buffer buf
                     (delete-region beg end)
                     (insert picked))))))))

    (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 "1.5")
        (svg-image svg :ascent 'center)))

    (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)))))
5 个赞