]> code.delx.au - gnu-emacs/blobdiff - lisp/emacs-lisp/lisp-mode.el
(rx-syntax): Move sregex style syntax to code.
[gnu-emacs] / lisp / emacs-lisp / lisp-mode.el
index 692f00b78175a86805f6abacac62f3b85d025414..853498b0c8c0d9beaf2b0a600fad26c9625776f8 100644 (file)
@@ -1,6 +1,6 @@
 ;;; lisp-mode.el --- Lisp mode, and its idiosyncratic commands
 
-;; Copyright (C) 1985, 1986, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 1985,86,1999,2000,01,03,2004  Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: lisp, languages
   ;; because lisp-fill-paragraph should do the job.
   ;;  I believe that newcomment's auto-fill code properly deals with it  -stef
   ;;(set (make-local-variable 'adaptive-fill-mode) nil)
-  (make-local-variable 'normal-auto-fill-function)
-  (setq normal-auto-fill-function 'lisp-mode-auto-fill)
   (make-local-variable 'indent-line-function)
   (setq indent-line-function 'lisp-indent-line)
   (make-local-variable 'indent-region-function)
   (make-local-variable 'parse-sexp-ignore-comments)
   (setq parse-sexp-ignore-comments t)
   (make-local-variable 'outline-regexp)
-  (setq outline-regexp ";;;;* \\|(")
+  (setq outline-regexp ";;;;* [^ \t\n]\\|(")
   (make-local-variable 'outline-level)
   (setq outline-level 'lisp-outline-level)
   (make-local-variable 'comment-start)
   (setq comment-add 1)                 ;default to `;;' in comment-region
   (make-local-variable 'comment-column)
   (setq comment-column 40)
-  (make-local-variable 'comment-indent-function)
-  (setq comment-indent-function 'lisp-comment-indent)
+  ;; Don't get confused by `;' in doc strings when paragraph-filling.
+  (set (make-local-variable 'comment-use-global-state) t)
   (make-local-variable 'imenu-generic-expression)
   (setq imenu-generic-expression lisp-imenu-generic-expression)
   (make-local-variable 'multibyte-syntax-as-symbol)
   (setq font-lock-defaults
        '((lisp-font-lock-keywords
           lisp-font-lock-keywords-1 lisp-font-lock-keywords-2)
-         nil nil (("+-*/.<>=!?$%_&~^:" . "w")) beginning-of-defun
+         nil nil (("+-*/.<>=!?$%_&~^:" . "w")) nil
          (font-lock-mark-block-function . mark-defun)
          (font-lock-syntactic-face-function
           . lisp-font-lock-syntactic-face-function))))
 
 (defun lisp-outline-level ()
   "Lisp mode `outline-level' function."
-  (if (looking-at "(")
+  (if (looking-at "(\\|;;;###autoload")
       1000
     (looking-at outline-regexp)
     (- (match-end 0) (match-beginning 0))))
@@ -320,7 +318,7 @@ if that value is non-nil."
   (setq mode-name "Emacs-Lisp")
   (lisp-mode-variables)
   (setq imenu-case-fold-search nil)
-  (run-hooks 'emacs-lisp-mode-hook))
+  (run-mode-hooks 'emacs-lisp-mode-hook))
 (put 'emacs-lisp-mode 'custom-mode-group 'lisp)
 
 (defvar lisp-mode-map
@@ -356,7 +354,10 @@ if that value is non-nil."
   (setq font-lock-keywords-case-fold-search t)
   (setq imenu-case-fold-search t)
   (set-syntax-table lisp-mode-syntax-table)
-  (run-hooks 'lisp-mode-hook))
+  (run-mode-hooks 'lisp-mode-hook))
+
+;; Used in old LispM code.
+(defalias 'common-lisp-mode 'lisp-mode)
 
 ;; This will do unless inf-lisp.el is loaded.
 (defun lisp-eval-defun (&optional and-go)
@@ -425,12 +426,8 @@ alternative printed representations that can be displayed."
 (defun last-sexp-toggle-display (&optional arg)
   "Toggle between abbreviated and unabbreviated printed representations."
   (interactive "P")
-  ;; Normally this command won't be called at end of line.
-  ;; But when the end of the line is also the end of the buffer,
-  ;; it does get called.  For consistency, pretend it was not called.
-  (if (eobp)
-      (let ((prefix-arg arg))
-       (command-execute (lookup-key global-map (this-single-command-keys))))
+  (save-restriction
+    (widen)
     (let ((value (get-text-property (point) 'printed-value)))
       (when value
        (let ((beg (or (previous-single-property-change (min (point-max) (1+ (point)))
@@ -452,14 +449,18 @@ alternative printed representations that can be displayed."
 If CHAR is not a character, return nil."
   (and (integerp char)
        (char-valid-p (event-basic-type char))
-       (concat
-       "?"
-       (mapconcat
-        (lambda (modif)
-          (cond ((eq modif 'super) "\\s-")
-                (t (string ?\\ (upcase (aref (symbol-name modif) 0)) ?-))))
-        (event-modifiers char) "")
-       (string (event-basic-type char)))))
+       (let ((c (event-basic-type char)))
+        (concat
+         "?"
+         (mapconcat
+          (lambda (modif)
+            (cond ((eq modif 'super) "\\s-")
+                  (t (string ?\\ (upcase (aref (symbol-name modif) 0)) ?-))))
+          (event-modifiers char) "")
+         (cond
+          ((memq c '(?\; ?\( ?\) ?\{ ?\} ?\[ ?\] ?\" ?\' ?\\)) (string ?\\ c))
+          ((eq c 127) "\\C-?")
+          (t (string c)))))))
 
 (defun eval-last-sexp-1 (eval-last-sexp-arg-internal)
   "Evaluate sexp before point; print value in minibuffer.
@@ -470,72 +471,76 @@ With argument, print output into current buffer."
                       (opoint (point))
                       ignore-quotes
                       expr)
-                  (with-syntax-table emacs-lisp-mode-syntax-table
-                    ;; If this sexp appears to be enclosed in `...'
-                    ;; then ignore the surrounding quotes.
-                    (setq ignore-quotes
-                          (or (eq (following-char) ?\')
-                              (eq (preceding-char) ?\')))
-                    (forward-sexp -1)
-                    ;; If we were after `?\e' (or similar case),
-                    ;; use the whole thing, not just the `e'.
-                    (when (eq (preceding-char) ?\\)
-                      (forward-char -1)
-                      (when (eq (preceding-char) ??)
-                        (forward-char -1)))
-
-                    ;; Skip over `#N='s.
-                    (when (eq (preceding-char) ?=)
-                      (let (labeled-p)
-                        (save-excursion
-                          (skip-chars-backward "0-9#=")
-                          (setq labeled-p (looking-at "\\(#[0-9]+=\\)+")))
-                        (when labeled-p
-                          (forward-sexp -1))))
-
-                    (save-restriction
-                      ;; vladimir@cs.ualberta.ca 30-Jul-1997: skip ` in
-                      ;; `variable' so that the value is returned, not the
-                      ;; name
-                      (if (and ignore-quotes
-                               (eq (following-char) ?`))
-                          (forward-char))
-                      (narrow-to-region (point-min) opoint)
-                      (setq expr (read (current-buffer)))
-                      ;; If it's an (interactive ...) form, it's more
-                      ;; useful to show how an interactive call would
-                      ;; use it.
-                      (and (consp expr)
-                           (eq (car expr) 'interactive)
-                           (setq expr
-                                 (list 'call-interactively
-                                       (list 'quote
-                                             (list 'lambda
-                                                   '(&rest args)
-                                                   expr
-                                                   'args)))))
-                      expr))))))
-      (let ((unabbreviated (let ((print-length nil) (print-level nil))
-                            (prin1-to-string value)))
-           (print-length eval-expression-print-length)
-           (print-level eval-expression-print-level)
-           (char-string (prin1-char value))
-           (beg (point))
-           end)
-       (prog1
-           (prin1 value)
-         (if (and (eq standard-output t) char-string)
-             (princ (concat " = " char-string)))
-         (setq end (point))
-         (when (and (bufferp standard-output)
-                    (or (not (null print-length))
-                        (not (null print-level)))
-                    (not (string= unabbreviated
-                                  (buffer-substring-no-properties beg end))))
-           (last-sexp-setup-props beg end value
-                                  unabbreviated
-                                  (buffer-substring-no-properties beg end))
-           ))))))
+                  (save-excursion
+                    (with-syntax-table emacs-lisp-mode-syntax-table
+                      ;; If this sexp appears to be enclosed in `...'
+                      ;; then ignore the surrounding quotes.
+                      (setq ignore-quotes
+                            (or (eq (following-char) ?\')
+                                (eq (preceding-char) ?\')))
+                      (forward-sexp -1)
+                      ;; If we were after `?\e' (or similar case),
+                      ;; use the whole thing, not just the `e'.
+                      (when (eq (preceding-char) ?\\)
+                        (forward-char -1)
+                        (when (eq (preceding-char) ??)
+                          (forward-char -1)))
+
+                      ;; Skip over `#N='s.
+                      (when (eq (preceding-char) ?=)
+                        (let (labeled-p)
+                          (save-excursion
+                            (skip-chars-backward "0-9#=")
+                            (setq labeled-p (looking-at "\\(#[0-9]+=\\)+")))
+                          (when labeled-p
+                            (forward-sexp -1))))
+
+                      (save-restriction
+                        ;; vladimir@cs.ualberta.ca 30-Jul-1997: skip ` in
+                        ;; `variable' so that the value is returned, not the
+                        ;; name
+                        (if (and ignore-quotes
+                                 (eq (following-char) ?`))
+                            (forward-char))
+                        (narrow-to-region (point-min) opoint)
+                        (setq expr (read (current-buffer)))
+                        ;; If it's an (interactive ...) form, it's more
+                        ;; useful to show how an interactive call would
+                        ;; use it.
+                        (and (consp expr)
+                             (eq (car expr) 'interactive)
+                             (setq expr
+                                   (list 'call-interactively
+                                         (list 'quote
+                                               (list 'lambda
+                                                     '(&rest args)
+                                                     expr
+                                                     'args)))))
+                        expr)))))))
+      (eval-last-sexp-print-value value))))
+
+(defun eval-last-sexp-print-value (value)
+  (let ((unabbreviated (let ((print-length nil) (print-level nil))
+                        (prin1-to-string value)))
+       (print-length eval-expression-print-length)
+       (print-level eval-expression-print-level)
+       (char-string (prin1-char value))
+       (beg (point))
+       end)
+    (prog1
+       (prin1 value)
+      (if (and (eq standard-output t) char-string)
+         (princ (concat " = " char-string)))
+      (setq end (point))
+      (when (and (bufferp standard-output)
+                (or (not (null print-length))
+                    (not (null print-level)))
+                (not (string= unabbreviated
+                              (buffer-substring-no-properties beg end))))
+       (last-sexp-setup-props beg end value
+                              unabbreviated
+                              (buffer-substring-no-properties beg end))
+       ))))
 
 
 (defun eval-last-sexp (eval-last-sexp-arg-internal)
@@ -666,8 +671,8 @@ which see."
 ;; This function just forces a more costly detection of comments (using
 ;; parse-partial-sexp from beginning-of-defun).  I.e. It avoids the problem of
 ;; taking a `;' inside a string started on another line for a comment starter.
-;; Note: `newcomment' gets it right in 99% of the cases if you're using
-;;       font-lock, anyway, so we could get rid of it.   -stef
+;; Note: `newcomment' gets it right now since we set comment-use-global-state
+;; so we could get rid of it.   -stef
 (defun lisp-mode-auto-fill ()
   (if (> (current-column) (current-fill-column))
       (if (save-excursion
@@ -1170,4 +1175,5 @@ means don't indent that line."
 
 (provide 'lisp-mode)
 
+;;; arch-tag: 414c7f93-c245-4b77-8ed5-ed05ef7ff1bf
 ;;; lisp-mode.el ends here