(debug-convert-byte-code): Convert the doc info to a string.
[bpt/emacs.git] / lisp / emacs-lisp / lisp.el
index cc3b189..fd9ae0c 100644 (file)
@@ -1,12 +1,15 @@
 ;;; lisp.el --- Lisp editing commands for Emacs
 
-;; Copyright (C) 1985, 1986 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1986, 1994 Free Software Foundation, Inc.
+
+;; Maintainer: FSF
+;; Keywords: lisp, languages
 
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 1, or (at your option)
+;; the Free Software Foundation; either version 2, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; along with GNU Emacs; see the file COPYING.  If not, write to
 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 
+;;; Commentary:
+
+;; Lisp editing commands to go with Lisp major mode.
+
+;;; Code:
 
+;; Note that this variable is used by non-lisp modes too.
 (defvar defun-prompt-regexp nil
-  "Non-nil => regexp to ignore, before the `(' that starts a defun.")
+  "*Non-nil => regexp to ignore, before the character that starts a defun.
+This is only necessary if the opening paren or brace is not in column 0.
+See `beginning-of-defun'.")
+(make-variable-buffer-local 'defun-prompt-regexp)
+
+(defvar parens-require-spaces t
+  "Non-nil => `insert-parentheses' should insert whitespace as needed.")
 
 (defun forward-sexp (&optional arg)
   "Move forward across one balanced expression (sexp).
@@ -47,7 +62,8 @@ move to with the same argument."
   (push-mark
     (save-excursion
       (forward-sexp arg)
-      (point))))
+      (point))
+    nil t))
 
 (defun forward-list (&optional arg)
   "Move forward across one balanced group of parentheses.
@@ -120,15 +136,23 @@ Returns t unless search stops due to beginning or end of buffer.
 Normally a defun starts when there is an char with open-parenthesis
 syntax at the beginning of a line.  If `defun-prompt-regexp' is
 non-nil, then a string which matches that regexp may precede the
-open-parenthesis."
+open-parenthesis, and point ends up at the beginning of the line."
+  (interactive "p")
+  (and (beginning-of-defun-raw arg)
+       (progn (beginning-of-line) t)))
+
+(defun beginning-of-defun-raw (&optional arg)
+  "Move point to the character that starts a defun.
+This is identical to beginning-of-defun, except that point does not move
+to the beginning of the line when `defun-prompt-regexp' is non-nil."
   (interactive "p")
-  (and arg (< arg 0) (forward-char 1))
+  (and arg (< arg 0) (not (eobp)) (forward-char 1))
   (and (re-search-backward (if defun-prompt-regexp
                               (concat "^\\s(\\|"
                                       "\\(" defun-prompt-regexp "\\)\\s(")
                             "^\\s(")
                           nil 'move (or arg 1))
-       (progn (beginning-of-line) t)))
+       (progn (goto-char (1- (match-end 0)))) t))
 
 (defun buffer-end (arg)
   (if (> arg 0) (point-max) (point-min)))
@@ -147,11 +171,11 @@ the open-parenthesis that starts a defun; see `beginning-of-defun'."
        (while (progn
                (if (and first
                         (progn
-                         (forward-char 1)
-                         (beginning-of-defun 1)))
+                         (end-of-line 1)
+                         (beginning-of-defun-raw 1)))
                    nil
                  (or (bobp) (forward-char -1))
-                 (beginning-of-defun -1))
+                 (beginning-of-defun-raw -1))
                (setq first nil)
                (forward-list 1)
                (skip-chars-forward " \t")
@@ -161,15 +185,15 @@ the open-parenthesis that starts a defun; see `beginning-of-defun'."
       (setq arg (1- arg)))
     (while (< arg 0)
       (let ((pos (point)))
-       (beginning-of-defun 1)
+       (beginning-of-defun-raw 1)
        (forward-sexp 1)
        (forward-line 1)
        (if (>= (point) pos)
-           (if (beginning-of-defun 2)
+           (if (beginning-of-defun-raw 2)
                (progn
                  (forward-list 1)
                  (skip-chars-forward " \t")
-                 (if (looking-at "[;\n]")
+                 (if (looking-at "\\s<\\|\n")
                      (forward-line 1)))
              (goto-char (point-min)))))
       (setq arg (1+ arg)))))
@@ -180,24 +204,30 @@ The defun marked is the one that contains point or follows point."
   (interactive)
   (push-mark (point))
   (end-of-defun)
-  (push-mark (point))
+  (push-mark (point) nil t)
   (beginning-of-defun)
   (re-search-backward "^\n" (- (point) 1) t))
 
 (defun insert-parentheses (arg)
   "Put parentheses around next ARG sexps.  Leave point after open-paren.
-No argument is equivalent to zero: just insert () and leave point between."
+No argument is equivalent to zero: just insert `()' and leave point between.
+If `parens-require-spaces' is non-nil, this command also inserts a space
+before and after, depending on the surrounding characters."
   (interactive "P")
   (if arg (setq arg (prefix-numeric-value arg))
     (setq arg 0))
   (or (eq arg 0) (skip-chars-forward " \t"))
-  (and (memq (char-syntax (preceding-char)) '(?w ?_ ?\) ))
+  (and parens-require-spaces
+       (not (bobp))
+       (memq (char-syntax (preceding-char)) '(?w ?_ ?\) ))
        (insert " "))
   (insert ?\()
   (save-excursion
     (or (eq arg 0) (forward-sexp arg))
     (insert ?\))
-    (and (memq (char-syntax (following-char)) '(?w ?_ ?\( ))
+    (and parens-require-spaces
+        (not (eobp))
+        (memq (char-syntax (following-char)) '(?w ?_ ?\( ))
         (insert " "))))
 
 (defun move-past-close-and-reindent ()
@@ -214,10 +244,11 @@ No argument is equivalent to zero: just insert () and leave point between."
   (newline-and-indent))
 \f
 (defun lisp-complete-symbol ()
-  "Perform completion on Lisp symbol preceding point.  That symbol is
-compared against the symbols that exist and any additional characters
-determined by what is there are inserted.
-   If the symbol starts just after an open-parenthesis, only symbols
+  "Perform completion on Lisp symbol preceding point.
+Compare that symbol against the known Lisp symbols.
+
+The context determines which symbols are considered.
+If the symbol starts just after an open-parenthesis, only symbols
 with function definitions are considered.  Otherwise, all symbols with
 function definitions, values or properties are considered."
   (interactive)
@@ -248,7 +279,12 @@ function definitions, values or properties are considered."
           (insert completion))
          (t
           (message "Making completion list...")
-          (let ((list (all-completions pattern obarray predicate)))
+          (let ((list (all-completions pattern obarray predicate))
+                (completion-fixup-function
+                 (function (lambda () (if (save-excursion
+                                            (goto-char (max (point-min) (- (point) 4)))
+                                            (looking-at " <f>"))
+                                          (forward-char -4))))))
             (or (eq predicate 'fboundp)
                 (let (new)
                   (while list
@@ -258,7 +294,7 @@ function definitions, values or properties are considered."
                                     new))
                     (setq list (cdr list)))
                   (setq list (nreverse new))))
-            (with-output-to-temp-buffer " *Completions*"
+            (with-output-to-temp-buffer "*Completions*"
               (display-completion-list list)))
           (message "Making completion list...%s" "done")))))