(autoload-generate-file-autoloads): Be careful
[bpt/emacs.git] / lisp / emacs-lisp / lisp-mode.el
index d5588f3..73379a8 100644 (file)
@@ -1,7 +1,7 @@
 ;;; lisp-mode.el --- Lisp mode, and its idiosyncratic commands
 
 ;; Copyright (C) 1985, 1986, 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006 Free Software Foundation, Inc.
+;;   2005, 2006, 2007 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: lisp, languages
@@ -97,6 +97,7 @@
                              '("defun" "defun*" "defsubst" "defmacro"
                                "defadvice" "define-skeleton"
                                "define-minor-mode" "define-global-minor-mode"
+                               "define-globalized-minor-mode"
                                "define-derived-mode" "define-generic-mode"
                                "define-compiler-macro" "define-modify-macro"
                                "defsetf" "define-setf-expander"
 (put 'define-minor-mode 'doc-string-elt 2)
 (put 'easy-mmode-define-global-mode 'doc-string-elt 2)
 (put 'define-global-minor-mode 'doc-string-elt 2)
+(put 'define-globalized-minor-mode 'doc-string-elt 2)
 (put 'define-generic-mode 'doc-string-elt 7)
 (put 'define-ibuffer-filter 'doc-string-elt 2)
 (put 'define-ibuffer-op 'doc-string-elt 3)
@@ -291,7 +293,7 @@ All commands in `lisp-mode-shared-map' are inherited by this map.")
     (define-key map [byte-compile]
       '("Byte-compile This File" . emacs-lisp-byte-compile))
     (define-key map [separator-eval] '("--"))
-    (define-key map [eval-buffer] '("Evaluate Buffer" . eval-current-buffer))
+    (define-key map [eval-buffer] '("Evaluate Buffer" . eval-buffer))
     (define-key map [eval-region] '("Evaluate Region" . eval-region))
     (define-key map [eval-sexp] '("Evaluate Last S-expression" . eval-last-sexp))
     (define-key map [separator-format] '("--"))
@@ -490,6 +492,8 @@ alternative printed representations that can be displayed."
              (point (point)))
          (delete-region beg end)
          (insert (nth 1 value))
+         (or (= beg point)
+             (setq point (1- (point))))
          (last-sexp-setup-props beg (point)
                                 (nth 0 value)
                                 (nth 2 value)
@@ -624,13 +628,13 @@ this command arranges for all errors to enter the debugger."
   (interactive "P")
   (if (null eval-expression-debug-on-error)
       (eval-last-sexp-1 eval-last-sexp-arg-internal)
-    (let ((old-value eval-last-sexp-fake-value) new-value value)
-      (let ((debug-on-error old-value))
-       (setq value (eval-last-sexp-1 eval-last-sexp-arg-internal))
-       (setq new-value debug-on-error))
-      (unless (eq old-value new-value)
-       (setq debug-on-error new-value))
-      value)))
+    (let ((value
+          (let ((debug-on-error eval-last-sexp-fake-value))
+            (cons (eval-last-sexp-1 eval-last-sexp-arg-internal)
+                  debug-on-error))))
+      (unless (eq (cdr value) eval-last-sexp-fake-value)
+       (setq debug-on-error (cdr value)))
+      (car value))))
 
 (defun eval-defun-1 (form)
   "Treat some expressions specially.
@@ -909,12 +913,43 @@ is the buffer position of the start of the containing expression."
                ;; 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))))))
 
@@ -1126,19 +1161,25 @@ ENDPOS is encountered."
                                         (make-list (- next-depth) nil))
                     last-depth (- last-depth next-depth)
                     next-depth 0)))
-       (or outer-loop-done endpos
-           (setq outer-loop-done (<= next-depth 0)))
-       (if outer-loop-done
-           (forward-line 1)
+       (forward-line 1)
+       ;; Decide whether to exit.
+       (if endpos
+           ;; If we have already reached the specified end,
+           ;; give up and do not reindent this line.
+           (if (<= endpos (point))
+               (setq outer-loop-done t))
+         ;; If no specified end, we are done if we have finished one sexp.
+         (if (<= next-depth 0)
+             (setq outer-loop-done t)))
+       (unless outer-loop-done
          (while (> last-depth next-depth)
            (setq indent-stack (cdr indent-stack)
                  last-depth (1- last-depth)))
          (while (< last-depth next-depth)
            (setq indent-stack (cons nil indent-stack)
                  last-depth (1+ last-depth)))
-         ;; Now go to the next line and indent it according
+         ;; Now indent the next line according
          ;; to what we learned from parsing the previous one.
-         (forward-line 1)
          (setq bol (point))
          (skip-chars-forward " \t")
          ;; But not if the line is blank, or just a comment
@@ -1239,7 +1280,8 @@ and initial semicolons."
                                     "\\|\\s-*\\([(;:\"]\\|`(\\|#'(\\)"))
            (paragraph-separate
             (concat paragraph-separate "\\|\\s-*\".*[,\\.]$"))
-            (fill-column (if (integerp emacs-lisp-docstring-fill-column)
+            (fill-column (if (and (integerp emacs-lisp-docstring-fill-column)
+                                  (derived-mode-p 'emacs-lisp-mode))
                              emacs-lisp-docstring-fill-column
                            fill-column)))
        (fill-paragraph justify))