Change default-frame-alist and menu/tool-bar-mode interaction (Bug#2249).
[bpt/emacs.git] / lisp / help-fns.el
index ba5c32d..86e9411 100644 (file)
@@ -1,7 +1,7 @@
 ;;; help-fns.el --- Complex help functions
 
-;; Copyright (C) 1985, 1986, 1993, 1994, 1998, 1999, 2000, 2001,
-;;   2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+;; Copyright (C) 1985, 1986, 1993, 1994, 1998, 1999, 2000, 2001, 2002,
+;;   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
 ;;   Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
@@ -32,8 +32,6 @@
 
 ;;; Code:
 
-(require 'help-mode)
-
 ;; Functions
 
 ;;;###autoload
@@ -52,7 +50,8 @@
               fn (intern val)))))
   (if (null function)
       (message "You didn't specify a function")
-    (help-setup-xref (list #'describe-function function) (interactive-p))
+    (help-setup-xref (list #'describe-function function)
+                    (called-interactively-p 'interactive))
     (save-excursion
       (with-help-window (help-buffer)
        (prin1 function)
@@ -158,15 +157,18 @@ KIND should be `var' for a variable or `subr' for a subroutine."
            (concat "src/" file)
          file)))))
 
-(defun help-default-arg-highlight (arg)
-  "Default function to highlight arguments in *Help* buffers.
-It returns ARG in face `help-argument-name'; ARG is also
-downcased if it displays differently than the default
-face (according to `face-differs-from-default-p')."
-  (propertize (if (face-differs-from-default-p 'help-argument-name)
-                  (downcase arg)
-                arg)
-              'face 'help-argument-name))
+(defcustom help-downcase-arguments nil
+  "If non-nil, argument names in *Help* buffers are downcased."
+  :type 'boolean
+  :group 'help
+  :version "23.2")
+
+(defun help-highlight-arg (arg)
+  "Highlight ARG as an argument name for a *Help* buffer.
+Return ARG in face `help-argument-name'; ARG is also downcased
+if the variable `help-downcase-arguments' is non-nil."
+  (propertize (if help-downcase-arguments (downcase arg) arg)
+             'face 'help-argument-name))
 
 (defun help-do-arg-highlight (doc args)
   (with-syntax-table (make-syntax-table emacs-lisp-mode-syntax-table)
@@ -184,7 +186,7 @@ face (according to `face-differs-from-default-p')."
                          "\\(?:-[a-z0-9-]+\\)?"  ; for ARG-xxx, ARG-n
                          "\\(?:-[{([<`\"].*?\\)?"; for ARG-{x}, (x), <x>, [x], `x'
                          "\\>")                  ; end of word
-                 (help-default-arg-highlight arg)
+                 (help-highlight-arg arg)
                  doc t t 1)))))
 
 (defun help-highlight-arguments (usage doc &rest args)
@@ -267,8 +269,9 @@ suitable file is found, return nil."
                   "^;;; Generated autoloads from \\(.*\\)" nil t)
              (setq file-name
                    (locate-file
-                    (match-string-no-properties 1)
-                    load-path nil 'readable))))))))
+                    (file-name-sans-extension
+                     (match-string-no-properties 1))
+                    load-path '(".el" ".elc") 'readable))))))))
 
     (cond
      ((and (not file-name) (subrp type))
@@ -323,8 +326,6 @@ suitable file is found, return nil."
        (and src-file (file-readable-p src-file) src-file))))))
 
 (declare-function ad-get-advice-info "advice" (function))
-(declare-function function-overload-p "mode-local")
-(declare-function overload-docstring-extension function "mode-local")
 
 ;;;###autoload
 (defun describe-function-1 (function)
@@ -452,14 +453,31 @@ suitable file is found, return nil."
            (fill-region-as-paragraph pt2 (point))
            (unless (looking-back "\n\n")
              (terpri)))))
-      (let* ((arglist (help-function-arglist def))
+      ;; Note that list* etc do not get this property until
+      ;; cl-hack-byte-compiler runs, after bytecomp is loaded.
+      (when (and (symbolp function)
+                 (eq (get function 'byte-compile)
+                     'cl-byte-compile-compiler-macro))
+       (princ "This function has a compiler macro")
+       (let ((lib (get function 'compiler-macro-file)))
+         (when (stringp lib)
+           (princ (format " in `%s'" lib))
+           (with-current-buffer standard-output
+             (save-excursion
+               (re-search-backward "`\\([^`']+\\)'" nil t)
+               (help-xref-button 1 'help-function-cmacro function lib)))))
+       (princ ".\n\n"))
+      (let* ((advertised (gethash def advertised-signature-table t))
+            (arglist (if (listp advertised)
+                         advertised (help-function-arglist def)))
             (doc (documentation function))
             (usage (help-split-fundoc doc function)))
        (with-current-buffer standard-output
          ;; If definition is a keymap, skip arglist note.
          (unless (keymapp function)
+           (if usage (setq doc (cdr usage)))
            (let* ((use (cond
-                        (usage (setq doc (cdr usage)) (car usage))
+                        ((and usage (not (listp advertised))) (car usage))
                         ((listp arglist)
                          (format "%S" (help-make-usage function arglist)))
                         ((stringp arglist) arglist)
@@ -482,8 +500,6 @@ suitable file is found, return nil."
                (insert (car high) "\n")
                (fill-region fill-begin (point)))
              (setq doc (cdr high))))
-
-         ;; Note if function is obsolete.
          (let* ((obsolete (and
                            ;; function might be a lambda construct.
                            (symbolp function)
@@ -496,16 +512,9 @@ suitable file is found, return nil."
              (insert (cond ((stringp use) (concat ";\n" use))
                            (use (format ";\nuse `%s' instead." use))
                            (t "."))
-                     "\n")))
-
-         ;; Note if function is overloadable (see the `mode-local'
-         ;; package in CEDET).
-         (when (and (featurep 'mode-local)
-                    (symbolp function)
-                    (function-overload-p function))
-           (insert (overload-docstring-extension function) "\n"))
-
-         (insert "\n" (or doc "Not documented.")))))))
+                     "\n"))
+           (insert "\n"
+                   (or doc "Not documented."))))))))
 
 \f
 ;; Variables
@@ -599,7 +608,7 @@ it is displayed along with the global value."
                (setq val (symbol-value variable)
                      locus (variable-binding-locus variable)))))
          (help-setup-xref (list #'describe-variable variable buffer)
-                          (interactive-p))
+                          (called-interactively-p 'interactive))
          (with-help-window (help-buffer)
            (with-current-buffer buffer
              (prin1 variable)
@@ -780,8 +789,7 @@ file local variable.\n")
                  (terpri)
                  (princ output))))
 
-           (save-excursion
-             (set-buffer standard-output)
+           (with-current-buffer standard-output
              ;; Return the text we displayed.
              (buffer-string))))))))
 
@@ -793,7 +801,8 @@ The descriptions are inserted in a help buffer, which is then displayed.
 BUFFER defaults to the current buffer."
   (interactive)
   (setq buffer (or buffer (current-buffer)))
-  (help-setup-xref (list #'describe-syntax buffer) (interactive-p))
+  (help-setup-xref (list #'describe-syntax buffer)
+                  (called-interactively-p 'interactive))
   (with-help-window (help-buffer)
     (let ((table (with-current-buffer buffer (syntax-table))))
       (with-current-buffer standard-output
@@ -818,7 +827,8 @@ If BUFFER is non-nil, then describe BUFFER's category table instead.
 BUFFER should be a buffer or a buffer name."
   (interactive)
   (setq buffer (or buffer (current-buffer)))
-  (help-setup-xref (list #'describe-categories buffer) (interactive-p))
+  (help-setup-xref (list #'describe-categories buffer)
+                  (called-interactively-p 'interactive))
   (with-help-window (help-buffer)
     (let* ((table (with-current-buffer buffer (category-table)))
           (docs (char-table-extra-slot table 0)))