mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-15 17:00:26 +00:00
New indentation option for js-mode
* lisp/progmodes/js.el (js--proper-indentation): Add new custom option `js-indent-first-initialiser' and a function to utilize it, `js--maybe-goto-declaration-keyword-end'. * test/indent/js.js: Add local variables. * test/indent/js-indent-first-initialiser-t.js: New test for `js-indent-first-initialiser'. * test/indent/js-indent-first-initialiser-dynamic.js: New test for `js-indent-first-initialiser'.
This commit is contained in:
parent
33d9869b5f
commit
933e0ab4b0
@ -1,3 +1,17 @@
|
||||
2015-03-10 Jackson Ray Hamilton <jackson@jacksonrayhamilton.com>
|
||||
|
||||
* lisp/progmodes/js.el (js--proper-indentation): Add new custom
|
||||
option `js-indent-first-initialiser' and a function to utilize it,
|
||||
`js--maybe-goto-declaration-keyword-end'.
|
||||
|
||||
* test/indent/js.js: Add local variables.
|
||||
|
||||
* test/indent/js-indent-first-initialiser-t.js: New test for
|
||||
`js-indent-first-initialiser'.
|
||||
|
||||
* test/indent/js-indent-first-initialiser-dynamic.js: New test for
|
||||
`js-indent-first-initialiser'.
|
||||
|
||||
2015-03-10 Thomas Fitzsimmons <fitzsim@fitzsim.org>
|
||||
|
||||
* net/ldap.el (ldap-attribute-syntaxes-alist): Add LDAP attributes
|
||||
|
@ -509,6 +509,50 @@ getting timeout messages."
|
||||
:type 'integer
|
||||
:group 'js)
|
||||
|
||||
(defcustom js-indent-first-initialiser nil
|
||||
"Specially indent the first variable declaration's initialiser
|
||||
in variable statements.
|
||||
|
||||
Normally, the first declaration's initialiser is unindented, and
|
||||
subsequent declarations have their identifiers lined up against
|
||||
the first:
|
||||
|
||||
var o = {
|
||||
foo: 3
|
||||
};
|
||||
|
||||
var o = {
|
||||
foo: 3
|
||||
},
|
||||
bar = 2;
|
||||
|
||||
When t, always indent the first declaration's initialiser by an
|
||||
additional level:
|
||||
|
||||
var o = {
|
||||
foo: 3
|
||||
};
|
||||
|
||||
var o = {
|
||||
foo: 3
|
||||
},
|
||||
bar = 2;
|
||||
|
||||
When `dynamic', if there is only one declaration, don't indent
|
||||
the first one's initialiser; otherwise, indent it.
|
||||
|
||||
var o = {
|
||||
foo: 3
|
||||
};
|
||||
|
||||
var o = {
|
||||
foo: 3
|
||||
},
|
||||
bar = 2;"
|
||||
:type 'boolean
|
||||
:safe 'symbolp
|
||||
:group 'js)
|
||||
|
||||
;;; KeyMap
|
||||
|
||||
(defvar js-mode-map
|
||||
@ -1858,6 +1902,36 @@ In particular, return the buffer position of the first `for' kwd."
|
||||
(goto-char for-kwd)
|
||||
(current-column))))
|
||||
|
||||
(defun js--maybe-goto-declaration-keyword-end (parse-status)
|
||||
"Helper function for `js--proper-indentation'.
|
||||
Depending on the value of `js-indent-first-initialiser', move
|
||||
point to the end of a variable declaration keyword so that
|
||||
indentation is aligned to that column."
|
||||
(cond
|
||||
((eq js-indent-first-initialiser t)
|
||||
(when (looking-at js--declaration-keyword-re)
|
||||
(goto-char (1+ (match-end 0)))))
|
||||
((eq js-indent-first-initialiser 'dynamic)
|
||||
(let ((bracket (nth 1 parse-status))
|
||||
declaration-keyword-end
|
||||
at-closing-bracket-p
|
||||
comma-p)
|
||||
(when (looking-at js--declaration-keyword-re)
|
||||
(setq declaration-keyword-end (match-end 0))
|
||||
(save-excursion
|
||||
(goto-char bracket)
|
||||
(setq at-closing-bracket-p
|
||||
(condition-case nil
|
||||
(progn
|
||||
(forward-sexp)
|
||||
t)
|
||||
(error nil)))
|
||||
(when at-closing-bracket-p
|
||||
(while (forward-comment 1))
|
||||
(setq comma-p (looking-at-p ","))))
|
||||
(when comma-p
|
||||
(goto-char (1+ declaration-keyword-end))))))))
|
||||
|
||||
(defun js--proper-indentation (parse-status)
|
||||
"Return the proper indentation for the current line."
|
||||
(save-excursion
|
||||
@ -1891,6 +1965,7 @@ In particular, return the buffer position of the first `for' kwd."
|
||||
(skip-syntax-backward " ")
|
||||
(when (eq (char-before) ?\)) (backward-list))
|
||||
(back-to-indentation)
|
||||
(js--maybe-goto-declaration-keyword-end parse-status)
|
||||
(let* ((in-switch-p (unless same-indent-p
|
||||
(looking-at "\\_<switch\\_>")))
|
||||
(same-indent-p (or same-indent-p
|
||||
|
30
test/indent/js-indent-first-initialiser-dynamic.js
Normal file
30
test/indent/js-indent-first-initialiser-dynamic.js
Normal file
@ -0,0 +1,30 @@
|
||||
var foo = function() {
|
||||
return 7;
|
||||
};
|
||||
|
||||
var foo = function() {
|
||||
return 7;
|
||||
},
|
||||
bar = 8;
|
||||
|
||||
var foo = function() {
|
||||
return 7;
|
||||
},
|
||||
bar = function() {
|
||||
return 8;
|
||||
};
|
||||
|
||||
// Local Variables:
|
||||
// indent-tabs-mode: nil
|
||||
// js-indent-level: 2
|
||||
// js-indent-first-initialiser: dynamic
|
||||
// End:
|
||||
|
||||
// The following test intentionally produces a scan error and should
|
||||
// be placed below all other tests to prevent awkward indentation.
|
||||
// (It still thinks it's within the body of a function.)
|
||||
|
||||
var foo = function() {
|
||||
return 7;
|
||||
,
|
||||
bar = 8;
|
21
test/indent/js-indent-first-initialiser-t.js
Normal file
21
test/indent/js-indent-first-initialiser-t.js
Normal file
@ -0,0 +1,21 @@
|
||||
var foo = function() {
|
||||
return 7;
|
||||
};
|
||||
|
||||
var foo = function() {
|
||||
return 7;
|
||||
},
|
||||
bar = 8;
|
||||
|
||||
var foo = function() {
|
||||
return 7;
|
||||
},
|
||||
bar = function() {
|
||||
return 8;
|
||||
};
|
||||
|
||||
// Local Variables:
|
||||
// indent-tabs-mode: nil
|
||||
// js-indent-level: 2
|
||||
// js-indent-first-initialiser: t
|
||||
// End:
|
@ -1,5 +1,3 @@
|
||||
// -*- js-indent-level: 2 -*-
|
||||
|
||||
var a = 1;
|
||||
b = 2;
|
||||
|
||||
@ -65,3 +63,8 @@ b +=
|
||||
|
||||
baz(`http://foo.bar/${tee}`)
|
||||
.qux();
|
||||
|
||||
// Local Variables:
|
||||
// indent-tabs-mode: nil
|
||||
// js-indent-level: 2
|
||||
// End:
|
||||
|
Loading…
Reference in New Issue
Block a user