It is possible to teach Emacs to highlight HTML-style colour specifications a là #034fa3 in the colour they specify.
If you are using GNU Emacs from a recent (as of summer 2003) CVS (the one that will probably become Emacs 22.1) this is as simple as putting …
(defvar hexcolour-keywords
'(("#[abcdef[:digit:]]\\{6\\}"
(0 (put-text-property (match-beginning 0)
(match-end 0)
'face (list :background
(match-string-no-properties 0)))))))(defun hexcolour-add-to-font-lock () (font-lock-add-keywords nil hexcolour-keywords))
(add-hook <your favourite major mode hook> 'hexcolour-add-to-font-lock)
… into your .emacs.
You can use “#[[:xdigit:]]\\{6\\}” instead of “#[abcdef[:digit:]]\\{6\\}”, which will match ABCDEF digits too. RaffaeleRicciardi
Due to some quirks in the implementation of font-lock, this won’t work with Emacs 21.2 or 21.3. But you can use the package “hexcolour.el” (Lisp:hexcolour.el) to achieve this nevertheless. Read the commentary section for details.
I managed to get this working on Emacs 21.3, with some enhancements: contrasting colour for the text and support for 3 and 6 character hex codes. Very nice in css-mode.
(defvar hexcolour-keywords
'(("#[abcdef[:digit:]]\\{3,6\\}"
(0 (let ((colour (match-string-no-properties 0)))
(if (or (= (length colour) 4)
(= (length colour) 7))
(put-text-property
(match-beginning 0)
(match-end 0)
'face (list :background (match-string-no-properties 0)
:foreground (if (>= (apply '+ (x-color-values
(match-string-no-properties 0)))
(* (apply '+ (x-color-values "white")) .6))
"black" ;; light bg, dark text
"white" ;; dark bg, light text
)))))
append)))) (defun hexcolour-add-to-font-lock ()
(interactive)
(font-lock-add-keywords nil hexcolour-keywords t))– DaveS?
See also libraries Lisp:doremi-frm.el and Lisp:hexrgb.el, which let you manipulate hex colors and the Faces and Frame parameters that use them. – DrewAdams
Two more improvements, using luminance instead of average values, and fontifying color names (e.g. “blue” as well).
(require 'cl)
(defun hexcolour-luminance (color)
"Calculate the luminance of a color string (e.g. \"#ffaa00\", \"blue\").
This is 0.3 red + 0.59 green + 0.11 blue and always between 0 and 255."
(let* ((values (x-color-values color))
(r (car values))
(g (cadr values))
(b (caddr values)))
(floor (+ (* .3 r) (* .59 g) (* .11 b)) 256))) (defun hexcolour-add-to-font-lock ()
(interactive)
(font-lock-add-keywords nil
`((,(concat "#[0-9a-fA-F]\\{3\\}[0-9a-fA-F]\\{3\\}?\\|"
(regexp-opt (x-defined-colors) 'words))
(0 (let ((colour (match-string-no-properties 0)))
(put-text-property
(match-beginning 0) (match-end 0)
'face `((:foreground ,(if (> 128.0 (hexcolour-luminance colour))
"white" "black"))
(:background ,colour)))))))))– nschum
I like this. Just one change to the regexp for colour names:
(regexp-opt (x-defined-colors) 'words))
This keeps it from colouring parts of words like ‘redistribute’. Oh and for some reason I need to use the ‘append flag to font-lonk-add-keywords to get it working with Emacs 21.3. I really need to upgrade.
– DaveS?
Good idea, added ‘words for easier copy&paste. – nschum