GNU ELPA - js2-mode


Improved JavaScript editing mode
js2-mode-20231224.tar (.sig), 2024-Mar-31, 620 KiB
Steve Yegge <>, mooz <>, Dmitry Gutov <>
Atom feed
Browse ELPA's repository
CGit or Gitweb

To install this package from Emacs, use package-install or list-packages.

Full description

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


To install it as your major mode for JavaScript editing:

  (add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))

Alternatively, to install it as a minor mode just for JavaScript linting,
you must add it to the appropriate major-mode hook.  Normally this would be:

  (add-hook 'js-mode-hook 'js2-minor-mode)

You may also want to hook it in for shell scripts running via node.js:

  (add-to-list 'interpreter-mode-alist '("node" . js2-mode))

Use Emacs 27 and want to write JSX?  Then use `js2-minor-mode' as described
above.  Use Emacs 26 or earlier?  Then use `js2-jsx-mode':

  (add-to-list 'auto-mode-alist '("\\.jsx?\\'" . js2-jsx-mode))
  (add-to-list 'interpreter-mode-alist '("node" . js2-jsx-mode))

Note that linting of JSX code may fail in both modes.

To customize how it works:
  M-x customize-group RET js2-mode RET


This mode includes a port of Mozilla Rhino's scanner, parser and
symbol table.  Ideally it should stay in sync with Rhino, keeping
`js2-mode' current as the EcmaScript language standard evolves.

Unlike cc-engine based language modes, js2-mode's line-indentation is not
customizable.  It is a surprising amount of work to support customizable
indentation.  The current compromise is that the tab key lets you cycle among
various likely indentation points, similar to the behavior of python-mode.

This mode does not yet work with "multi-mode" modes such as `mmm-mode'
and `mumamo', although it could be made to do so with some effort.
This means that `js2-mode' is currently only useful for editing JavaScript
files, and not for editing JavaScript within <script> tags or templates.

The project page on GitHub is used for development and issue tracking.
The original homepage at Google Code has outdated information and is mostly

Old versions

js2-mode-20230408.tar.lz2023-Apr-08 121 KiB
js2-mode-20220710.tar.lz2022-Jul-10 121 KiB
js2-mode-20211229.tar.lz2021-Dec-29 120 KiB
js2-mode-20201220.tar.lz2020-Dec-20 119 KiB
js2-mode-20190219.tar.lz2019-Feb-19 130 KiB
js2-mode-20180301.tar.lz2018-Mar-01 130 KiB
js2-mode-20170721.tar.lz2017-Jul-21 128 KiB
js2-mode-20170116.tar.lz2017-Jan-16 117 KiB
js2-mode-20160623.tar.lz2016-Jun-23 116 KiB
js2-mode-20150909.tar.lz2015-Sep-10 111 KiB
js2-mode-20150713.tar.lz2015-Jul-13 110 KiB
js2-mode-20150202.tar.lz2015-Feb-04 107 KiB
js2-mode-20141118.tar.lz2014-Nov-1999.8 KiB
js2-mode-20141115.tar.lz2014-Nov-1699.8 KiB
js2-mode-20140114.tar.lz2014-Jan-1688.5 KiB
js2-mode-20131106.tar.lz2013-Nov-0890.9 KiB
js2-mode-20130619.tar.lz2013-Aug-1588.9 KiB
js2-mode-20130228.el.lz2013-Feb-2883.9 KiB
js2-mode-20090814.el.lz2012-Nov-2982.8 KiB
js2-mode-1.1.el.lz2012-Dec-2584.7 KiB


History of user-visible changes


  • Support for async generators in method notation (#598).
  • Support for static initialization blocks (#594).


  • Support top-level await (#593).
  • Fix for escaping inside template literal (#592).


  • Fix for node position of js2-new-node (#591).
  • Support the d (hasIndices) and s (dotAll) regexp flags (#590).
  • Support for _ separator in numbers (i.e., numeric separator) (#584).


  • 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).
  • Minor improvements in js2-jump-to-definition (#423).
  • Support for private class members (#537).
  • Support for dynamic imports and import.meta (#547).
  • Support for trailing comma in arrow function parameters (#480).
  • Support for for await of syntax (#543).


  • Support for logical assignment operators (#564).
  • Support for the nullish coalescing operator (#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 ?.


  • Changed the default of js2-strict-trailing-comma-warning to nil.


  • 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.


  • 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.


  • 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.


  • 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.


  • js2-mode now derives from js-mode. That means the former function will run js-mode-hook, as well as js2-mode-hook. The ... ...