Add 2010 to copyright years.
[bpt/emacs.git] / lisp / emacs-lisp / eldoc.el
index 710ff82..961d576 100644 (file)
@@ -1,7 +1,7 @@
 ;;; eldoc.el --- show function arglist or variable docstring in echo area
 
 ;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;;   2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 ;; Author: Noah Friedman <friedman@splode.com>
 ;; Maintainer: friedman@splode.com
@@ -41,7 +41,7 @@
 ;;      (add-hook 'lisp-interaction-mode-hook 'turn-on-eldoc-mode)
 ;;      (add-hook 'ielm-mode-hook 'turn-on-eldoc-mode)
 
-;; Major modes for other languages may use Eldoc by defining an
+;; Major modes for other languages may use ElDoc by defining an
 ;; appropriate function as the buffer-local value of
 ;; `eldoc-documentation-function'.
 
@@ -55,7 +55,7 @@
   :group 'extensions)
 
 (defcustom eldoc-idle-delay 0.50
-  "*Number of seconds of idle time to wait before printing.
+  "Number of seconds of idle time to wait before printing.
 If user input arrives before this interval of time has elapsed after the
 last input, no documentation will be printed.
 
@@ -64,8 +64,8 @@ If this variable is set to 0, no idle time is required."
   :group 'eldoc)
 
 ;;;###autoload
-(defcustom eldoc-minor-mode-string " ElDoc"
-  "*String to display in mode line when Eldoc Mode is enabled; nil for none."
+(defcustom eldoc-minor-mode-string (purecopy " ElDoc")
+  "String to display in mode line when ElDoc Mode is enabled; nil for none."
   :type '(choice string (const :tag "None" nil))
   :group 'eldoc)
 
@@ -73,14 +73,17 @@ If this variable is set to 0, no idle time is required."
   "Case to display argument names of functions, as a symbol.
 This has two preferred values: `upcase' or `downcase'.
 Actually, any name of a function which takes a string as an argument and
-returns another string is acceptable."
+returns another string is acceptable.
+
+Note that if `eldoc-documentation-function' is non-nil, this variable
+has no effect, unless the function handles it explicitly."
   :type '(radio (function-item upcase)
                (function-item downcase)
                 function)
   :group 'eldoc)
 
 (defcustom eldoc-echo-area-use-multiline-p 'truncate-sym-name-if-fit
-  "*Allow long eldoc messages to resize echo area display.
+  "Allow long ElDoc messages to resize echo area display.
 If value is t, never attempt to truncate messages; complete symbol name
 and function arglist or 1-line variable documentation will be displayed
 even if echo area must be resized to fit.
@@ -92,7 +95,10 @@ former case.
 
 If value is nil, messages are always truncated to fit in a single line of
 display in the echo area.  Function or variable symbol name may be
-truncated to make more of the arglist or documentation string visible."
+truncated to make more of the arglist or documentation string visible.
+
+Note that if `eldoc-documentation-function' is non-nil, this variable
+has no effect, unless the function handles it explicitly."
   :type '(radio (const :tag "Always" t)
                 (const :tag "Never" nil)
                 (const :tag "Yes, but truncate symbol names if it will\
@@ -101,14 +107,15 @@ truncated to make more of the arglist or documentation string visible."
 
 (defface eldoc-highlight-function-argument
   '((t (:inherit bold)))
-  "Face used for the argument at point in a function's argument list."
+  "Face used for the argument at point in a function's argument list.
+Note that if `eldoc-documentation-function' is non-nil, this face
+has no effect, unless the function handles it explicitly."
   :group 'eldoc)
 
 ;;; No user options below here.
 
 (defvar eldoc-message-commands-table-size 31
-  "This is used by `eldoc-add-command' to initialize `eldoc-message-commands'
-as an obarray.
+  "Used by `eldoc-add-command' to initialize `eldoc-message-commands' obarray.
 It should probably never be necessary to do so, but if you
 choose to increase the number of buckets, you must do so before loading
 this file since the obarray is initialized at load time.
@@ -117,22 +124,24 @@ Remember to keep it a prime number to improve hash performance.")
 (defconst eldoc-message-commands
   (make-vector eldoc-message-commands-table-size 0)
   "Commands after which it is appropriate to print in the echo area.
-Eldoc does not try to print function arglists, etc. after just any command,
+ElDoc does not try to print function arglists, etc., after just any command,
 because some commands print their own messages in the echo area and these
 functions would instantly overwrite them.  But `self-insert-command' as well
 as most motion commands are good candidates.
 This variable contains an obarray of symbols; do not manipulate it
 directly.  Instead, use `eldoc-add-command' and `eldoc-remove-command'.")
 
+;; Not a constant.
 (defconst eldoc-last-data (make-vector 3 nil)
   "Bookkeeping; elements are as follows:
   0 - contains the last symbol read from the buffer.
   1 - contains the string last displayed in the echo area for variables,
       or argument string for functions.
   2 - 'function if function args, 'variable if variable documentation.")
+
 (defvar eldoc-last-message nil)
 
-(defvar eldoc-timer nil "eldoc's timer object.")
+(defvar eldoc-timer nil "ElDoc's timer object.")
 
 (defvar eldoc-current-idle-delay eldoc-idle-delay
   "Idle time delay currently in use by timer.
@@ -241,8 +250,13 @@ It should return nil if there's no doc appropriate for the context.
 Typically doc is returned if point is on a function-like name or in its
 arg list.
 
+The result is used as is, so the function must explicitly handle
+the variables `eldoc-argument-case' and `eldoc-echo-area-use-multiline-p',
+and the face `eldoc-highlight-function-argument', if they are to have any
+effect.
+
 This variable is expected to be made buffer-local by modes (other than
-Emacs Lisp mode) that support Eldoc.")
+Emacs Lisp mode) that support ElDoc.")
 
 (defun eldoc-print-current-symbol-info ()
   (condition-case err
@@ -275,18 +289,21 @@ or elsewhere, return a 1-line docstring.  Calls the functions
 `eldoc-highlight-function-argument' to format the result.  The
 former calls `eldoc-argument-case'; the latter gives the
 function name `font-lock-function-name-face', and optionally
-highlights argument number INDEX. "
-  (let (args doc)
+highlights argument number INDEX."
+  (let (args doc advertised)
     (cond ((not (and sym (symbolp sym) (fboundp sym))))
          ((and (eq sym (aref eldoc-last-data 0))
                (eq 'function (aref eldoc-last-data 2)))
           (setq doc (aref eldoc-last-data 1)))
+         ((listp (setq advertised (gethash (indirect-function sym)
+                                           advertised-signature-table t)))
+          (setq args advertised))
          ((setq doc (help-split-fundoc (documentation sym t) sym))
           (setq args (car doc))
           ;; Remove any enclosing (), since e-function-argstring adds them.
           (string-match "\\`[^ )]* ?" args)
           (setq args (substring args (match-end 0)))
-          (if (string-match ")\\'" args)
+          (if (string-match-p ")\\'" args)
               (setq args (substring args 0 -1))))
          (t
           (setq args (help-function-arglist sym))))
@@ -324,7 +341,7 @@ In the absence of INDEX, just call `eldoc-docstring-format-sym-doc'."
                     ;; All the rest arguments are the same.
                     (setq index 1))
                    ((string= argument "&optional"))
-                   ((string-match "\\.\\.\\.$" argument)
+                   ((string-match-p "\\.\\.\\.$" argument)
                     (setq index 0))
                    (t
                     (setq index (1- index))))))
@@ -367,7 +384,9 @@ In the absence of INDEX, just call `eldoc-docstring-format-sym-doc'."
   (and (stringp doc)
        (substitute-command-keys
         (save-match-data
-          (let ((start (if (string-match "^\\*" doc) (match-end 0) 0)))
+         ;; Don't use "^" in the regexp below since it may match
+         ;; anywhere in the doc-string.
+         (let ((start (if (string-match "\\`\\*" doc) (match-end 0) 0)))
             (cond ((string-match "\n" doc)
                    (substring doc start (match-beginning 0)))
                   ((zerop start) doc)
@@ -475,10 +494,10 @@ ARGLIST is either a string, or a list of strings or symbols."
   "Apply `eldoc-argument-case' to each word in ARGSTRING.
 The words \"&rest\", \"&optional\" are returned unchanged."
   (mapconcat (lambda (s)
-              (if (member s '("&optional" "&rest"))
+              (if (string-match-p "\\`(?&\\(?:optional\\|rest\\))?\\'" s)
                   s
                 (funcall eldoc-argument-case s)))
-            (split-string argstring "[][ ()]+" t) " "))
+            (split-string argstring) " "))
 
 \f
 ;; When point is in a sexp, the function args are not reprinted in the echo