ankurdave/color-identifiers-mode

Emacs minor mode to highlight each source code identifier uniquely based on its name

Emacs Lisp

328

206 commits

updated Dec 27, 2025

See the code

README

Color Identifiers Mode

MELPA

Color Identifiers is a minor mode for Emacs that highlights each source code identifier uniquely based on its name. It is inspired by a post by Evan Brooks.

Currently it supports Scala (scala-mode2), JavaScript (js-mode and js2-mode), Ruby, Python, Emacs Lisp, Clojure, C, C++, Rust, Java, and Go. You can add support for your favorite mode by modifying color-identifiers:modes-alist and optionally calling color-identifiers:set-declaration-scan-fn.

Check out the demo.

Screenshot of Color Identifiers Mode on Scala

It picks colors adaptively to fit the theme:

Different Themes

Use M-x color-identifiers:regenerate-colors after a theme change.

Installation

Color Identifiers is in MELPA. First set up MELPA:

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-refresh-contents)

Then install it:

(package-install 'color-identifiers-mode)

Finally, visit a supported file and type M-x color-identifiers-mode.

If you like it, enable it for all supported files by adding the following to your init file:

(add-hook 'after-init-hook 'global-color-identifiers-mode)

Configuration

  • Recoloring delay: the time before recoloring newly appeared identifiers is 2 seconds by default. To change it e.g. to 1 second add to your config (setq color-identifiers:recoloring-delay 1)

  • Additional face-properties (such as italic or bold) can be added to the identifiers by modifying color-identifiers:extra-face-attributes. E.g. to make identifiers look bold use (setq color-identifiers:extra-face-attributes '(:weight bold)). But make sure not to change :foreground because it is the color of identifiers.

  • To make the variables stand out, you can turn off highlighting for all other keywords in supported modes using a code like:

    (defun myfunc-color-identifiers-mode-hook ()
      (let ((faces '(font-lock-comment-face font-lock-comment-delimiter-face font-lock-constant-face font-lock-type-face font-lock-function-name-face font-lock-variable-name-face font-lock-keyword-face font-lock-string-face font-lock-builtin-face font-lock-preprocessor-face font-lock-warning-face font-lock-doc-face font-lock-negation-char-face font-lock-regexp-grouping-construct font-lock-regexp-grouping-backslash)))
        (dolist (face faces)
          (face-remap-add-relative face '(:inherit default))))
      (face-remap-add-relative 'font-lock-keyword-face '((:weight bold)))
      (face-remap-add-relative 'font-lock-comment-face '((:slant italic)))
      (face-remap-add-relative 'font-lock-builtin-face '((:weight bold)))
      (face-remap-add-relative 'font-lock-preprocessor-face '((:weight bold)))
      (face-remap-add-relative 'font-lock-function-name-face '((:slant italic)))
      (face-remap-add-relative 'font-lock-string-face '((:slant italic)))
      (face-remap-add-relative 'font-lock-constant-face '((:weight bold))))
    (add-hook 'color-identifiers-mode-hook 'myfunc-color-identifiers-mode-hook)
    

    Other Keywords Dimmed

Contributing

After having made changes to color-identifiers-mode.el you can test for regressions by running ninja tests. It checks lack of byte-compilation warnings and color-highlighting in various modes.

Improvements to the tests or the core mode are always welcome!

Contributors

ankurdave

93 commits

Hi-Angel

88 commits

paradoxxxzero

3 commits

ankurdave/color-identifiers-mode

Emacs minor mode to highlight each source code identifier uniquely based on its name

Emacs Lisp

328

206 commits

updated Dec 27, 2025

See the code

README

Color Identifiers Mode

MELPA

Color Identifiers is a minor mode for Emacs that highlights each source code identifier uniquely based on its name. It is inspired by a post by Evan Brooks.

Currently it supports Scala (scala-mode2), JavaScript (js-mode and js2-mode), Ruby, Python, Emacs Lisp, Clojure, C, C++, Rust, Java, and Go. You can add support for your favorite mode by modifying color-identifiers:modes-alist and optionally calling color-identifiers:set-declaration-scan-fn.

Check out the demo.

Screenshot of Color Identifiers Mode on Scala

It picks colors adaptively to fit the theme:

Different Themes

Use M-x color-identifiers:regenerate-colors after a theme change.

Installation

Color Identifiers is in MELPA. First set up MELPA:

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-refresh-contents)

Then install it:

(package-install 'color-identifiers-mode)

Finally, visit a supported file and type M-x color-identifiers-mode.

If you like it, enable it for all supported files by adding the following to your init file:

(add-hook 'after-init-hook 'global-color-identifiers-mode)

Configuration

  • Recoloring delay: the time before recoloring newly appeared identifiers is 2 seconds by default. To change it e.g. to 1 second add to your config (setq color-identifiers:recoloring-delay 1)

  • Additional face-properties (such as italic or bold) can be added to the identifiers by modifying color-identifiers:extra-face-attributes. E.g. to make identifiers look bold use (setq color-identifiers:extra-face-attributes '(:weight bold)). But make sure not to change :foreground because it is the color of identifiers.

  • To make the variables stand out, you can turn off highlighting for all other keywords in supported modes using a code like:

    (defun myfunc-color-identifiers-mode-hook ()
      (let ((faces '(font-lock-comment-face font-lock-comment-delimiter-face font-lock-constant-face font-lock-type-face font-lock-function-name-face font-lock-variable-name-face font-lock-keyword-face font-lock-string-face font-lock-builtin-face font-lock-preprocessor-face font-lock-warning-face font-lock-doc-face font-lock-negation-char-face font-lock-regexp-grouping-construct font-lock-regexp-grouping-backslash)))
        (dolist (face faces)
          (face-remap-add-relative face '(:inherit default))))
      (face-remap-add-relative 'font-lock-keyword-face '((:weight bold)))
      (face-remap-add-relative 'font-lock-comment-face '((:slant italic)))
      (face-remap-add-relative 'font-lock-builtin-face '((:weight bold)))
      (face-remap-add-relative 'font-lock-preprocessor-face '((:weight bold)))
      (face-remap-add-relative 'font-lock-function-name-face '((:slant italic)))
      (face-remap-add-relative 'font-lock-string-face '((:slant italic)))
      (face-remap-add-relative 'font-lock-constant-face '((:weight bold))))
    (add-hook 'color-identifiers-mode-hook 'myfunc-color-identifiers-mode-hook)
    

    Other Keywords Dimmed

Contributing

After having made changes to color-identifiers-mode.el you can test for regressions by running ninja tests. It checks lack of byte-compilation warnings and color-highlighting in various modes.

Improvements to the tests or the core mode are always welcome!

Contributors

ankurdave

93 commits

Hi-Angel

88 commits

paradoxxxzero

3 commits

Languages

Emacs Lisp

100.0%