# HG changeset patch # User Stefan Monnier # Date 1037748774 0 # Node ID 5a25c61f2c8bf2725d39144fe476826fe29aecba # Parent b1949eb6d638f85f43ed42ba2477a4f65f40f1d3 (eldoc-print-current-symbol-info): Turn errors into messages so they don't get ignored. (eldoc-get-fnsym-args-string): Use help-split-fundoc. (eldoc-beginning-of-sexp): Simplify. (eldoc-function-arglist): Remove. (eldoc-function-argstring): Use help-function-arglist instead. (eldoc-function-argstring-from-docstring-method-table) (eldoc-function-argstring-from-docstring): Remove. diff -r b1949eb6d638 -r 5a25c61f2c8b lisp/emacs-lisp/eldoc.el --- a/lisp/emacs-lisp/eldoc.el Tue Nov 19 18:02:07 2002 +0000 +++ b/lisp/emacs-lisp/eldoc.el Tue Nov 19 23:32:54 2002 +0000 @@ -7,7 +7,7 @@ ;; Keywords: extensions ;; Created: 1995-10-06 -;; $Id: eldoc.el,v 1.19 2001/11/16 23:58:48 monnier Exp $ +;; $Id: eldoc.el,v 1.20 2002/01/08 23:57:30 rms Exp $ ;; This file is part of GNU Emacs. @@ -47,6 +47,8 @@ ;;; Code: +(require 'help-fns) ;For fundoc-usage handling functions. + ;; Use idle timers if available in the version of emacs running. ;; Please don't change this to use `require'; this package works ;; as-is in XEmacs 19.14 and later and I am striving to maintain @@ -283,16 +285,21 @@ (defun eldoc-print-current-symbol-info () - (and (eldoc-display-message-p) - (let* ((current-symbol (eldoc-current-symbol)) - (current-fnsym (eldoc-fnsym-in-current-sexp)) - (doc (cond ((eq current-symbol current-fnsym) - (or (eldoc-get-fnsym-args-string current-fnsym) - (eldoc-get-var-docstring current-symbol))) - (t - (or (eldoc-get-var-docstring current-symbol) - (eldoc-get-fnsym-args-string current-fnsym)))))) - (eldoc-message doc)))) + (condition-case err + (and (eldoc-display-message-p) + (let* ((current-symbol (eldoc-current-symbol)) + (current-fnsym (eldoc-fnsym-in-current-sexp)) + (doc (cond + ((eq current-symbol current-fnsym) + (or (eldoc-get-fnsym-args-string current-fnsym) + (eldoc-get-var-docstring current-symbol))) + (t + (or (eldoc-get-var-docstring current-symbol) + (eldoc-get-fnsym-args-string current-fnsym)))))) + (eldoc-message doc))) + ;; This is run from post-command-hook or some idle timer thing, + ;; so we need to be careful that errors aren't ignored. + (error (message "eldoc error: %s" err)))) ;; Return a string containing the function parameter list, or 1-line ;; docstring if function is a subr and no arglist is obtainable from the @@ -306,9 +313,10 @@ ((and (eq sym (aref eldoc-last-data 0)) (eq 'function (aref eldoc-last-data 2))) (setq doc (aref eldoc-last-data 1))) - ((subrp (eldoc-symbol-function sym)) - (setq args (or (eldoc-function-argstring-from-docstring sym) - (eldoc-docstring-first-line (documentation sym t))))) + ((setq doc (help-split-fundoc (documentation sym t) sym)) + (setq args (car doc)) + (string-match "\\`[^ )]* ?" args) + (setq args (concat "(" (substring args (match-end 0))))) (t (setq args (eldoc-function-argstring sym)))) (cond (args @@ -391,7 +399,7 @@ (condition-case err (while (progn (forward-sexp -1) - (or (= (or (char-after (1- (point)))) ?\") + (or (= (char-before) ?\") (> (point) (point-min))))) (error nil)))) @@ -412,24 +420,8 @@ (error (setq defn nil)))) defn)) -(defun eldoc-function-arglist (fn) - (let* ((prelim-def (eldoc-symbol-function fn)) - (def (if (eq (car-safe prelim-def) 'macro) - (cdr prelim-def) - prelim-def)) - (arglist (cond ((null def) nil) - ((byte-code-function-p def) - (cond ((fboundp 'compiled-function-arglist) - (funcall 'compiled-function-arglist def)) - (t - (aref def 0)))) - ((eq (car-safe def) 'lambda) - (nth 1 def)) - (t t)))) - arglist)) - (defun eldoc-function-argstring (fn) - (eldoc-function-argstring-format (eldoc-function-arglist fn))) + (eldoc-function-argstring-format (help-function-arglist fn))) (defun eldoc-function-argstring-format (arglist) (cond ((not (listp arglist)) @@ -452,137 +444,6 @@ (concat "(" (mapconcat 'identity arglist " ") ")")) -;; Alist of predicate/action pairs. -;; Each member of the list is a sublist consisting of a predicate function -;; used to determine if the arglist for a function can be found using a -;; certain pattern, and a function which returns the actual arglist from -;; that docstring. -;; -;; The order in this table is significant, since later predicates may be -;; more general than earlier ones. -;; -;; Compiler note for Emacs/XEmacs versions which support dynamic loading: -;; these functions will be compiled to bytecode, but can't be lazy-loaded -;; even if you set byte-compile-dynamic; to do that would require making -;; them named top-level defuns, which is not particularly desirable either. -(defvar eldoc-function-argstring-from-docstring-method-table - (list - ;; Try first searching for args starting with symbol name. - ;; This is to avoid matching parenthetical remarks in e.g. sit-for. - (list (function (lambda (doc fn) - (string-match (format "^(%s[^\n)]*)$" fn) doc))) - (function (lambda (doc) - ;; end does not include trailing ")" sequence. - (let ((end (- (match-end 0) 1))) - (if (string-match " +" doc (match-beginning 0)) - (substring doc (match-end 0) end) - ""))))) - - ;; Try again not requiring this symbol name in the docstring. - ;; This will be the case when looking up aliases. - (list (function (lambda (doc fn) - ;; save-restriction has a pathological docstring in - ;; Emacs/XEmacs 19. - (and (not (eq fn 'save-restriction)) - (string-match "^([^\n)]+)$" doc)))) - (function (lambda (doc) - ;; end does not include trailing ")" sequence. - (let ((end (- (match-end 0) 1))) - (and (string-match " +" doc (match-beginning 0)) - (substring doc (match-end 0) end)))))) - - ;; Emacs subr docstring style: - ;; (fn arg1 arg2 ...): description... - (list (function (lambda (doc fn) - (string-match "^([^\n)]+):" doc))) - (function (lambda (doc) - ;; end does not include trailing "):" sequence. - (let ((end (- (match-end 0) 2))) - (and (string-match " +" doc (match-beginning 0)) - (substring doc (match-end 0) end)))))) - - ;; XEmacs subr docstring style: - ;; "arguments: (arg1 arg2 ...) - (list (function (lambda (doc fn) - (string-match "^arguments: (\\([^\n)]+\\))" doc))) - (function (lambda (doc) - ;; also skip leading paren, but the first word is - ;; actually an argument, not the function name. - (substring doc (match-beginning 1) (match-end 1))))) - - ;; This finds the argstring for `condition-case'. Any others? - (list (function (lambda (doc fn) - (string-match - (format "^Usage looks like \\((%s[^\n)]*)\\)\\.$" fn) - doc))) - (function (lambda (doc) - ;; end does not include trailing ")" sequence. - (let ((end (- (match-end 1) 1))) - (and (string-match " +" doc (match-beginning 1)) - (substring doc (match-end 0) end)))))) - - ;; This finds the argstring for `setq-default'. Any others? - (list (function (lambda (doc fn) - (string-match (format "^[ \t]+\\((%s[^\n)]*)\\)$" fn) - doc))) - (function (lambda (doc) - ;; end does not include trailing ")" sequence. - (let ((end (- (match-end 1) 1))) - (and (string-match " +" doc (match-beginning 1)) - (substring doc (match-end 0) end)))))) - - ;; This finds the argstring for `start-process'. Any others? - (list (function (lambda (doc fn) - (string-match "^Args are +\\([^\n]+\\)$" doc))) - (function (lambda (doc) - (substring doc (match-beginning 1) (match-end 1))))) - - ;; These common subrs don't have arglists in their docstrings. So cheat. - (list (function (lambda (doc fn) - (memq fn '(and or list + -)))) - (function (lambda (doc) - ;; The value nil is a placeholder; otherwise, the - ;; following string may be compiled as a docstring, - ;; and not a return value for the function. - ;; In interpreted lisp form they are - ;; indistinguishable; it only matters for compiled - ;; forms. - nil - "&rest args"))) - )) - -(defun eldoc-function-argstring-from-docstring (fn) - (let ((docstring (documentation fn 'raw)) - (table eldoc-function-argstring-from-docstring-method-table) - (doc nil) - (doclist nil)) - (save-match-data - (while table - (cond ((funcall (car (car table)) docstring fn) - (setq doc (funcall (car (cdr (car table))) docstring)) - (setq table nil)) - (t - (setq table (cdr table))))) - - (cond ((not (stringp doc)) - nil) - ((string-match "&" doc) - (let ((p 0) - (l (length doc))) - (while (< p l) - (cond ((string-match "[ \t\n]+" doc p) - (setq doclist - (cons (substring doc p (match-beginning 0)) - doclist)) - (setq p (match-end 0))) - (t - (setq doclist (cons (substring doc p) doclist)) - (setq p l)))) - (eldoc-function-argstring-format (nreverse doclist)))) - (t - (concat "(" (funcall eldoc-argument-case doc) ")")))))) - - ;; When point is in a sexp, the function args are not reprinted in the echo ;; area after every possible interactive command because some of them print ;; their own messages in the echo area; the eldoc functions would instantly