]> code.delx.au - gnu-emacs/blobdiff - lisp/apropos.el
(apropos-print): control invalid characters.
[gnu-emacs] / lisp / apropos.el
index 34dabdf0b2c6248fc5f0fb73f48acbd414ae237c..b391e5157b7054c333be1faf9966d51dca1d597b 100644 (file)
@@ -152,7 +152,7 @@ normal variables."
                               " (regexp): "))
                      current-prefix-arg))
   (apropos-command regexp nil
-                  (if arg 
+                  (if (or do-all apropos-do-all)
                       #'(lambda (symbol)
                           (and (boundp symbol)
                                (get symbol 'variable-documentation)))
@@ -182,34 +182,33 @@ satisfy the predicate VAR-PREDICATE."
     (or do-all (setq do-all apropos-do-all))
     (setq apropos-accumulator
          (apropos-internal apropos-regexp
-                           (if do-all 'functionp
-                             (or var-predicate 'commandp))))
+                           (or var-predicate
+                               (if do-all 'functionp 'commandp))))
     (let ((tem apropos-accumulator))
       (while tem
        (if (get (car tem) 'apropos-inhibit)
            (setq apropos-accumulator (delq (car tem) apropos-accumulator)))
        (setq tem (cdr tem))))
-    (if (apropos-print
-        t
-        (lambda (p)
-          (let (doc symbol)
-            (while p
-              (setcar p (list
-                         (setq symbol (car p))
-                         (unless var-predicate
-                           (if (functionp symbol)
-                               (if (setq doc (documentation symbol t))
-                                   (substring doc 0 (string-match "\n" doc))
-                                 "(not documented)")))
-                         (and var-predicate
-                              (funcall var-predicate symbol)
-                              (if (setq doc (documentation-property
-                                             symbol 'variable-documentation t))
-                                  (substring doc 0
-                                             (string-match "\n" doc))))))
-              (setq p (cdr p)))))
-        nil)
-       (and message (message message)))))
+    (let ((p apropos-accumulator)
+         doc symbol)
+      (while p
+       (setcar p (list
+                  (setq symbol (car p))
+                  (unless var-predicate
+                    (if (functionp symbol)
+                        (if (setq doc (documentation symbol t))
+                            (substring doc 0 (string-match "\n" doc))
+                          "(not documented)")))
+                  (and var-predicate
+                       (funcall var-predicate symbol)
+                       (if (setq doc (documentation-property
+                                      symbol 'variable-documentation t))
+                           (substring doc 0
+                                      (string-match "\n" doc))))))
+       (setq p (cdr p))))
+    (and (apropos-print t nil)
+        message
+        (message message))))
 
 
 ;;;###autoload
@@ -233,49 +232,49 @@ Returns list of symbols and documentation found."
       (if (get (car tem) 'apropos-inhibit)
          (setq apropos-accumulator (delq (car tem) apropos-accumulator)))
       (setq tem (cdr tem))))
+  (let ((p apropos-accumulator)
+       symbol doc properties)
+    (while p
+      (setcar p (list
+                (setq symbol (car p))
+                (when (fboundp symbol)
+                  (if (setq doc (condition-case nil
+                                    (documentation symbol t)
+                                  (void-function
+                                   "(alias for undefined function)")))
+                      (substring doc 0 (string-match "\n" doc))
+                    "(not documented)"))
+                (when (boundp symbol)
+                  (if (setq doc (documentation-property
+                                 symbol 'variable-documentation t))
+                      (substring doc 0 (string-match "\n" doc))
+                    "(not documented)"))
+                (when (setq properties (symbol-plist symbol))
+                  (setq doc (list (car properties)))
+                  (while (setq properties (cdr (cdr properties)))
+                    (setq doc (cons (car properties) doc)))
+                  (mapconcat #'symbol-name (nreverse doc) " "))
+                (when (get symbol 'widget-type)
+                  (if (setq doc (documentation-property
+                                 symbol 'widget-documentation t))
+                      (substring doc 0
+                                 (string-match "\n" doc))
+                    "(not documented)"))
+                (when (facep symbol)
+                  (if (setq doc (documentation-property
+                                 symbol 'face-documentation t))
+                      (substring doc 0
+                                 (string-match "\n" doc))
+                    "(not documented)"))
+                (when (get symbol 'custom-group)
+                  (if (setq doc (documentation-property
+                                 symbol 'group-documentation t))
+                      (substring doc 0
+                                 (string-match "\n" doc))
+                    "(not documented)"))))
+      (setq p (cdr p))))
   (apropos-print
    (or do-all apropos-do-all)
-   (lambda (p)
-     (let (symbol doc properties)
-       (while p
-        (setcar p (list
-                   (setq symbol (car p))
-                   (when (fboundp symbol)
-                      (if (setq doc (condition-case nil
-                                        (documentation symbol t)
-                                      (void-function
-                                       "(alias for undefined function)")))
-                         (substring doc 0 (string-match "\n" doc))
-                       "(not documented)"))
-                   (when (boundp symbol)
-                     (if (setq doc (documentation-property
-                                    symbol 'variable-documentation t))
-                         (substring doc 0 (string-match "\n" doc))
-                       "(not documented)"))
-                   (when (setq properties (symbol-plist symbol))
-                     (setq doc (list (car properties)))
-                     (while (setq properties (cdr (cdr properties)))
-                       (setq doc (cons (car properties) doc)))
-                     (mapconcat #'symbol-name (nreverse doc) " "))
-                   (when (get symbol 'widget-type)
-                     (if (setq doc (documentation-property
-                                    symbol 'widget-documentation t))
-                         (substring doc 0
-                                    (string-match "\n" doc))
-                       "(not documented)"))
-                   (when (facep symbol)
-                     (if (setq doc (documentation-property
-                                    symbol 'face-documentation t))
-                         (substring doc 0
-                                    (string-match "\n" doc))
-                       "(not documented)"))
-                   (when (get symbol 'custom-group)
-                     (if (setq doc (documentation-property
-                                    symbol 'group-documentation t))
-                         (substring doc 0
-                                    (string-match "\n" doc))
-                       "(not documented)"))))
-        (setq p (cdr p)))))
    nil))
 
 
@@ -301,7 +300,7 @@ Returns list of symbols and values found."
        (if (or f v p)
            (setq apropos-accumulator (cons (list symbol f v p)
                                            apropos-accumulator))))))
-  (apropos-print nil nil t))
+  (apropos-print nil t))
 
 
 ;;;###autoload
@@ -339,7 +338,7 @@ Returns list of symbols and documentation found."
                       (setq apropos-accumulator
                             (cons (list symbol f v)
                                   apropos-accumulator)))))))
-         (apropos-print nil nil t))
+         (apropos-print nil t))
       (kill-buffer standard-input))))
 
 \f
@@ -495,16 +494,15 @@ Will return nil instead."
 
 
 
-(defun apropos-print (do-keys doc-fn spacing)
-  "Output result of various apropos commands with `apropos-regexp'.
-APROPOS-ACCUMULATOR is a list.  Optional DOC-FN is called for each element
-of apropos-accumulator and may modify it resulting in (SYMBOL FN-DOC
-VAR-DOC [PLIST-DOC]).  Returns sorted list of symbols and documentation
-found."
+(defun apropos-print (do-keys spacing)
+  "Output result of apropos searching into buffer `*Apropos*'.
+The value of `apropos-accumulator' is the list of items to output.
+Each element should have the format (SYMBOL FN-DOC VAR-DOC [PLIST-DOC]).
+The return value is the list that was in `apropos-accumulator', sorted
+alphabetically by symbol name; but this function also sets
+`apropos-accumulator' to nil before returning."
   (if (null apropos-accumulator)
       (message "No apropos matches for `%s'" apropos-regexp)
-    (if doc-fn
-       (funcall doc-fn apropos-accumulator))
     (setq apropos-accumulator
          (sort apropos-accumulator (lambda (a b)
                                      (string-lessp (car a) (car b)))))
@@ -560,7 +558,9 @@ found."
                   (insert
                    (mapconcat
                     (lambda (key)
-                      (setq key (key-description key))
+                      (setq key (condition-case () 
+                                    (key-description key)
+                                  (error)))
                       (if apropos-keybinding-face
                           (put-text-property 0 (length key)
                                              'face apropos-keybinding-face
@@ -589,16 +589,18 @@ found."
                                   "Macro"
                                 "Function"))
                             t)
-         (if (get symbol 'custom-type)
-             (apropos-print-doc 'customize-variable-other-window 2
-                                "User Option" t)
-           (apropos-print-doc 'describe-variable 2
-                              "Variable" t))
+         ;; We used to use customize-variable-other-window instead
+         ;; for a customizable variable, but that is slow.
+         ;; It is better to show an ordinary help buffer
+         ;; and let the user click on the customization button
+         ;; in that buffer, if he wants to.
+         (apropos-print-doc 'describe-variable 2 "Variable" t)
          (apropos-print-doc 'customize-group-other-window 6 "Group" t)
          (apropos-print-doc 'customize-face-other-window 5 "Face" t)
          (apropos-print-doc 'widget-browse-other-window 4 "Widget" t)
          (apropos-print-doc 'apropos-describe-plist 3
-                            "Plist" nil)))))
+                            "Plist" nil))
+       (setq buffer-read-only t))))
   (prog1 apropos-accumulator
     (setq apropos-accumulator ())))    ; permit gc