6.0 KiB
History of user-visible changes
20150909
-
js2-mode
now derives fromjs-mode
. That means the former function will runjs-mode-hook
, as well asjs2-mode-hook
. The key bindings will default tojs-mode-map
where they're not set injs2-mode-map
. And in Emacs 25 or later (including the snapshot builds),js2-mode
uses the indentation code fromjs-mode
. Where feasible, the user options (and functions) now have aliases, but if you're using Emacs 25 and you see an indentation-related setting that stopped working, try looking for a corresponding one in thejs
group:M-x customize-group RET js RET
. -
New command:
js2-jump-to-definition
. It's bound toM-.
by default, via remappingjs-find-symbol
. To get back to the defaultM-.
binding (e.g.find-tag
), put this in your init file:(eval-after-load 'js (define-key js-mode-map (kbd "M-.") nil))
20150713
- More comprehensive strict mode warnings and syntax errors.
- New minor mode:
js2-highlight-unused-variables-mode
. js2-pretty-multiline-declarations
can take the valuedynamic
now.
20150202
Support for:
- ES6 modules.
- Short-hand object literals.
- Method definitions.
- 'u' and 'y' RegExp flags.
- Computed property names.
- Class statements and expressions.
- Template strings, including tagged ones.
The variable js2-allow-keywords-as-property-names
has been
removed. Instead we check if js2-language-version
is 180 or highter.
20141115
Support for:
- Unicode characters in identifiers (improved).
- Delegating yield.
- ES6 numeric literals (octal, binary).
- Harmony array and generator comprehensions.
20131106
Support for:
20130510
Support for JSLint global declaration
See the docstring for js2-include-jslint-globals
.
20130216
We don't rebind RET
anymore
Because well-behaving major modes aren't supposed to do that.
So pressing it won't continue a block comment, or turn a string into a concatenation.
Pressing M-j
, however, will.
The options js2-indent-on-enter-key
and js2-enter-indents-newline
were also removed.
To bring back the previous behavior, put this in your init file:
(eval-after-load 'js2-mode
'(define-key js2-mode-map (kbd "RET") 'js2-line-break))
20120617
Support for default and rest parameters
20120614
Support for for..of loops
Older changes
Popular indentation style
[foo, bar, baz].forEach(function (v) {
if (validate(v))
process(v);
});
[a, b, c].some(function (v) {
return validate(v);
});
Pretty multiline variable declaration
In the original mode,
var foo = 10,
bar = 20,
baz = 30;
In this mode when the value of js2-pretty-multiline-declarations
is non-nil,
var foo = 10,
bar = 20,
baz = 30;
Abbreviated destructuring assignments
let {a, b} = {a: 10, b: 20}; // Abbreviated (Not supported in the original mode)
let {a: a, b: b} = {a: 10, b: 20}; // Same as above (Supported in the original mode)
(function ({responseText}) { /* */ })(xhr); // As the argument of function
for (let [k, { name, age }] in Iterator(obj)) // nested
print(k, name, age);
Expression closure in property value
let worker = {
get age() 20,
get sex() "male",
fire: function () _fire()
};
Fix for odd indentation of "else if" with no braces
In the original mode,
if (foo)
return foo;
else if (bar)
return bar; // here
In this mode,
if (foo)
return foo;
else if (bar)
return bar; // fixed
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:
For library-specific extension methods like $.extend
and dojo.declare
, see js2-imenu-extras.
Undeclared/external variables highlighting
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);
}