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