├── .gitignore └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.elc 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | js2-mode 2 | ======== 3 | 4 | An improved JavaScript mode for GNU Emacs. Forked from . 5 | 6 | Install 7 | ======= 8 | 9 | $ git clone git://github.com/mooz/js2-mode.git 10 | $ cd js2-mode 11 | $ emacs --batch -f batch-byte-compile js2-mode.el 12 | 13 | _NOTE: Emacs may fail to byte compile js2-mode.el in interactive mode (e.g., `M-x byte-compile-file`). Following the above instruction is highly recommended. See https://github.com/mooz/js2-mode/issues/13 for details._ 14 | 15 | Then, place js2-mode.elc into your site-lisp directory. 16 | 17 | In you emacs config: 18 | 19 | (autoload 'js2-mode "js2-mode" nil t) 20 | (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)) 21 | 22 | See for details. 23 | 24 | Differences between original js2-mode.el 25 | ======================================== 26 | 27 | Popular indentation style 28 | ------------------------- 29 | 30 | When `js2-consistent-level-indent-inner-bracket-p` is non-nil 31 | 32 | [foo, bar, baz].forEach(function (v) { 33 | if (validate(v)) 34 | process(v); 35 | }); 36 | 37 | [a, b, c].some(function (v) { 38 | return validate(v); 39 | }); 40 | 41 | When `js2-consistent-level-indent-inner-bracket-p` is nil 42 | (Same as original js2-mode's indentation) 43 | 44 | [foo, bar, baz].forEach(function (v) { 45 | if (validate(v)) 46 | process(v); 47 | }); 48 | 49 | [a, b, c].some(function (v) { 50 | return validate(v); 51 | }); 52 | 53 | Pretty multi-line variable declaration 54 | -------------------------------------- 55 | 56 | In original js2-mode.el, 57 | 58 | var foo = 10, 59 | bar = 20, 60 | baz = 30; 61 | 62 | In this js2-mode.el, when the value `js2-pretty-multiline-decl-indentation-p` is non-nil, 63 | 64 | var foo = 10, 65 | bar = 20, 66 | baz = 30; 67 | 68 | Abbreviated destructuring assignments 69 | ------------------------------------- 70 | 71 | let {a, b} = {a: 10, b: 20}; // Abbreviated (Not supported in original js2-mode.el) 72 | let {a: a, b: b} = {a: 10, b: 20}; // Same as above (Supported in original js2-mode.el) 73 | 74 | (function ({responseText}) { /* */ })(xhr); // As the argument of function 75 | 76 | for (let [k, { name, age }] in Iterator(obj)) // nested 77 | print(k, name, age); 78 | 79 | Expression closure in property value 80 | ------------------------------------ 81 | 82 | let worker = { 83 | get age() 20, 84 | get sex() "male", 85 | fire: function () _fire() 86 | }; 87 | 88 | Fix for odd indentation of "else if" with no braces 89 | --------------------------------------------------- 90 | 91 | In original js2-mode.el, 92 | 93 | if (foo) 94 | return foo; 95 | else if (bar) 96 | return bar; // here 97 | 98 | In this js2-mode.el, 99 | 100 | if (foo) 101 | return foo; 102 | else if (bar) 103 | return bar; // fixed 104 | 105 | Fixes in Imenu support 106 | ---------------------- 107 | 108 | Supports element-get form: 109 | 110 | foo["bar"] = function() {}; 111 | foo[647] = function() {}; 112 | 113 | Proper position for functions in nested object literals: 114 | 115 | foo = { 116 | bar: function() {}, // ok in original 117 | baz: { 118 | boop: function() {} // fixed here 119 | } 120 | } 121 | 122 | Imenu support for function nesting 123 | ---------------------------------- 124 | 125 | Supports one level of nesting: 126 | 127 | function foo() { 128 | function bar() { // shown as foo.bar 129 | function baz() {} // hidden 130 | } 131 | } 132 | 133 | Top-level function can be anonymous wrapper: 134 | 135 | (function() { 136 | var foo = function() {}; // shown as foo 137 | })(); 138 | 139 | Examples of output: 140 | 141 | * [Underscore.js](https://github.com/documentcloud/underscore/blob/master/underscore.js) 142 | -> 143 | * [Backbone.js](https://github.com/documentcloud/backbone/blob/master/backbone.js) 144 | -> 145 | 146 | No support for library-specific extension methods like _.extend. 147 | 148 | Highlights undeclared/external variables 149 | ---------------------------------------- 150 | 151 | Original mode highlights them only on the left side of assignments: 152 | 153 | var house; 154 | hose = new House(); // highlights "hose" 155 | 156 | Here they are highlighted in all expressions: 157 | 158 | function feed(fishes, food) { 159 | for each (var fish in fshes) { // highlights "fshes" 160 | food.feed(fsh); // highlights "fsh" 161 | } 162 | hood.discard(); // highlights "hood" 163 | } 164 | 165 | Destructuring assignments and array comprehensions (JS 1.7) are supported: 166 | 167 | let three, [one, two] = [1, 2]; 168 | thee = one + two; // highlights "thee" 169 | 170 | function revenue(goods) { 171 | // highlights "coast" 172 | return [price - coast for each ({price, cost} in goods)].reduce(add); 173 | } 174 | 175 | Bugs 176 | ==== 177 | 178 | If you find problems, please report them to . 179 | --------------------------------------------------------------------------------