-;;; help-fns.el --- Complex help functions
+;;; help-fns.el --- Complex help functions -*- lexical-binding: t -*-
;; Copyright (C) 1985-1986, 1993-1994, 1998-2011
;; Free Software Foundation, Inc.
;; Replace `fn' with the actual function name.
(if (consp def) "anonymous" def)
(match-string 1 docstring))
- (substring docstring 0 (match-beginning 0)))))
+ (unless (zerop (match-beginning 0))
+ (substring docstring 0 (match-beginning 0))))))
+;; FIXME: Move to subr.el?
(defun help-add-fundoc-usage (docstring arglist)
"Add the usage info to DOCSTRING.
If DOCSTRING already has a usage info, then just return it unchanged.
The usage info is built from ARGLIST. DOCSTRING can be nil.
ARGLIST can also be t or a string of the form \"(FUN ARG1 ARG2 ...)\"."
- (unless (stringp docstring) (setq docstring "Not documented"))
- (if (or (string-match "\n\n(fn\\(\\( .*\\)?)\\)\\'" docstring) (eq arglist t))
+ (unless (stringp docstring) (setq docstring ""))
+ (if (or (string-match "\n\n(fn\\(\\( .*\\)?)\\)\\'" docstring)
+ (eq arglist t))
docstring
(concat docstring
(if (string-match "\n?\n\\'" docstring)
(concat "(fn" (match-string 1 arglist) ")")
(format "%S" (help-make-usage 'fn arglist))))))
+;; FIXME: Move to subr.el?
(defun help-function-arglist (def)
;; Handle symbols aliased to other symbols.
(if (and (symbolp def) (fboundp def)) (setq def (indirect-function def)))
;; If definition is a macro, find the function inside it.
(if (eq (car-safe def) 'macro) (setq def (cdr def)))
(cond
+ ((and (byte-code-function-p def) (integerp (aref def 0)))
+ (let* ((args-desc (aref def 0))
+ (max (lsh args-desc -8))
+ (min (logand args-desc 127))
+ (rest (logand args-desc 128))
+ (arglist ()))
+ (dotimes (i min)
+ (push (intern (concat "arg" (number-to-string (1+ i)))) arglist))
+ (when (> max min)
+ (push '&optional arglist)
+ (dotimes (i (- max min))
+ (push (intern (concat "arg" (number-to-string (+ 1 i min))))
+ arglist)))
+ (unless (zerop rest) (push '&rest arglist) (push 'rest arglist))
+ (nreverse arglist)))
((byte-code-function-p def) (aref def 0))
((eq (car-safe def) 'lambda) (nth 1 def))
+ ((eq (car-safe def) 'closure) (nth 2 def))
+ ((subrp def)
+ (let ((arity (subr-arity def))
+ (arglist ()))
+ (dotimes (i (car arity))
+ (push (intern (concat "arg" (number-to-string (1+ i)))) arglist))
+ (cond
+ ((not (numberp (cdr arglist)))
+ (push '&rest arglist)
+ (push 'rest arglist))
+ ((< (car arity) (cdr arity))
+ (push '&optional arglist)
+ (dotimes (i (- (cdr arity) (car arity)))
+ (push (intern (concat "arg" (number-to-string
+ (+ 1 i (car arity)))))
+ arglist))))
+ (nreverse arglist)))
((and (eq (car-safe def) 'autoload) (not (eq (nth 4 def) 'keymap)))
"[Arg list not available until function definition is loaded.]")
(t t)))
+;; FIXME: Move to subr.el?
(defun help-make-usage (function arglist)
(cons (if (symbolp function) function 'anonymous)
(mapcar (lambda (arg)
(cdr arg))
arg)
(let ((name (symbol-name arg)))
- (if (string-match "\\`&" name) arg
- (intern (upcase name))))))
+ (cond
+ ((string-match "\\`&" name) arg)
+ ((string-match "\\`_" name)
+ (intern (upcase (substring name 1))))
+ (t (intern (upcase name)))))))
arglist)))
;; Could be this, if we make symbol-file do the work below.
doc t t 1)))))
(defun help-highlight-arguments (usage doc &rest args)
- (when usage
+ (when (and usage (string-match "^(" usage))
(with-temp-buffer
(insert usage)
(goto-char (point-min))
(pt1 (with-current-buffer (help-buffer) (point)))
errtype)
(setq string
- (cond ((or (stringp def)
- (vectorp def))
+ (cond ((or (stringp def) (vectorp def))
"a keyboard macro")
((subrp def)
(if (eq 'unevalled (cdr (subr-arity def)))
(concat beg "Lisp function"))
((eq (car-safe def) 'macro)
"a Lisp macro")
+ ((eq (car-safe def) 'closure)
+ (concat beg "Lisp closure"))
((eq (car-safe def) 'autoload)
(format "%s autoloaded %s"
(if (commandp def) "an interactive" "an")
(with-syntax-table emacs-lisp-mode-syntax-table
(or (condition-case ()
(save-excursion
+ (skip-chars-forward "'")
(or (not (zerop (skip-syntax-backward "_w")))
(eq (char-syntax (following-char)) ?w)
(eq (char-syntax (following-char)) ?_)
"Describe variable (default %s): " v)
"Describe variable: ")
obarray
- '(lambda (vv)
- (or (boundp vv)
- (get vv 'variable-documentation)))
+ (lambda (vv)
+ (or (get vv 'variable-documentation)
+ (not (keywordp vv))))
t nil nil
(if (symbolp v) (symbol-name v))))
(list (if (equal val "")
(insert (cond
((null value) "default")
((char-table-p value) "deeper char-table ...")
- (t (condition-case err
+ (t (condition-case nil
(category-set-mnemonics value)
(error "invalid"))))))