1 # Context Coloring [![Build Status](https://travis-ci.org/jacksonrayhamilton/context-coloring.png?branch=master)](https://travis-ci.org/jacksonrayhamilton/context-coloring) [![Coverage Status](https://coveralls.io/repos/jacksonrayhamilton/context-coloring/badge.svg?branch=master)](https://coveralls.io/r/jacksonrayhamilton/context-coloring?branch=master)
4 <img alt="Screenshot of JavaScript code highlighted by context." src="screenshot.png" title="Screenshot">
7 Highlights code by scope. Top-level scopes are one color, second-level scopes
8 are another color, and so on. Variables retain the color of the scope in which
9 they are defined. A variable defined in an outer scope referenced by an inner
10 scope is colored the same as the outer scope.
12 By default, comments and strings are still highlighted syntactically.
16 - Supported languages: JavaScript
17 - Light and dark (customizable) color schemes.
18 - Very fast for files under 1000 lines.
24 JavaScript language support requires either [js2-mode][], or
25 [Node.js 0.10+][node] and the [scopifier][] executable.
29 - `M-x package-install RET context-coloring RET`
33 - Clone this repository.
37 git clone https://github.com/jacksonrayhamilton/context-coloring.git
40 - Byte-compile the package for improved speed.
47 - Add the following to your init file:
50 (add-to-list 'load-path "~/.emacs.d/context-coloring")
51 (require 'context-coloring)
54 ### scopifier (for non-js2-mode users)
57 npm install -g scopifier
62 Add the following to your init file:
65 ;; non-js2-mode users:
66 (add-hook 'js-mode-hook 'context-coloring-mode)
69 (add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
70 (add-hook 'js2-mode-hook 'context-coloring-mode)
77 - `context-coloring-syntactic-comments` (default: `t`): If non-nil, also color
78 comments using `font-lock`.
79 - `context-coloring-syntactic-strings` (default: `t`): If non-nil, also color
80 strings using `font-lock`.
81 - `context-coloring-delay` (default: `0.25`; supported modes: `js-mode`,
82 `js3-mode`): Delay between a buffer update and colorization.
83 - `context-coloring-js-block-scopes` (default: `nil`; supported modes:
84 `js2-mode`): If non-nil, also color block scopes in the scope hierarchy in
89 Color schemes for custom themes are automatically applied when those themes are
90 active. Built-in theme support is available for: `ample`, `anti-zenburn`,
91 `grandshell`, `leuven`, `monokai`, `solarized`, `spacegray`, `tango` and
94 You can define your own theme colors too:
97 (context-coloring-define-theme
112 See `C-h f context-coloring-define-theme` for more info on theme parameters.
116 To add support for a new language, write a "scopifier" for it, and define a new
117 coloring dispatch strategy with `context-coloring-define-dispatch`. Then the
118 plugin should handle the rest. (See `C-h f context-coloring-define-dispatch`
119 for more info on dispatch strategies.)
121 A "scopifier" is a CLI program that reads a buffer's contents from stdin and
122 writes a JSON array of numbers to stdout. Every three numbers in the array
123 represent a range of color. For instance, if I fed the following string of
124 JavaScript code to a scopifier
127 var a = function () {};
130 then the scopifier would produce the following array
136 where, for every three numbers, the first number is a 1-indexed start [point][],
137 the second number is an exclusive end point, and the third number is a scope
138 level. The result of applying level 0 coloring to the range [1, 24) and
139 then applying level 1 coloring to the range [9, 23) would result in the
143 <img alt="Screenshot of ranges [1, 24) and [9, 23)." src="scopifier.png" title="Screenshot">
146 If there is an abstract syntax tree generator for your language, you can walk
147 the syntax tree, find variables and scopes, and build their positions and levels
148 into an array like the one above.
150 For example, a Ruby scopifier might be defined and implemented like this:
153 (context-coloring-define-dispatch
157 :command "/home/username/scopifier")
166 print scopifier ARGF.read
169 When a `--version` argument is passed, a scopifier should print its version
170 number and exit. This allows context-coloring to determine if an update is
173 [js2-mode]: https://github.com/mooz/js2-mode
174 [node]: http://nodejs.org/download/
175 [scopifier]: https://github.com/jacksonrayhamilton/scopifier
176 [point]: http://www.gnu.org/software/emacs/manual/html_node/elisp/Point.html