branch: elpa/nix-mode
commit 046afc4b4db92a9e32f8c48f9ec578c9ef621fe8
Author: Matthew Bauer <mjbaue...@gmail.com>
Commit: Matthew Bauer <mjbaue...@gmail.com>

    Rework indentation
---
 nix-mode.el | 97 ++++++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 64 insertions(+), 33 deletions(-)

diff --git a/nix-mode.el b/nix-mode.el
index 2825392da8..1fad76b92c 100644
--- a/nix-mode.el
+++ b/nix-mode.el
@@ -258,26 +258,26 @@
     (beginning-of-line)
 
     (let ((p1 (point))
-         (p2 (nth 1 (syntax-ppss)))
-         (n 0))
+          (p2 (nth 1 (syntax-ppss)))
+          (n 0))
 
       ;; prevent moving beyond buffer
       (if (eq p2 1)
-         (setq n (1+ n)))
+          (setq n (1+ n)))
 
       (while (and p2 (not (eq p2 1))) ;; make sure p2 > 1
-       (goto-char p2)
-       (backward-char)
-       (let ((l1 (line-number-at-pos p1))
-             (l2 (line-number-at-pos p2)))
-         (if (not (eq l1 l2))
-             (setq n (1+ n))))
-       (setq p1 p2)
-       (setq p2 (nth 1 (syntax-ppss)))
-
-       ;; make sure we don't go beyond buffer
-       (if (eq p2 1)
-           (setq n (1+ n))))
+        (goto-char p2)
+        (backward-char)
+        (let ((l1 (line-number-at-pos p1))
+              (l2 (line-number-at-pos p2)))
+          (if (not (eq l1 l2))
+              (setq n (1+ n))))
+        (setq p1 p2)
+        (setq p2 (nth 1 (syntax-ppss)))
+
+        ;; make sure we don't go beyond buffer
+        (if (eq p2 1)
+            (setq n (1+ n))))
 
       n)))
 
@@ -296,33 +296,61 @@
      (looking-at "in[[:space:]]")
      (looking-at "in$"))))
 
+(defun nix-indent-level-is-opening ()
+  "Is opening indent?"
+  (save-excursion
+    (end-of-line)
+    (skip-chars-backward "[:space:]")
+
+    (or
+     (looking-back "''"))))
+
 (defun nix-indent-level-is-hanging ()
   "Is hanging?"
   (save-excursion
     (beginning-of-line)
     (skip-chars-forward "[:space:]")
 
-    (forward-line -1)
-    (end-of-line)
-    (skip-chars-backward "\n[:space:]")
+    (if (or
+         ;; (looking-at ",")
+         (looking-at "{")) nil
 
-    ;; skip through any comments in the way
-    (while (nth 4 (syntax-ppss))
-      (goto-char (nth 8 (syntax-ppss)))
-      (skip-chars-backward "\n[:space:]"))
+      (forward-line -1)
+      (end-of-line)
+      (skip-chars-backward "\n[:space:]")
 
-    (or
-     (looking-back "=" 1)
-     (looking-back "+" 1)
-     ;; (looking-back ":" 1)
-     (looking-back "//" 1))))
+      ;; skip through any comments in the way
+      (while (nth 4 (syntax-ppss))
+        (goto-char (nth 8 (syntax-ppss)))
+        (skip-chars-backward "\n[:space:]"))
+
+      (not (or
+            (looking-back "}" 1)
+            (looking-back ":" 1)
+            (looking-back ";" 1))))))
+
+(defun nix-indent-prev-level-is-hanging ()
+  "Is the previous level hanging?"
+  (save-excursion
+    (beginning-of-line)
+    (skip-chars-backward "\n[:space:]")
+    (nix-indent-level-is-hanging)))
+
+(defun nix-indent-prev-level ()
+  "Get the indent level of the previous line."
+  (save-excursion
+    (beginning-of-line)
+    (skip-chars-backward "\n[:space:]")
+    (current-indentation)))
 
 (defun nix-indent-level ()
   "Get current indent level."
-  (* tab-width (+
-                (nix-indent-level-parens)
-                (if (nix-indent-level-is-closing) -1
-                  (if (nix-indent-level-is-hanging) 1 0)))))
+  (if (nix-indent-level-is-hanging)
+      (+ (nix-indent-prev-level)
+         (* tab-width (+ (if (nix-indent-level-is-hanging) 1 0)
+                         (if (nix-indent-level-is-closing) -1 0))))
+    (* tab-width (+ (nix-indent-level-parens)
+                    (if (nix-indent-level-is-closing) -1 0)))))
 
 (defun nix-indent-line ()
   "Indent current line in a Nix expression."
@@ -332,12 +360,15 @@
    ;; comment
    ((save-excursion
       (beginning-of-line)
-      (nth 4 (syntax-ppss))) nil)
+      (nth 4 (syntax-ppss)))
+    (indent-line-to (nix-indent-prev-level)))
 
    ;; string
    ((save-excursion
       (beginning-of-line)
-      (nth 3 (syntax-ppss))) nil)
+      (nth 3 (syntax-ppss)))
+    (indent-line-to (+ (nix-indent-prev-level)
+                       (if (save-excursion (forward-line -1) 
(nix-indent-level-is-opening)) tab-width 0))))
 
    ;; else
    (t

Reply via email to