$ git clone git://github.com/mooz/js2-mode.git
$ cd js2-mode
- $ emacs --batch --eval '(byte-compile-file "js2-mode.el")'
+ $ emacs --batch -f batch-byte-compile js2-mode.el
+
+_NOTE: Emacs may fail to byte compile js2-mode.el in interactive mode (e.g., `M-x byte-compile-file`). Following the above instruction is highly recommended. See https://github.com/mooz/js2-mode/issues/13 for details._
Then, place js2-mode.elc into your site-lisp directory.
Differences between original js2-mode.el
========================================
-Support for abbreviated destructuring assignments
--------------------------------------------------
+Popular indentation style
+-------------------------
+
+When `js2-consistent-level-indent-inner-bracket-p` is non-nil
+
+ [foo, bar, baz].forEach(function (v) {
+ if (validate(v))
+ process(v);
+ });
+
+ [a, b, c].some(function (v) {
+ return validate(v);
+ });
+
+When `js2-consistent-level-indent-inner-bracket-p` is nil
+(Same as original js2-mode's indentation)
+
+ [foo, bar, baz].forEach(function (v) {
+ if (validate(v))
+ process(v);
+ });
+
+ [a, b, c].some(function (v) {
+ return validate(v);
+ });
+
+Pretty multi-line variable declaration
+--------------------------------------
+
+In original js2-mode.el,
+
+ var foo = 10,
+ bar = 20,
+ baz = 30;
+
+In this js2-mode.el, when the value `js2-pretty-multiline-decl-indentation-p` is non-nil,
+
+ var foo = 10,
+ bar = 20,
+ baz = 30;
+
+Abbreviated destructuring assignments
+-------------------------------------
let {a, b} = {a: 10, b: 20}; // Abbreviated (Not supported in original js2-mode.el)
let {a: a, b: b} = {a: 10, b: 20}; // Same as above (Supported in original js2-mode.el)
(function ({responseText}) { /* */ })(xhr); // As the argument of function
-Support for expression closure in property value
-------------------------------------------------
+ for (let [k, { name, age }] in Iterator(obj)) // nested
+ print(k, name, age);
+
+Expression closure in property value
+------------------------------------
let worker = {
get age() 20,
fire: function () _fire()
};
-Fixed the odd indentation of "else if" with no braces
------------------------------------------------------
+Fix for odd indentation of "else if" with no braces
+---------------------------------------------------
In original js2-mode.el,
else if (bar)
return bar; // fixed
+Fixes in Imenu support
+----------------------
+
+Supports element-get form:
+
+ foo["bar"] = function() {};
+ foo[647] = function() {};
+
+Proper position for functions in nested object literals:
+
+ foo = {
+ bar: function() {}, // ok in original
+ baz: {
+ boop: function() {} // fixed here
+ }
+ }
+
+Imenu support for function nesting
+----------------------------------
+
+Supports function nesting and anonymous wrappers:
+
+ (function() {
+ var foo = function() {
+ function bar() { // shown as foo.bar.<definition-1>
+ function baz() {} // foo.bar.baz
+ var qux = function() {}; // foo.bar.quux
+ }
+ };
+ });
+
+Examples of output:
+
+* [jQuery 1.5](https://gist.github.com/845449)
+* [Underscore.js](https://gist.github.com/824262)
+* [Backbone.js](https://gist.github.com/824260)
+
+No support for library-specific extension methods like $.extend.
+
+Highlights undeclared/external variables
+----------------------------------------
+
+Original mode highlights them only on the left side of assignments:
+
+ var house;
+ hose = new House(); // highlights "hose"
+
+Here they are highlighted in all expressions:
+
+ function feed(fishes, food) {
+ for each (var fish in fshes) { // highlights "fshes"
+ food.feed(fsh); // highlights "fsh"
+ }
+ hood.discard(); // highlights "hood"
+ }
+
+Destructuring assignments and array comprehensions (JS 1.7) are supported:
+
+ let three, [one, two] = [1, 2];
+ thee = one + two; // highlights "thee"
+
+ function revenue(goods) {
+ // highlights "coast"
+ return [price - coast for each ({price, cost} in goods)].reduce(add);
+ }
+
Bugs
====