Elias,

I took the liberty of rewriting `gnu-apl--indent-this'. 

The function now takes indentation amounts from
`gnu-apl--indent-amounts'; this variable specifies the indentation for
header (between del and the first nonblank character; del is still
flush-left), comment, label and other within a function.

Everything outside a function is still flush-left.

Patch attached.

diff --git a/gnu-apl-mode.el b/gnu-apl-mode.el
index 560c836..1a7a44b 100644
--- a/gnu-apl-mode.el
+++ b/gnu-apl-mode.el
@@ -455,31 +455,45 @@ function or nil if the function could not be parsed."
         (user-error "Incorrectly formatted function header"))
       parsed)))
 
+(defvar gnu-apl--indent-amounts '(0 1 1 2)
+  "Ident amount for header, comment, label and other.")
+
 (defun gnu-apl--indent-this ()
-  ;; The indentation rules are very simple. If we are in a function,
-  ;; indent by 2 characters unless we are on a label definition in
-  ;; which case the line should not be indented.
-  ;; Anything outside a function definition is not indented.
+  "Indent a function, controlled by `gnu-apl--indent-amounts'.
+Anything outside a function definition is not indented."
   (beginning-of-line)
   (save-excursion
     (when (re-search-forward "\\=[ \t]*" nil t)
       (replace-match "" nil nil)))
-  (cond ((looking-at "∇")
-         (indent-to-column 0))
-        ((looking-at (format "%s:" gnu-apl--apl-symbol-pattern))
-         (indent-to-column 0))
-        (t
-         (let ((funtion-start (save-excursion
-                                (search-backward-regexp "^[ \t]*∇[ \t]*[^ \t]" nil t))))
-           (if (not funtion-start)
-               (indent-to-column 0)
-             (let ((function-end (save-excursion
-                                   (search-backward-regexp "^[ \t]*∇[ \t]$" nil t))))
-               (if (or (not function-end)
-                       (< function-start function-end))
-                   (indent-to-column 2)
-                 (indent-to-column 0)))))))
-  nil)
+  (destructuring-bind (i-header i-comment i-label i-other)
+      gnu-apl--indent-amounts
+    (cond ((looking-at "∇")
+           (indent-to-column 0)
+           (re-search-forward "∇[ \t]*" nil t)
+           (when (not (char-equal (char-after) ?\n))
+             (replace-match (format "∇%s" (make-string i-header 32)))))
+          ((looking-at (format "%s:" gnu-apl--apl-symbol-pattern))
+           (indent-to-column i-label))
+          (t
+           (let ((function-start (save-excursion
+                                   (search-backward-regexp
+                                    "^[ \t]*∇[ \t]*[^ \t]" nil t)))
+                 (function-end (save-excursion
+                                 (search-forward-regexp
+                                  "^[ \t]*∇[ \t]*$" nil t)))
+                 (prev-function-end (save-excursion
+                                      (search-backward-regexp
+                                       "^[ \t]*∇[ \t]*$" nil t))))
+             (if (and function-start
+                      function-end
+                      (or (not prev-function-end)
+                          (< prev-function-end function-start))
+                      (< function-start function-end))
+                 (if (looking-at "⍝")
+                     (indent-to-column i-comment)
+                   (indent-to-column i-other))
+               (indent-to-column 0))))))
+    nil)
 
 (defun gnu-apl-indent ()
   ;; No indentation unless the cursor is at the beginning of the line

Reply via email to