changeset 76324:b72eb510e3d7

(calculate-lisp-indent): Redo previous change.
author Richard M. Stallman <rms@gnu.org>
date Mon, 05 Mar 2007 03:20:58 +0000
parents 0aef0bcf12f7
children e967fc3cfb4f
files lisp/emacs-lisp/lisp-mode.el
diffstat 1 files changed, 36 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/lisp-mode.el	Mon Mar 05 03:14:25 2007 +0000
+++ b/lisp/emacs-lisp/lisp-mode.el	Mon Mar 05 03:20:58 2007 +0000
@@ -909,34 +909,47 @@
         (cond ((elt state 3)
                ;; Inside a string, don't change indentation.
 	       nil)
-              ((save-excursion
-                 ;; test whether current line begins with a constant
-                 (goto-char indent-point)
-                 (skip-chars-forward " \t")
-                 (looking-at ":"))
-               (let ((desired-indent
-                      (save-excursion
-                        (goto-char (1+ containing-sexp))
-                        (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
-                        (point)))
-                     (parse-sexp-ignore-comments t))
-                 ;; Align a constant symbol under the last constant symbol
-                 (goto-char calculate-lisp-indent-last-sexp)
-                 (while (> (point) desired-indent)
-                   (if (looking-at ":")
-                       (setq desired-indent (point))
-                     (backward-sexp 1))))
-                 (current-column))
               ((and (integerp lisp-indent-offset) containing-sexp)
                ;; Indent by constant offset
                (goto-char containing-sexp)
                (+ (current-column) lisp-indent-offset))
+              ;; in this case calculate-lisp-indent-last-sexp is not nil
+              (calculate-lisp-indent-last-sexp
+               (or
+                ;; try to align the parameters of a known function
+                (and lisp-indent-function
+                     (not retry)
+                     (funcall lisp-indent-function indent-point state))
+                ;; If the function has no special alignment
+		;; or it does not apply to this argument,
+		;; try to align a constant-symbol under the last
+                ;; preceding constant symbol, if there is such one of
+                ;; the last 2 preceding symbols, in the previous
+                ;; uncommented line.
+                (and (save-excursion
+                       (goto-char indent-point)
+                       (skip-chars-forward " \t")
+                       (looking-at ":"))
+                     (> calculate-lisp-indent-last-sexp
+                        (save-excursion
+                          (goto-char (1+ containing-sexp))
+                          (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
+                          (point)))
+                     (let ((parse-sexp-ignore-comments t)
+                           indent)
+                       (goto-char calculate-lisp-indent-last-sexp)
+                       (or (and (looking-at ":")
+                                (setq indent (current-column)))
+                           (and (< (save-excursion (beginning-of-line) (point))
+                                   (prog2 (backward-sexp) (point)))
+                                (looking-at ":")
+                                (setq indent (current-column))))
+                       indent))
+                ;; another symbols or constants not preceded by a constant
+                ;; as defined above.
+                normal-indent))
+              ;; in this case calculate-lisp-indent-last-sexp is nil
               (desired-indent)
-              ((and (boundp 'lisp-indent-function)
-                    lisp-indent-function
-                    (not retry))
-               (or (funcall lisp-indent-function indent-point state)
-                   normal-indent))
               (t
                normal-indent))))))