emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master 6c33e7a: * prolog.el: Fix indentation of empty line


From: Stefan Monnier
Subject: [Emacs-diffs] master 6c33e7a: * prolog.el: Fix indentation of empty line
Date: Tue, 22 Sep 2015 15:11:55 +0000

branch: master
commit 6c33e7ada5c0aa0dac1e6298c5b45c0134a90b92
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>

    * prolog.el: Fix indentation of empty line
    
    * lisp/emacs-lisp/smie.el (smie-rules-function): Document new
    `empty-line-token' element.
    (smie-indent-empty-line): New function.
    (smie-indent-functions): Add it.
    
    * lisp/progmodes/prolog.el (prolog-smie-rules): Fix :list-intro behavior
    and use the new `empty-line-token' element (bug#21526).
    (prolog-mode-variables): Fix comment-start-skip setting to match
    comment-start.
    
    * test/indent/prolog.prolog: Add nested indentation tests.
    
    * lisp/newcomment.el (comment-normalize-vars): Fix default value of
    comment-start-skip not to misuse submatch 1.
---
 lisp/emacs-lisp/smie.el   |   17 ++++++++++++++++-
 lisp/newcomment.el        |    2 +-
 lisp/progmodes/prolog.el  |    7 ++++++-
 test/indent/prolog.prolog |   17 ++++++++---------
 4 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/lisp/emacs-lisp/smie.el b/lisp/emacs-lisp/smie.el
index eb5a713..f305025 100644
--- a/lisp/emacs-lisp/smie.el
+++ b/lisp/emacs-lisp/smie.el
@@ -1136,6 +1136,8 @@ METHOD can be:
 - :elem, in which case the function should return either:
   - the offset to use to indent function arguments (ARG = `arg')
   - the basic indentation step (ARG = `basic').
+  - the token to use (when ARG = `empty-line-token') when we don't know how
+    to indent an empty line.
 - :list-intro, in which case ARG is a token and the function should return
   non-nil if TOKEN is followed by a list of expressions (not separated by any
   token) rather than an expression.
@@ -1686,6 +1688,19 @@ should not be computed on the basis of the following 
token."
         (+ (smie-indent-virtual) (smie-indent--offset 'basic))) ;
        (t (smie-indent-virtual))))))                            ;An infix.
 
+(defun smie-indent-empty-line ()
+  "Indentation rule when there's nothing yet on the line."
+  ;; Without this rule, SMIE assumes that an empty line will be filled with an
+  ;; argument (since it falls back to smie-indent-sexps), which tends
+  ;; to indent far too deeply.
+  (when (eolp)
+    (let ((token (or (funcall smie-rules-function :elem 'empty-line-token)
+                     ;; FIXME: Should we default to ";"?
+                     ;; ";"
+                     )))
+      (when (assoc token smie-grammar)
+        (smie-indent-keyword token)))))
+
 (defun smie-indent-exps ()
   ;; Indentation of sequences of simple expressions without
   ;; intervening keywords or operators.  E.g. "a b c" or "g (balbla) f".
@@ -1744,7 +1759,7 @@ should not be computed on the basis of the following 
token."
     smie-indent-comment smie-indent-comment-continue smie-indent-comment-close
     smie-indent-comment-inside smie-indent-inside-string
     smie-indent-keyword smie-indent-after-keyword
-                          smie-indent-exps)
+    smie-indent-empty-line smie-indent-exps)
   "Functions to compute the indentation.
 Each function is called with no argument, shouldn't move point, and should
 return either nil if it has no opinion, or an integer representing the column
diff --git a/lisp/newcomment.el b/lisp/newcomment.el
index 60f35c8..7df05a0 100644
--- a/lisp/newcomment.el
+++ b/lisp/newcomment.el
@@ -382,7 +382,7 @@ function should first call this function explicitly."
           (concat (unless (eq comment-use-syntax t)
                      ;; `syntax-ppss' will detect escaping.
                      "\\(\\(^\\|[^\\\n]\\)\\(\\\\\\\\\\)*\\)")
-                   "\\(\\s<+\\|"
+                   "\\(?:\\s<+\\|"
                   (regexp-quote (comment-string-strip comment-start t t))
                   ;; Let's not allow any \s- but only [ \t] since \n
                   ;; might be both a comment-end marker and \s-.
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el
index 8c02e54..3d9b0c3 100644
--- a/lisp/progmodes/prolog.el
+++ b/lisp/progmodes/prolog.el
@@ -922,6 +922,11 @@ This is really kludgy, and unneeded (i.e. obsolete) in 
Emacs>=24."
 (defun prolog-smie-rules (kind token)
   (pcase (cons kind token)
     (`(:elem . basic) prolog-indent-width)
+    ;; The list of arguments can never be on a separate line!
+    (`(:list-intro . ,_) t)
+    ;; When we don't know how to indent an empty line, assume the most
+    ;; likely token will be ";".
+    (`(:elem . empty-line-token) ";")
     (`(:after . ".") '(column . 0)) ;; To work around smie-closer-alist.
     ;; Allow indentation of if-then-else as:
     ;;    (   test
@@ -1023,7 +1028,7 @@ VERSION is of the format (Major . Minor)"
   (setq-local comment-start "%")
   (setq-local comment-end "")
   (setq-local comment-add 1)
-  (setq-local comment-start-skip "\\(?:/\\*+ *\\|%%+ *\\)")
+  (setq-local comment-start-skip "\\(?:/\\*+ *\\|%+ *\\)")
   (setq-local parens-require-spaces nil)
   ;; Initialize Prolog system specific variables
   (dolist (var '(prolog-keywords prolog-types prolog-mode-specificators
diff --git a/test/indent/prolog.prolog b/test/indent/prolog.prolog
index ca4d2c9..6bf9437 100644
--- a/test/indent/prolog.prolog
+++ b/test/indent/prolog.prolog
@@ -3,25 +3,24 @@
 %% bug#21526
 test1 :-
     (   a ->
-        b
+            (   a ->
+                b
+            ;   c
+            )
     ;   c
     ).
 
 test2 :-
     (    a
-    ->   b1,
+    ->   (   a,
+             b
+         ;   c
+         ),
          b2
     ;    c1,
          c2
     )
 
-test3 :-
-    (   a,
-        b
-    ;   c
-    ).
-
-
 %% Testing correct tokenizing.
 foo(X) :- 0'= = X.
 foo(X) :- 8'234 = X.



reply via email to

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