my-emacs-d/elpa/js2-mode-20150909/NEWS.md

6.0 KiB

History of user-visible changes

20150909

  • js2-mode now derives from js-mode. That means the former function will run js-mode-hook, as well as js2-mode-hook. The key bindings will default to js-mode-map where they're not set in js2-mode-map. And in Emacs 25 or later (including the snapshot builds), js2-mode uses the indentation code from js-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 the js group: M-x customize-group RET js RET.

  • New command: js2-jump-to-definition. It's bound to M-. by default, via remapping js-find-symbol. To get back to the default M-. 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 value dynamic now.

20150202

Support for:

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:

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

[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);
}