Version 20230408 of package Js2-Mode has just been released in GNU ELPA. You can now find it in M-x list-packages RET.
Js2-Mode describes itself as: ================================ Improved JavaScript editing mode ================================ More at https://elpa.gnu.org/packages/js2-mode.html ## Summary: This JavaScript editing mode supports: - strict recognition of the Ecma-262 language standard - support for most Rhino and SpiderMonkey extensions from 1.5 and up - parsing support for ECMAScript for XML (E4X, ECMA-357) - accurate syntax highlighting using a recursive-descent parser - on-the-fly reporting of syntax errors and strict-mode warnings - undeclared-variable warnings using a configurable externs framework - "bouncing" line indentation to choose among alternate indentation points - smart line-wrapping within comments and strings - code folding: - show some or all function bodies as {...} - show some or all block comments as /*...*/ - context-sensitive menu bar and popup menus - code browsing using the `imenu' package - many customization options Installation: ## Recent NEWS: # History of user-visible changes ## 2023-04-08 * Support top-level await ([#593](https://github.com/mooz/js2-mode/issues/593)). * Fix for escaping inside template literal ([#592](https://github.com/mooz/js2-mode/issues/592)). ## 2022-07-10 * Fix for node position of `js2-new-node` ([#591](https://github.com/mooz/js2-mode/issues/591)). * Support the d (hasIndices) and s (dotAll) regexp flags ([#590](https://github.com/mooz/js2-mode/pull/590)). * Support for `_` separator in numbers (i.e., numeric separator) ([#584](https://github.com/mooz/js2-mode/pull/584)). ## 2021-12-29 * Imenu support for mocha-like (includes Jasmine and Cypress) test files: i.e., `M-x imenu` will now list test blocks defined with `describe()` and `it()` ([#576](https://github.com/mooz/js2-mode/pull/576)). * Minor improvements in `js2-jump-to-definition` ([#423](https://github.com/mooz/js2-mode/issues/423)). * Support for private class members ([#537](https://github.com/mooz/js2-mode/issues/537)). * Support for dynamic imports and `import.meta` ([#547](https://github.com/mooz/js2-mode/issues/547)). * Support for trailing comma in arrow function parameters ([#480](https://github.com/mooz/js2-mode/issues/480)). * Support for `for await of` syntax ([#543](https://github.com/mooz/js2-mode/pull/543)). ## 2020-12-20 * Support for logical assignment operators ([#564](https://github.com/mooz/js2-mode/issues/564)). * Support for the nullish coalescing operator ([#561](https://github.com/mooz/js2-mode/pull/561)). * Emacs 27 now provides improved JSX indentation support, along with new JSX highlighting and detection support. Install Emacs 27 and use `js-mode` with `js2-minor-mode` (see README), rather than `js2-jsx-mode`. * Using `js2-jsx-mode` will now trigger a warning in Emacs 27. * Support for optional-chaining operator `?.` ## 2019-02-19 * Changed the default of `js2-strict-trailing-comma-warning` to nil. ## 2018-03-01 * Support single-line JSDocs. * New face `js2-object-property-access`. * Support for trailing comma in function arguments * JSDoc highlighting for `@yield`, `@yields`, `@abstract`, `@virtual` and `@typedef`. * Support for anonymous class exports. ## 2017-07-21 * Support for async arrow function without parentheses. * Support for `/*jslint` declarations. * User option `js2-getprop-has-side-effects`. * Support for trailing commas in function parameter lists. * Support for ES7 public class fields. * New user option `js2-ignored-warnings`. ## 2017-01-16 * `js2-include-*-externs` are now evaluated on demand. As a result, they can now be effectively used as file- or directory-local variables. * Support for ES7 exponentiation operator. ## 2016-06-23 * New variable `js2-mode-assume-strict`, for use with ES6 modules. * Support for JSDoc @callback, @func and @method tags. * Object properties are highlighted using a different face: `js2-object-property`, which has no color by default. * Experimental support for object rest/spread ECMAScript proposal. * `js2-getter-setter-node` is renamed to `js2-method-node`, together with its related functions. It already handles generator methods, and we added support for async methods (see below), so the old name would get more confusing. * Support for default parameters in destructuring. It should work for both objects and arrays, in both literals and function arguments. * New mode: `js2-jsx-mode`, deriving from `js2-mode`. Supports indentation of JSXElement expressions wrapped within parentheses or as function arguments. Indentation is customizable via `sgml-attribute-offset`. * Experimental support for async/await ECMAScript proposal. ## 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 ... ...