annotate lisp/emacs-lisp/eldoc.el @ 26370:5f52cc1417ab

Use block statements in cases and declare v1 and v2 locally there. Rearrange case statements so that thos most frequently executed come first. Avoid goto's in frequently executed cases.
author Gerd Moellmann <gerd@gnu.org>
date Sun, 07 Nov 1999 13:06:59 +0000
parents 58e75110c086
children 38f19553e93d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
1 ;;; eldoc.el --- show function arglist or variable docstring in echo area
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
2
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
3 ;; Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
4
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
5 ;; Author: Noah Friedman <friedman@splode.com>
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
6 ;; Maintainer: friedman@splode.com
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
7 ;; Keywords: extensions
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
8 ;; Created: 1995-10-06
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
9
23586
58e75110c086 (eldoc-argument-case): Fix customize type.
Andreas Schwab <schwab@suse.de>
parents: 23283
diff changeset
10 ;; $Id: eldoc.el,v 1.15 1998/09/19 02:15:26 friedman Exp $
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
11
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
12 ;; This file is part of GNU Emacs.
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
13
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
14 ;; GNU Emacs is free software; you can redistribute it and/or modify
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
15 ;; it under the terms of the GNU General Public License as published by
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
16 ;; the Free Software Foundation; either version 2, or (at your option)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
17 ;; any later version.
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
18
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
19 ;; GNU Emacs is distributed in the hope that it will be useful,
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
22 ;; GNU General Public License for more details.
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
23
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
24 ;; You should have received a copy of the GNU General Public License
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
25 ;; along with GNU Emacs; see the file COPYING. If not, write to the
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
26 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
27 ;; Boston, MA 02111-1307, USA.
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
28
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
29 ;;; Commentary:
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
30
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
31 ;; This program was inspired by the behavior of the "mouse documentation
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
32 ;; window" on many Lisp Machine systems; as you type a function's symbol
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
33 ;; name as part of a sexp, it will print the argument list for that
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
34 ;; function. Behavior is not identical; for example, you need not actually
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
35 ;; type the function name, you need only move point around in a sexp that
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
36 ;; calls it. Also, if point is over a documented variable, it will print
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
37 ;; the one-line documentation for that variable instead, to remind you of
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
38 ;; that variable's meaning.
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
39
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
40 ;; One useful way to enable this minor mode is to put the following in your
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
41 ;; .emacs:
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
42 ;;
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
43 ;; (autoload 'turn-on-eldoc-mode "eldoc" nil t)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
44 ;; (add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
45 ;; (add-hook 'lisp-interaction-mode-hook 'turn-on-eldoc-mode)
16975
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
46 ;; (add-hook 'ielm-mode-hook 'turn-on-eldoc-mode)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
47
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
48 ;;; Code:
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
49
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
50 ;; Use idle timers if available in the version of emacs running.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
51 ;; Please don't change this to use `require'; this package works as-is in
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
52 ;; XEmacs (which doesn't have timer.el as of 19.14), and I would like to
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
53 ;; maintain compatibility with that since I must use it sometimes. --Noah
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
54 (or (featurep 'timer)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
55 (load "timer" t))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
56
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
57 (defgroup eldoc nil
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
58 "Show function arglist or variable docstring in echo area."
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
59 :group 'extensions)
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
60
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
61 ;;;###autoload
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
62 (defcustom eldoc-mode nil
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
63 "*If non-nil, show the defined parameters for the elisp function near point.
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
64
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
65 For the emacs lisp function at the beginning of the sexp which point is
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
66 within, show the defined parameters for the function in the echo area.
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
67 This information is extracted directly from the function or macro if it is
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
68 in pure lisp. If the emacs function is a subr, the parameters are obtained
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
69 from the documentation string if possible.
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
70
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
71 If point is over a documented variable, print that variable's docstring
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
72 instead.
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
73
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
74 This variable is buffer-local."
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
75 :type 'boolean
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
76 :group 'eldoc)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
77 (make-variable-buffer-local 'eldoc-mode)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
78
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
79 (defcustom eldoc-idle-delay 0.50
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
80 "*Number of seconds of idle time to wait before printing.
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
81 If user input arrives before this interval of time has elapsed after the
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
82 last input, no documentation will be printed.
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
83
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
84 If this variable is set to 0, no idle time is required."
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
85 :type 'number
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
86 :group 'eldoc)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
87
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
88 (defcustom eldoc-minor-mode-string " ElDoc"
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
89 "*String to display in mode line when Eldoc Mode is enabled."
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
90 :type 'string
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
91 :group 'eldoc)
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
92
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
93 ;; Put this minor mode on the global minor-mode-alist.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
94 (or (assq 'eldoc-mode (default-value 'minor-mode-alist))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
95 (setq-default minor-mode-alist
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
96 (append (default-value 'minor-mode-alist)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
97 '((eldoc-mode eldoc-minor-mode-string)))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
98
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
99 (defcustom eldoc-argument-case 'upcase
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
100 "Case to display argument names of functions, as a symbol.
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
101 This has two preferred values: `upcase' or `downcase'.
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
102 Actually, any name of a function which takes a string as an argument and
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
103 returns another string is acceptable."
23586
58e75110c086 (eldoc-argument-case): Fix customize type.
Andreas Schwab <schwab@suse.de>
parents: 23283
diff changeset
104 :type '(radio function
58e75110c086 (eldoc-argument-case): Fix customize type.
Andreas Schwab <schwab@suse.de>
parents: 23283
diff changeset
105 (function-item upcase)
58e75110c086 (eldoc-argument-case): Fix customize type.
Andreas Schwab <schwab@suse.de>
parents: 23283
diff changeset
106 (function-item downcase))
17445
f2db4e8bb6ed Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17253
diff changeset
107 :group 'eldoc)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
108
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
109 ;; No user options below here.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
110
17920
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
111 ;; Commands after which it is appropriate to print in the echo area.
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
112 ;; Eldoc does not try to print function arglists, etc. after just any command,
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
113 ;; because some commands print their own messages in the echo area and these
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
114 ;; functions would instantly overwrite them. But self-insert-command as well
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
115 ;; as most motion commands are good candidates.
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
116 ;; This variable contains an obarray of symbols; do not manipulate it
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
117 ;; directly. Instead, use `eldoc-add-command' and `eldoc-remove-command'.
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
118 (defvar eldoc-message-commands nil)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
119
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
120 ;; This is used by eldoc-add-command to initialize eldoc-message-commands
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
121 ;; as an obarray.
17920
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
122 ;; It should probably never be necessary to do so, but if you
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
123 ;; choose to increase the number of buckets, you must do so before loading
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
124 ;; this file since the obarray is initialized at load time.
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
125 ;; Remember to keep it a prime number to improve hash performance.
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
126 (defvar eldoc-message-commands-table-size 31)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
127
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
128 ;; Bookkeeping; elements are as follows:
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
129 ;; 0 - contains the last symbol read from the buffer.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
130 ;; 1 - contains the string last displayed in the echo area for that
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
131 ;; symbol, so it can be printed again if necessary without reconsing.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
132 ;; 2 - 'function if function args, 'variable if variable documentation.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
133 (defvar eldoc-last-data (make-vector 3 nil))
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
134 (defvar eldoc-last-message nil)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
135
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
136 ;; Idle timers are supported in Emacs 19.31 and later.
17920
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
137 (defvar eldoc-use-idle-timer-p (fboundp 'run-with-idle-timer))
13591
b2fb0109006d (eldoc-minor-mode-string): New variable.
Noah Friedman <friedman@splode.com>
parents: 13532
diff changeset
138
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
139 ;; eldoc's timer object, if using idle timers
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
140 (defvar eldoc-timer nil)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
141
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
142 ;; idle time delay currently in use by timer.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
143 ;; This is used to determine if eldoc-idle-delay is changed by the user.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
144 (defvar eldoc-current-idle-delay eldoc-idle-delay)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
145
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
146
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
147 ;;;###autoload
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
148 (defun eldoc-mode (&optional prefix)
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
149 "*Enable or disable eldoc mode.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
150 See documentation for the variable of the same name for more details.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
151
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
152 If called interactively with no prefix argument, toggle current condition
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
153 of the mode.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
154 If called with a positive or negative prefix argument, enable or disable
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
155 the mode, respectively."
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
156 (interactive "P")
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
157 (setq eldoc-last-message nil)
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
158 (cond (eldoc-use-idle-timer-p
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
159 (add-hook 'post-command-hook 'eldoc-schedule-timer)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
160 (add-hook 'pre-command-hook 'eldoc-pre-command-refresh-echo-area))
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
161 (t
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
162 ;; Use post-command-idle-hook if defined, otherwise use
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
163 ;; post-command-hook. The former is only proper to use in Emacs
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
164 ;; 19.30; that is the first version in which it appeared, but it
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
165 ;; was obsolesced by idle timers in Emacs 19.31.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
166 (add-hook (if (boundp 'post-command-idle-hook)
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
167 'post-command-idle-hook
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
168 'post-command-hook)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
169 'eldoc-print-current-symbol-info)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
170 ;; quick and dirty hack for seeing if this is XEmacs
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
171 (and (fboundp 'display-message)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
172 (add-hook 'pre-command-hook
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
173 'eldoc-pre-command-refresh-echo-area))))
15671
27e6b6f4f1b6 (eldoc-mode): Toggle eldoc-mode if no prefix given.
Noah Friedman <friedman@splode.com>
parents: 13647
diff changeset
174 (setq eldoc-mode (if prefix
27e6b6f4f1b6 (eldoc-mode): Toggle eldoc-mode if no prefix given.
Noah Friedman <friedman@splode.com>
parents: 13647
diff changeset
175 (>= (prefix-numeric-value prefix) 0)
27e6b6f4f1b6 (eldoc-mode): Toggle eldoc-mode if no prefix given.
Noah Friedman <friedman@splode.com>
parents: 13647
diff changeset
176 (not eldoc-mode)))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
177 (and (interactive-p)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
178 (if eldoc-mode
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
179 (message "eldoc-mode is enabled")
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
180 (message "eldoc-mode is disabled")))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
181 eldoc-mode)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
182
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
183 ;;;###autoload
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
184 (defun turn-on-eldoc-mode ()
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
185 "Unequivocally turn on eldoc-mode (see variable documentation)."
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
186 (interactive)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
187 (eldoc-mode 1))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
188
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
189
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
190 ;; Idle timers are part of Emacs 19.31 and later.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
191 (defun eldoc-schedule-timer ()
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
192 (or (and eldoc-timer
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
193 (memq eldoc-timer timer-idle-list))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
194 (setq eldoc-timer
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
195 (run-with-idle-timer eldoc-idle-delay t
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
196 'eldoc-print-current-symbol-info)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
197
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
198 ;; If user has changed the idle delay, update the timer.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
199 (cond ((not (= eldoc-idle-delay eldoc-current-idle-delay))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
200 (setq eldoc-current-idle-delay eldoc-idle-delay)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
201 (timer-set-idle-time eldoc-timer eldoc-idle-delay t))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
202
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
203 (defun eldoc-message (&rest args)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
204 (let ((omessage eldoc-last-message))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
205 (cond ((eq (car args) eldoc-last-message))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
206 ((or (null args)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
207 (null (car args)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
208 (setq eldoc-last-message nil))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
209 ;; If only one arg, no formatting to do so put it in
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
210 ;; eldoc-last-message so eq test above might succeed on
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
211 ;; subsequent calls.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
212 ((null (cdr args))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
213 (setq eldoc-last-message (car args)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
214 (t
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
215 (setq eldoc-last-message (apply 'format args))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
216 ;; In emacs 19.29 and later, and XEmacs 19.13 and later, all messages
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
217 ;; are recorded in a log. Do not put eldoc messages in that log since
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
218 ;; they are Legion.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
219 (cond ((fboundp 'display-message)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
220 ;; XEmacs 19.13 way of preventing log messages.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
221 (cond (eldoc-last-message
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
222 (display-message 'no-log eldoc-last-message))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
223 (omessage
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
224 (clear-message 'no-log))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
225 (t
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
226 ;; Emacs way of preventing log messages.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
227 (let ((message-log-max nil))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
228 (cond (eldoc-last-message
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
229 (message "%s" eldoc-last-message))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
230 (omessage
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
231 (message nil)))))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
232 eldoc-last-message)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
233
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
234 ;; This function goes on pre-command-hook for XEmacs or when using idle
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
235 ;; timers in Emacs. Motion commands clear the echo area for some reason,
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
236 ;; which make eldoc messages flicker or disappear just before motion
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
237 ;; begins. This function reprints the last eldoc message immediately
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
238 ;; before the next command executes, which does away with the flicker.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
239 ;; This doesn't seem to be required for Emacs 19.28 and earlier.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
240 (defun eldoc-pre-command-refresh-echo-area ()
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
241 (and eldoc-last-message
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
242 (if (eldoc-display-message-no-interference-p)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
243 (eldoc-message eldoc-last-message)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
244 (setq eldoc-last-message nil))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
245
16975
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
246 ;; Decide whether now is a good time to display a message.
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
247 (defun eldoc-display-message-p ()
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
248 (and (eldoc-display-message-no-interference-p)
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
249 (cond (eldoc-use-idle-timer-p
16975
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
250 ;; If this-command is non-nil while running via an idle
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
251 ;; timer, we're still in the middle of executing a command,
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
252 ;; e.g. a query-replace where it would be annoying to
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
253 ;; overwrite the echo area.
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
254 (and (not this-command)
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
255 (symbolp last-command)
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
256 (intern-soft (symbol-name last-command)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
257 eldoc-message-commands)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
258 (t
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
259 ;; If we don't have idle timers, this function is
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
260 ;; running on post-command-hook directly; that means the
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
261 ;; user's last command is still on `this-command', and we
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
262 ;; must wait briefly for input to see whether to do display.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
263 (and (symbolp this-command)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
264 (intern-soft (symbol-name this-command)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
265 eldoc-message-commands)
16975
188c4da9bf5d (eldoc-display-message-p): New function.
Noah Friedman <friedman@splode.com>
parents: 16969
diff changeset
266 (sit-for eldoc-idle-delay))))))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
267
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
268 (defun eldoc-display-message-no-interference-p ()
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
269 (and eldoc-mode
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
270 (not executing-kbd-macro)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
271 ;; Having this mode operate in an active minibuffer/echo area causes
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
272 ;; interference with what's going on there.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
273 (not cursor-in-echo-area)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
274 (not (eq (selected-window) (minibuffer-window)))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
275
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
276
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
277 (defun eldoc-print-current-symbol-info ()
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
278 (and (eldoc-display-message-p)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
279 (let* ((current-symbol (eldoc-current-symbol))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
280 (current-fnsym (eldoc-fnsym-in-current-sexp))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
281 (doc (cond ((eq current-symbol current-fnsym)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
282 (or (eldoc-get-fnsym-args-string current-fnsym)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
283 (eldoc-get-var-docstring current-symbol)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
284 (t
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
285 (or (eldoc-get-var-docstring current-symbol)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
286 (eldoc-get-fnsym-args-string current-fnsym))))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
287 (eldoc-message doc))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
288
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
289 ;; Return a string containing the function parameter list, or 1-line
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
290 ;; docstring if function is a subr and no arglist is obtainable from the
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
291 ;; docstring or elsewhere.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
292 (defun eldoc-get-fnsym-args-string (sym)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
293 (let ((args nil)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
294 (doc nil))
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
295 (cond ((not (and sym
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
296 (symbolp sym)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
297 (fboundp sym))))
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
298 ((and (eq sym (aref eldoc-last-data 0))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
299 (eq 'function (aref eldoc-last-data 2)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
300 (setq doc (aref eldoc-last-data 1)))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
301 ((subrp (eldoc-symbol-function sym))
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
302 (setq args (or (eldoc-function-argstring-from-docstring sym)
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
303 (eldoc-docstring-first-line (documentation sym t)))))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
304 (t
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
305 (setq args (eldoc-function-argstring sym))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
306 (cond (args
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
307 (setq doc (eldoc-docstring-format-sym-doc sym args))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
308 (eldoc-last-data-store sym doc 'function)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
309 doc))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
310
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
311 ;; Return a string containing a brief (one-line) documentation string for
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
312 ;; the variable.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
313 (defun eldoc-get-var-docstring (sym)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
314 (cond ((and (eq sym (aref eldoc-last-data 0))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
315 (eq 'variable (aref eldoc-last-data 2)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
316 (aref eldoc-last-data 1))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
317 (t
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
318 (let ((doc (documentation-property sym 'variable-documentation t)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
319 (cond (doc
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
320 (setq doc (eldoc-docstring-format-sym-doc
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
321 sym (eldoc-docstring-first-line doc)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
322 (eldoc-last-data-store sym doc 'variable)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
323 doc))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
324
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
325 (defun eldoc-last-data-store (symbol doc type)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
326 (aset eldoc-last-data 0 symbol)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
327 (aset eldoc-last-data 1 doc)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
328 (aset eldoc-last-data 2 type))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
329
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
330 ;; Note that any leading `*' in the docstring (which indicates the variable
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
331 ;; is a user option) is removed.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
332 (defun eldoc-docstring-first-line (doc)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
333 (and (stringp doc)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
334 (substitute-command-keys
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
335 (save-match-data
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
336 (let ((start (if (string-match "^\\*" doc) (match-end 0) 0)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
337 (cond ((string-match "\n" doc)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
338 (substring doc start (match-beginning 0)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
339 ((zerop start) doc)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
340 (t (substring doc start))))))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
341
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
342 ;; If the entire line cannot fit in the echo area, the symbol name may be
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
343 ;; truncated or eliminated entirely from the output to make room for the
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
344 ;; description.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
345 (defun eldoc-docstring-format-sym-doc (sym doc)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
346 (save-match-data
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
347 (let* ((name (symbol-name sym))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
348 (doclen (+ (length name) (length ": ") (length doc)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
349 ;; Subtract 1 from window width since emacs seems not to write
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
350 ;; any chars to the last column, at least for some terminal types.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
351 (strip (- doclen (1- (window-width (minibuffer-window))))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
352 (cond ((> strip 0)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
353 (let* ((len (length name)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
354 (cond ((>= strip len)
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
355 (format "%s" doc))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
356 (t
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
357 ;;(setq name (substring name 0 (- len strip)))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
358 ;;
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
359 ;; Show the end of the partial symbol name, rather
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
360 ;; than the beginning, since the former is more likely
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
361 ;; to be unique given package namespace conventions.
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
362 (setq name (substring name strip))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
363 (format "%s: %s" name doc)))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
364 (t
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
365 (format "%s: %s" sym doc))))))
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
366
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
367
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
368 (defun eldoc-fnsym-in-current-sexp ()
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
369 (let ((p (point)))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
370 (eldoc-beginning-of-sexp)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
371 (prog1
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
372 ;; Don't do anything if current word is inside a string.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
373 (if (= (or (char-after (1- (point))) 0) ?\")
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
374 nil
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
375 (eldoc-current-symbol))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
376 (goto-char p))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
377
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
378 (defun eldoc-beginning-of-sexp ()
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
379 (let ((parse-sexp-ignore-comments t))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
380 (condition-case err
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
381 (while (progn
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
382 (forward-sexp -1)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
383 (or (= (or (char-after (1- (point)))) ?\")
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
384 (> (point) (point-min)))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
385 (error nil))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
386
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
387 ;; returns nil unless current word is an interned symbol.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
388 (defun eldoc-current-symbol ()
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
389 (let ((c (char-after (point))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
390 (and c
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
391 (memq (char-syntax c) '(?w ?_))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
392 (intern-soft (current-word)))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
393
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
394 ;; Do indirect function resolution if possible.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
395 (defun eldoc-symbol-function (fsym)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
396 (let ((defn (and (fboundp fsym)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
397 (symbol-function fsym))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
398 (and (symbolp defn)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
399 (condition-case err
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
400 (setq defn (indirect-function fsym))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
401 (error (setq defn nil))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
402 defn))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
403
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
404 (defun eldoc-function-argstring (fn)
13532
37fdd3664658 (top level): Make sure to set global minor-mode-alist, not local one.
Noah Friedman <friedman@splode.com>
parents: 13530
diff changeset
405 (let* ((prelim-def (eldoc-symbol-function fn))
37fdd3664658 (top level): Make sure to set global minor-mode-alist, not local one.
Noah Friedman <friedman@splode.com>
parents: 13530
diff changeset
406 (def (if (eq (car-safe prelim-def) 'macro)
37fdd3664658 (top level): Make sure to set global minor-mode-alist, not local one.
Noah Friedman <friedman@splode.com>
parents: 13530
diff changeset
407 (cdr prelim-def)
37fdd3664658 (top level): Make sure to set global minor-mode-alist, not local one.
Noah Friedman <friedman@splode.com>
parents: 13530
diff changeset
408 prelim-def))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
409 (arglist (cond ((null def) nil)
13532
37fdd3664658 (top level): Make sure to set global minor-mode-alist, not local one.
Noah Friedman <friedman@splode.com>
parents: 13530
diff changeset
410 ((byte-code-function-p def)
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
411 (if (fboundp 'compiled-function-arglist)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
412 (funcall 'compiled-function-arglist def)
13532
37fdd3664658 (top level): Make sure to set global minor-mode-alist, not local one.
Noah Friedman <friedman@splode.com>
parents: 13530
diff changeset
413 (aref def 0)))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
414 ((eq (car-safe def) 'lambda)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
415 (nth 1 def))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
416 (t t))))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
417 (eldoc-function-argstring-format arglist)))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
418
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
419 (defun eldoc-function-argstring-format (arglist)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
420 (cond ((not (listp arglist))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
421 (setq arglist nil))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
422 ((symbolp (car arglist))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
423 (setq arglist
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
424 (mapcar (function (lambda (s)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
425 (if (memq s '(&optional &rest))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
426 (symbol-name s)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
427 (funcall eldoc-argument-case
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
428 (symbol-name s)))))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
429 arglist)))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
430 ((stringp (car arglist))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
431 (setq arglist
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
432 (mapcar (function (lambda (s)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
433 (if (member s '("&optional" "&rest"))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
434 s
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
435 (funcall eldoc-argument-case s))))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
436 arglist))))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
437 (concat "(" (mapconcat 'identity arglist " ") ")"))
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
438
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
439
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
440 ;; Alist of predicate/action pairs.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
441 ;; Each member of the list is a sublist consisting of a predicate function
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
442 ;; used to determine if the arglist for a function can be found using a
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
443 ;; certain pattern, and a function which returns the actual arglist from
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
444 ;; that docstring.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
445 ;;
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
446 ;; The order in this table is significant, since later predicates may be
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
447 ;; more general than earlier ones.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
448 ;;
17920
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
449 ;; Compiler note for Emacs/XEmacs versions which support dynamic loading:
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
450 ;; these functions will be compiled to bytecode, but can't be lazy-loaded
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
451 ;; even if you set byte-compile-dynamic; to do that would require making
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
452 ;; them named top-level defuns, which is not particularly desirable either.
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
453 (defvar eldoc-function-argstring-from-docstring-method-table
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
454 (list
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
455 ;; Try first searching for args starting with symbol name.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
456 ;; This is to avoid matching parenthetical remarks in e.g. sit-for.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
457 (list (function (lambda (doc fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
458 (string-match (format "^(%s[^\n)]*)$" fn) doc)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
459 (function (lambda (doc)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
460 ;; end does not include trailing ")" sequence.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
461 (let ((end (- (match-end 0) 1)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
462 (if (string-match " +" doc (match-beginning 0))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
463 (substring doc (match-end 0) end)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
464 "")))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
465
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
466 ;; Try again not requiring this symbol name in the docstring.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
467 ;; This will be the case when looking up aliases.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
468 (list (function (lambda (doc fn)
17920
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
469 ;; save-restriction has a pathological docstring in
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
470 ;; Emacs/XEmacs 19.
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
471 (and (not (eq fn 'save-restriction))
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
472 (string-match "^([^\n)]+)$" doc))))
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
473 (function (lambda (doc)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
474 ;; end does not include trailing ")" sequence.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
475 (let ((end (- (match-end 0) 1)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
476 (and (string-match " +" doc (match-beginning 0))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
477 (substring doc (match-end 0) end))))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
478
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
479 ;; Emacs subr docstring style:
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
480 ;; (fn arg1 arg2 ...): description...
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
481 (list (function (lambda (doc fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
482 (string-match "^([^\n)]+):" doc)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
483 (function (lambda (doc)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
484 ;; end does not include trailing "):" sequence.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
485 (let ((end (- (match-end 0) 2)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
486 (and (string-match " +" doc (match-beginning 0))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
487 (substring doc (match-end 0) end))))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
488
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
489 ;; XEmacs subr docstring style:
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
490 ;; "arguments: (arg1 arg2 ...)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
491 (list (function (lambda (doc fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
492 (string-match "^arguments: (\\([^\n)]+\\))" doc)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
493 (function (lambda (doc)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
494 ;; also skip leading paren, but the first word is
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
495 ;; actually an argument, not the function name.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
496 (substring doc (match-beginning 1) (match-end 1)))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
497
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
498 ;; This finds the argstring for `condition-case'. Any others?
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
499 (list (function (lambda (doc fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
500 (string-match
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
501 (format "^Usage looks like \\((%s[^\n)]*)\\)\\.$" fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
502 doc)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
503 (function (lambda (doc)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
504 ;; end does not include trailing ")" sequence.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
505 (let ((end (- (match-end 1) 1)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
506 (and (string-match " +" doc (match-beginning 1))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
507 (substring doc (match-end 0) end))))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
508
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
509 ;; This finds the argstring for `setq-default'. Any others?
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
510 (list (function (lambda (doc fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
511 (string-match (format "^[ \t]+\\((%s[^\n)]*)\\)$" fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
512 doc)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
513 (function (lambda (doc)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
514 ;; end does not include trailing ")" sequence.
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
515 (let ((end (- (match-end 1) 1)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
516 (and (string-match " +" doc (match-beginning 1))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
517 (substring doc (match-end 0) end))))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
518
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
519 ;; This finds the argstring for `start-process'. Any others?
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
520 (list (function (lambda (doc fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
521 (string-match "^Args are +\\([^\n]+\\)$" doc)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
522 (function (lambda (doc)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
523 (substring doc (match-beginning 1) (match-end 1)))))
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
524
17920
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
525 ;; These common subrs don't have arglists in their docstrings. So cheat.
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
526 (list (function (lambda (doc fn)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
527 (memq fn '(and or list + -))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
528 (function (lambda (doc)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
529 ;; The value nil is a placeholder; otherwise, the
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
530 ;; following string may be compiled as a docstring,
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
531 ;; and not a return value for the function.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
532 ;; In interpreted lisp form they are
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
533 ;; indistinguishable; it only matters for compiled
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
534 ;; forms.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
535 nil
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
536 "&rest args")))
16969
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
537 ))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
538
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
539 (defun eldoc-function-argstring-from-docstring (fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
540 (let ((docstring (documentation fn 'raw))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
541 (table eldoc-function-argstring-from-docstring-method-table)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
542 (doc nil)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
543 (doclist nil))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
544 (save-match-data
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
545 (while table
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
546 (cond ((funcall (car (car table)) docstring fn)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
547 (setq doc (funcall (car (cdr (car table))) docstring))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
548 (setq table nil))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
549 (t
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
550 (setq table (cdr table)))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
551
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
552 (cond ((not (stringp doc))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
553 nil)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
554 ((string-match "&" doc)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
555 (let ((p 0)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
556 (l (length doc)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
557 (while (< p l)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
558 (cond ((string-match "[ \t\n]+" doc p)
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
559 (setq doclist
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
560 (cons (substring doc p (match-beginning 0))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
561 doclist))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
562 (setq p (match-end 0)))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
563 (t
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
564 (setq doclist (cons (substring doc p) doclist))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
565 (setq p l))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
566 (eldoc-function-argstring-format (nreverse doclist))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
567 (t
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
568 (concat "(" (funcall eldoc-argument-case doc) ")"))))))
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
569
436fd36233d1 Update copyright notice to reflect assignment to FSF and incorporation
Noah Friedman <friedman@splode.com>
parents: 16385
diff changeset
570
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
571 ;; When point is in a sexp, the function args are not reprinted in the echo
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
572 ;; area after every possible interactive command because some of them print
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
573 ;; their own messages in the echo area; the eldoc functions would instantly
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
574 ;; overwrite them unless it is more restrained.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
575 ;; These functions do display-command table management.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
576
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
577 (defun eldoc-add-command (&rest cmds)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
578 (or eldoc-message-commands
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
579 (setq eldoc-message-commands
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
580 (make-vector eldoc-message-commands-table-size 0)))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
581
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
582 (let (name sym)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
583 (while cmds
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
584 (setq name (car cmds))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
585 (setq cmds (cdr cmds))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
586
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
587 (cond ((symbolp name)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
588 (setq sym name)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
589 (setq name (symbol-name sym)))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
590 ((stringp name)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
591 (setq sym (intern-soft name))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
592
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
593 (and (symbolp sym)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
594 (fboundp sym)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
595 (set (intern name eldoc-message-commands) t)))))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
596
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
597 (defun eldoc-add-command-completions (&rest names)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
598 (while names
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
599 (apply 'eldoc-add-command
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
600 (all-completions (car names) obarray 'fboundp))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
601 (setq names (cdr names))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
602
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
603 (defun eldoc-remove-command (&rest cmds)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
604 (let (name)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
605 (while cmds
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
606 (setq name (car cmds))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
607 (setq cmds (cdr cmds))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
608
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
609 (and (symbolp name)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
610 (setq name (symbol-name name)))
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
611
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
612 (if (fboundp 'unintern)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
613 (unintern name eldoc-message-commands)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
614 (let ((s (intern-soft name eldoc-message-commands)))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
615 (and s
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
616 (makunbound s)))))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
617
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
618 (defun eldoc-remove-command-completions (&rest names)
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
619 (while names
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
620 (apply 'eldoc-remove-command
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
621 (all-completions (car names) eldoc-message-commands))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
622 (setq names (cdr names))))
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
623
23283
2442a5dce1a8 (eldoc-message): Check for 1-arg case, and store string in
Noah Friedman <friedman@splode.com>
parents: 18699
diff changeset
624
16996
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
625 ;; Prime the command list.
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
626 (eldoc-add-command-completions
2d67501c45b9 (eldoc-message-commands): Doc fixes.
Noah Friedman <friedman@splode.com>
parents: 16975
diff changeset
627 "backward-" "beginning-of-" "delete-other-windows" "delete-window"
17920
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
628 "end-of-" "forward-" "indent-for-tab-command" "goto-" "mouse-set-point"
161cc8316f98 (eldoc-message-commands): Move docstring into comments, since this isn't
Noah Friedman <friedman@splode.com>
parents: 17445
diff changeset
629 "next-" "other-window" "previous-" "recenter" "scroll-"
18699
c6cf53a7da72 [top level]: Add `up-list' and `down-list' to eldoc-message-commands.
Noah Friedman <friedman@splode.com>
parents: 17920
diff changeset
630 "self-insert-command" "split-window-"
c6cf53a7da72 [top level]: Add `up-list' and `down-list' to eldoc-message-commands.
Noah Friedman <friedman@splode.com>
parents: 17920
diff changeset
631 "up-list" "down-list")
13530
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
632
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
633 (provide 'eldoc)
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
634
625e90e74d83 Initial revision
Noah Friedman <friedman@splode.com>
parents:
diff changeset
635 ;;; eldoc.el ends here