emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 933e0ab: New indentation option for js-mode


From: Jackson Ray Hamilton
Subject: [Emacs-diffs] master 933e0ab: New indentation option for js-mode
Date: Tue, 10 Mar 2015 17:25:15 +0000

branch: master
commit 933e0ab4b0d583b81b8624def414b7895987927b
Author: Jackson Ray Hamilton <address@hidden>
Commit: Jackson Ray Hamilton <address@hidden>

    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'.
---
 lisp/ChangeLog                                     |   14 ++++
 lisp/progmodes/js.el                               |   75 ++++++++++++++++++++
 test/indent/js-indent-first-initialiser-dynamic.js |   30 ++++++++
 test/indent/js-indent-first-initialiser-t.js       |   21 ++++++
 test/indent/js.js                                  |    7 ++-
 5 files changed, 145 insertions(+), 2 deletions(-)

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index c25f4ef..c7cf53d 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,17 @@
+2015-03-10  Jackson Ray Hamilton  <address@hidden>
+
+       * 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  <address@hidden>
 
        * net/ldap.el (ldap-attribute-syntaxes-alist): Add LDAP attributes
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index d7712e4..27e67bb 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -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
diff --git a/test/indent/js-indent-first-initialiser-dynamic.js 
b/test/indent/js-indent-first-initialiser-dynamic.js
new file mode 100644
index 0000000..9c705db
--- /dev/null
+++ b/test/indent/js-indent-first-initialiser-dynamic.js
@@ -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;
diff --git a/test/indent/js-indent-first-initialiser-t.js 
b/test/indent/js-indent-first-initialiser-t.js
new file mode 100644
index 0000000..2f08527
--- /dev/null
+++ b/test/indent/js-indent-first-initialiser-t.js
@@ -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:
diff --git a/test/indent/js.js b/test/indent/js.js
index f41849d..ad7cb56 100644
--- a/test/indent/js.js
+++ b/test/indent/js.js
@@ -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:



reply via email to

[Prev in Thread] Current Thread [Next in Thread]