1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-30 19:53:09 +00:00

(eldoc-minor-mode-string): Add autoload cookie; otherwise autoloaded

add-minor-mode call complains in Emacs 21.
Use add-minor-mode to set minor-mode-alist, if available.

(eldoc-echo-area-use-multiline-p): New user option.
(eldoc-echo-area-multiline-supported-p): New variable.
(eldoc-docstring-format-sym-doc): Use them.
(eldoc-mode): If not using idle timers, append to local post and
pre command hooks.  Suggested by David Byers <davby@ida.liu.se>.

(eldoc-display-message-no-interference-p): Don't interfere with edebug.
Add autoload cookie for eldoc-mode minor-mode-alist initialization.

(eldoc-function-arglist): New function.
(eldoc-function-argstring): Use it.
This commit is contained in:
Noah Friedman 2000-07-24 00:38:34 +00:00
parent db3ca487f6
commit 03a9c6d06a
2 changed files with 101 additions and 41 deletions

View File

@ -1,5 +1,19 @@
2000-07-23 Noah Friedman <friedman@splode.com>
* emacs-lisp/eldoc.el (eldoc-minor-mode-string): Add autoload
cookie.
Use add-minor-mode to set minor-mode-alist, if available.
(eldoc-echo-area-use-multiline-p): New user option.
(eldoc-echo-area-multiline-supported-p): New variable.
(eldoc-docstring-format-sym-doc): Use them.
(eldoc-mode): If not using idle timers, append to local post and
pre command hooks. Suggested by David Byers <davby@ida.liu.se>.
(eldoc-display-message-no-interference-p): Don't interfere with
edebug.
Add autoload cookie for eldoc-mode minor-mode-alist initialization.
(eldoc-function-arglist): New function.
(eldoc-function-argstring): Use it.
* menu-bar.el (menu-bar-files-menu [recover-session]): Make sure
auto save directory exists before calling directory-files.

View File

@ -1,13 +1,13 @@
;;; eldoc.el --- show function arglist or variable docstring in echo area
;; Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
;; Copyright (C) 1996, 97, 98, 99, 2000 Free Software Foundation, Inc.
;; Author: Noah Friedman <friedman@splode.com>
;; Maintainer: friedman@splode.com
;; Keywords: extensions
;; Created: 1995-10-06
;; $Id: eldoc.el,v 1.15 1998/09/19 02:15:26 friedman Exp $
;; $Id: eldoc.el,v 1.20 2000/06/03 19:50:18 friedman Exp $
;; This file is part of GNU Emacs.
@ -48,14 +48,16 @@
;;; Code:
;; Use idle timers if available in the version of emacs running.
;; Please don't change this to use `require'; this package works as-is in
;; XEmacs (which doesn't have timer.el as of 19.14), and I would like to
;; maintain compatibility with that since I must use it sometimes. --Noah
;; Please don't change this to use `require'; this package works
;; as-is in XEmacs 19.14 and later and I am striving to maintain
;; compatibility between emacs variants.
(or (featurep 'timer)
(load "timer" t))
(defgroup eldoc nil
"Show function arglist or variable docstring in echo area."
:group 'eldoc
:group 'lisp
:group 'extensions)
;;;###autoload
@ -85,28 +87,52 @@ If this variable is set to 0, no idle time is required."
:type 'number
:group 'eldoc)
;;;###autoload
(defcustom eldoc-minor-mode-string " ElDoc"
"*String to display in mode line when Eldoc Mode is enabled."
:type 'string
:group 'eldoc)
;; Put this minor mode on the global minor-mode-alist.
(or (assq 'eldoc-mode (default-value 'minor-mode-alist))
(setq-default minor-mode-alist
(append (default-value 'minor-mode-alist)
'((eldoc-mode eldoc-minor-mode-string)))))
(defcustom eldoc-argument-case 'upcase
"Case to display argument names of functions, as a symbol.
This has two preferred values: `upcase' or `downcase'.
Actually, any name of a function which takes a string as an argument and
returns another string is acceptable."
:type '(radio function
(function-item upcase)
(function-item downcase))
:type '(radio (function-item upcase)
(function-item downcase)
function)
:group 'eldoc)
;; No user options below here.
(defcustom eldoc-echo-area-use-multiline-p 'truncate-sym-name-if-fit
"*Allow long eldoc messages to resize echo area display.
If value is `t', never attempt to truncate messages; complete symbol name
and function arglist or 1-line variable documentation will be displayed
even if echo area must be resized to fit.
If value is any non-nil value other than `t', symbol name may be truncated
if it will enable the function arglist or documentation string to fit on a
single line without resizing window. Otherwise, behavior is just like
former case.
If value is nil, messages are always truncated to fit in a single line of
display in the echo area. Function or variable symbol name may be
truncated to make more of the arglist or documentation string visible.
Non-nil values for this variable have no effect unless
`eldoc-echo-area-multiline-supported-p' is non-nil."
:type '(radio (const :tag "Always" t)
(const :tag "Never" nil)
(const :tag "Yes, but truncate symbol names if it will\
enable argument list to fit on one line" truncate-sym-name-if-fit))
:group 'eldoc)
;;; No user options below here.
;; Non-nil if this version of emacs supports dynamically resizable echo areas.
(defvar eldoc-echo-area-multiline-supported-p
(and (string-lessp "21" emacs-version)
(save-match-data
(numberp (string-match "^GNU Emacs" (emacs-version))))))
;; Commands after which it is appropriate to print in the echo area.
;; Eldoc does not try to print function arglists, etc. after just any command,
@ -143,6 +169,16 @@ returns another string is acceptable."
;; This is used to determine if eldoc-idle-delay is changed by the user.
(defvar eldoc-current-idle-delay eldoc-idle-delay)
;; Put minor mode string on the global minor-mode-alist.
;;;###autoload
(cond ((fboundp 'add-minor-mode)
(add-minor-mode 'eldoc-mode 'eldoc-minor-mode-string))
((assq 'eldoc-mode (default-value 'minor-mode-alist)))
(t
(setq-default minor-mode-alist
(append (default-value 'minor-mode-alist)
'((eldoc-mode eldoc-minor-mode-string))))))
;;;###autoload
(defun eldoc-mode (&optional prefix)
@ -164,13 +200,13 @@ the mode, respectively."
;; 19.30; that is the first version in which it appeared, but it
;; was obsolesced by idle timers in Emacs 19.31.
(add-hook (if (boundp 'post-command-idle-hook)
'post-command-idle-hook
'post-command-hook)
'eldoc-print-current-symbol-info)
'post-command-idle-hook
'post-command-hook)
'eldoc-print-current-symbol-info t t)
;; quick and dirty hack for seeing if this is XEmacs
(and (fboundp 'display-message)
(add-hook 'pre-command-hook
'eldoc-pre-command-refresh-echo-area))))
'eldoc-pre-command-refresh-echo-area t t))))
(setq eldoc-mode (if prefix
(>= (prefix-numeric-value prefix) 0)
(not eldoc-mode)))
@ -265,9 +301,12 @@ the mode, respectively."
eldoc-message-commands)
(sit-for eldoc-idle-delay))))))
;; Check various conditions about the current environment that might make
;; it undesirable to print eldoc messages right this instant.
(defun eldoc-display-message-no-interference-p ()
(and eldoc-mode
(not executing-kbd-macro)
(not (and (boundp 'edebug-active) edebug-active))
;; Having this mode operate in an active minibuffer/echo area causes
;; interference with what's going on there.
(not cursor-in-echo-area)
@ -345,24 +384,27 @@ the mode, respectively."
(defun eldoc-docstring-format-sym-doc (sym doc)
(save-match-data
(let* ((name (symbol-name sym))
(doclen (+ (length name) (length ": ") (length doc)))
;; Subtract 1 from window width since emacs seems not to write
;; any chars to the last column, at least for some terminal types.
(strip (- doclen (1- (window-width (minibuffer-window))))))
(cond ((> strip 0)
(let* ((len (length name)))
(cond ((>= strip len)
(format "%s" doc))
(t
;;(setq name (substring name 0 (- len strip)))
;;
;; Show the end of the partial symbol name, rather
;; than the beginning, since the former is more likely
;; to be unique given package namespace conventions.
(setq name (substring name strip))
(format "%s: %s" name doc)))))
(ea-multi (and eldoc-echo-area-multiline-supported-p
eldoc-echo-area-use-multiline-p))
;; Subtract 1 from window width since emacs will not write
;; any chars to the last column, or in later versions, will
;; cause a wraparound and resize of the echo area.
(ea-width (1- (window-width (minibuffer-window))))
(strip (- (+ (length name) (length ": ") (length doc)) ea-width)))
(cond ((or (<= strip 0)
(eq ea-multi t)
(and ea-multi (> (length doc) ea-width)))
(format "%s: %s" sym doc))
((> (length doc) ea-width)
(substring (format "%s" doc) 0 ea-width))
((>= strip (length name))
(format "%s" doc))
(t
(format "%s: %s" sym doc))))))
;; Show the end of the partial symbol name, rather
;; than the beginning, since the former is more likely
;; to be unique given package namespace conventions.
(setq name (substring name strip))
(format "%s: %s" name doc))))))
(defun eldoc-fnsym-in-current-sexp ()
@ -401,20 +443,24 @@ the mode, respectively."
(error (setq defn nil))))
defn))
(defun eldoc-function-argstring (fn)
(defun eldoc-function-arglist (fn)
(let* ((prelim-def (eldoc-symbol-function fn))
(def (if (eq (car-safe prelim-def) 'macro)
(cdr prelim-def)
prelim-def))
(arglist (cond ((null def) nil)
((byte-code-function-p def)
(if (fboundp 'compiled-function-arglist)
(funcall 'compiled-function-arglist def)
(aref def 0)))
(cond ((fboundp 'compiled-function-arglist)
(funcall 'compiled-function-arglist def))
(t
(aref def 0))))
((eq (car-safe def) 'lambda)
(nth 1 def))
(t t))))
(eldoc-function-argstring-format arglist)))
arglist))
(defun eldoc-function-argstring (fn)
(eldoc-function-argstring-format (eldoc-function-arglist fn)))
(defun eldoc-function-argstring-format (arglist)
(cond ((not (listp arglist))