]> code.delx.au - gnu-emacs-elpa/blob - packages/js2-mode/NEWS.md
Merge commit '0cda39255827f283e7578cd469ae42daad9556a2' from js2-mode
[gnu-emacs-elpa] / packages / js2-mode / NEWS.md
1 # History of user-visible changes
2
3 ## 2016-06-23
4
5 * New variable `js2-mode-assume-strict`, for use with ES6 modules.
6 * Support for JSDoc @callback, @func and @method tags.
7 * Object properties are highlighted using a different face:
8 `js2-object-property`, which has no color by default.
9 * Experimental support for object rest/spread ECMAScript proposal.
10 * `js2-getter-setter-node` is renamed to `js2-method-node`, together with
11 its related functions. It already handles generator methods, and we
12 added support for async methods (see below), so the old name would get
13 more confusing.
14 * Support for default parameters in destructuring. It should work for both
15 objects and arrays, in both literals and function arguments.
16 * New mode: `js2-jsx-mode`, deriving from `js2-mode`. Supports indentation of
17 JSXElement expressions wrapped within parentheses or as function arguments.
18 Indentation is customizable via `sgml-attribute-offset`.
19 * Experimental support for async/await ECMAScript proposal.
20
21 ## 20150909
22
23 * `js2-mode` now derives from `js-mode`. That means the former
24 function will run `js-mode-hook`, as well as `js2-mode-hook`. The
25 key bindings will default to `js-mode-map` where they're not set in
26 `js2-mode-map`. And in Emacs 25 or later (including the snapshot
27 builds), `js2-mode` uses the indentation code from `js-mode`. Where
28 feasible, the user options (and functions) now have aliases, but if
29 you're using Emacs 25 and you see an indentation-related setting
30 that stopped working, try looking for a corresponding one in the
31 `js` group: `M-x customize-group RET js RET`.
32
33 * New command: `js2-jump-to-definition`. It's bound to `M-.` by
34 default, via remapping `js-find-symbol`. To get back to the default
35 `M-.` binding (e.g. `find-tag`), put this in your init file:
36
37 (eval-after-load 'js (define-key js-mode-map (kbd "M-.") nil))
38
39 ## 20150713
40
41 * More comprehensive strict mode warnings and syntax errors.
42 * New minor mode: `js2-highlight-unused-variables-mode`.
43 * `js2-pretty-multiline-declarations` can take the value `dynamic` now.
44
45 ## 20150202
46
47 Support for:
48
49 * [ES6 modules](http://www.2ality.com/2014/09/es6-modules-final.html).
50 * [Short-hand object literals](http://ariya.ofilabs.com/2013/02/es6-and-object-literal-property-value-shorthand.html).
51 * [Method definitions](http://ariya.ofilabs.com/2013/03/es6-and-method-definitions.html).
52 * ['u' and 'y' RegExp flags](https://mathiasbynens.be/notes/es6-unicode-regex).
53 * [Computed property names](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-object-initializer).
54 * [Class statements and expressions](https://github.com/lukehoban/es6features#classes).
55 * [Template strings](http://tc39wiki.calculist.org/es6/template-strings/), including tagged ones.
56
57 The variable `js2-allow-keywords-as-property-names` has been
58 removed. Instead we check if `js2-language-version` is 180 or highter.
59
60 ## 20141115
61
62 Support for:
63
64 * Unicode characters in identifiers (improved).
65 * [Delegating yield](http://wiki.ecmascript.org/doku.php?id=harmony:generators#delegating_yield).
66 * [ES6 numeric literals](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-numeric-literals) (octal, binary).
67 * Harmony [array and generator comprehensions](http://wingolog.org/archives/2014/03/07/es6-generator-and-array-comprehensions-in-spidermonkey).
68
69 ## 20131106
70
71 Support for:
72
73 * [Arrow functions](http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax)
74 * [Generators](http://wiki.ecmascript.org/doku.php?id=harmony:generators)
75 * [Spread operator](http://wiki.ecmascript.org/doku.php?id=harmony:spread)
76
77 ## 20130510
78
79 ### Support for JSLint global declaration
80
81 See the docstring for `js2-include-jslint-globals`.
82
83 ## 20130216
84
85 ### We don't rebind `RET` anymore
86
87 Because well-behaving major modes aren't supposed to do that.
88
89 So pressing it won't continue a block comment, or turn a string into a concatenation.
90 Pressing `M-j`, however, will.
91
92 The options `js2-indent-on-enter-key` and `js2-enter-indents-newline` were also removed.
93
94 To bring back the previous behavior, put this in your init file:
95
96 ```js
97 (eval-after-load 'js2-mode
98 '(define-key js2-mode-map (kbd "RET") 'js2-line-break))
99 ```
100
101 ## 20120617
102
103 ### Support for [default](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/default_parameters) and [rest](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/rest_parameters) parameters
104
105 ## 20120614
106
107 ### Support for [for..of loops](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of)
108
109 ## Older changes
110
111 ### Popular indentation style
112
113 ```js
114 [foo, bar, baz].forEach(function (v) {
115 if (validate(v))
116 process(v);
117 });
118
119 [a, b, c].some(function (v) {
120 return validate(v);
121 });
122 ```
123
124 ### Pretty multiline variable declaration
125
126 In the original mode,
127
128 ```js
129 var foo = 10,
130 bar = 20,
131 baz = 30;
132 ```
133
134 In this mode when the value of `js2-pretty-multiline-declarations` is non-nil,
135
136 ```js
137 var foo = 10,
138 bar = 20,
139 baz = 30;
140 ```
141
142 ### Abbreviated destructuring assignments
143
144 ```js
145 let {a, b} = {a: 10, b: 20}; // Abbreviated (Not supported in the original mode)
146 let {a: a, b: b} = {a: 10, b: 20}; // Same as above (Supported in the original mode)
147
148 (function ({responseText}) { /* */ })(xhr); // As the argument of function
149
150 for (let [k, { name, age }] in Iterator(obj)) // nested
151 print(k, name, age);
152 ```
153
154 ### Expression closure in property value
155
156 ```js
157 let worker = {
158 get age() 20,
159 get sex() "male",
160 fire: function () _fire()
161 };
162 ```
163
164 ### Fix for odd indentation of "else if" with no braces
165
166 In the original mode,
167
168 ```js
169 if (foo)
170 return foo;
171 else if (bar)
172 return bar; // here
173 ```
174
175 In this mode,
176
177 ```js
178 if (foo)
179 return foo;
180 else if (bar)
181 return bar; // fixed
182 ```
183
184 ### Imenu support for function nesting
185
186 Supports function nesting and anonymous wrappers:
187
188 ```js
189 (function() {
190 var foo = function() {
191 function bar() { // shown as foo.bar.<definition-1>
192 function baz() {} // foo.bar.baz
193 var qux = function() {}; // foo.bar.quux
194 }
195 };
196 });
197 ```
198
199 Examples of output:
200
201 * [jQuery 1.5](https://gist.github.com/845449)
202 * [Underscore.js](https://gist.github.com/824262)
203 * [Backbone.js](https://gist.github.com/824260)
204
205 For library-specific extension methods like `$.extend` and `dojo.declare`, see [js2-imenu-extras](/mooz/js2-mode/blob/master/js2-imenu-extras.el).
206
207 ### Undeclared/external variables highlighting
208
209 Original mode highlights them only on the left side of assignments:
210
211 ```js
212 var house;
213 hose = new House(); // highlights "hose"
214 ```
215
216 Here they are highlighted in all expressions:
217
218 ```js
219 function feed(fishes, food) {
220 for each (var fish in fshes) { // highlights "fshes"
221 food.feed(fsh); // highlights "fsh"
222 }
223 hood.discard(); // highlights "hood"
224 }
225 ```
226
227 Destructuring assignments and array comprehensions (JS 1.7) are supported:
228
229 ```js
230 let three, [one, two] = [1, 2];
231 thee = one + two; // highlights "thee"
232
233 function revenue(goods) {
234 // highlights "coast"
235 return [price - coast for each ({price, cost} in goods)].reduce(add);
236 }
237 ```