X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/87f37557a5deb12646372402d005c9a60ed57e42..2e48ba1817cc8fa07cc3ea57535d854bdd349fdc:/lisp/help.el diff --git a/lisp/help.el b/lisp/help.el index df28f62d10..fed3dd7f69 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -1,6 +1,6 @@ ;;; help.el --- help commands for Emacs -;; Copyright (C) 1985, 1986, 1993, 1994, 1998 Free Software Foundation, Inc. +;; Copyright (C) 1985, 1986, 1993, 1994, 1998, 1999, 2000 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: help, internal @@ -25,13 +25,14 @@ ;;; Commentary: ;; This code implements GNU Emacs' on-line help system, the one invoked by -;;`M-x help-for-help'. +;; `M-x help-for-help'. ;;; Code: ;; Get the macro make-help-screen when this is compiled, ;; or run interpreted, but not when the compiled code is loaded. (eval-when-compile (require 'help-macro)) +(eval-when-compile (require 'view)) (defvar help-map (make-sparse-keymap) "Keymap for characters following the Help key.") @@ -82,6 +83,8 @@ (autoload 'finder-by-keyword "finder" "Find packages matching a given keyword." t) +(define-key help-map "P" 'view-emacs-problems) + (define-key help-map "s" 'describe-syntax) (define-key help-map "t" 'help-with-tutorial) @@ -101,26 +104,6 @@ ;; Documentation only, since we use minor-mode-overriding-map-alist. (define-key help-mode-map "\r" 'help-follow) -;; Font-locking is incompatible with the new xref stuff. -;(defvar help-font-lock-keywords -; (eval-when-compile -; (let ((name-char "[-+a-zA-Z0-9_*]") (sym-char "[-+a-zA-Z0-9_:*]")) -; (list -; ;; -; ;; The symbol itself. -; (list (concat "\\`\\(" name-char "+\\)\\(\\(:\\)\\|\\('\\)\\)") -; '(1 (if (match-beginning 3) -; font-lock-function-name-face -; font-lock-variable-name-face))) -; ;; -; ;; Words inside `' which tend to be symbol names. -; (list (concat "`\\(" sym-char sym-char "+\\)'") -; 1 'font-lock-constant-face t) -; ;; -; ;; CLisp `:' keywords as references. -; (list (concat "\\<:" sym-char "+\\>") 0 'font-lock-builtin-face t)))) -; "Default expressions to highlight in Help mode.") - (defvar help-xref-stack nil "A stack of ways by which to return to help buffers after following xrefs. Used by `help-follow' and `help-xref-go-back'. @@ -135,6 +118,11 @@ The format is (FUNCTION ARGS...).") (setq-default help-xref-stack nil help-xref-stack-item nil) +(defcustom help-mode-hook nil + "Hook run by `help-mode'." + :type 'hook + :group 'help) + (defun help-mode () "Major mode for viewing help text and navigating references in it. Entry to this mode runs the normal hook `help-mode-hook'. @@ -216,6 +204,19 @@ With arg, you are asked to choose which language." (goto-char (point-min)) (set-buffer-modified-p nil)))) +(defun mode-line-key-binding (key) + "Value is the binding of KEY in the mode line or nil if none." + (let (string-info defn) + (when (and (eq 'mode-line (aref key 0)) + (consp (setq string-info (nth 4 (event-start (aref key 1)))))) + (let* ((string (car string-info)) + (pos (cdr string-info)) + (local-map (and (> pos 0) + (< pos (length string)) + (get-text-property pos 'local-map string)))) + (setq defn (and local-map (lookup-key local-map key))))) + defn)) + (defun describe-key-briefly (key &optional insert) "Print the name of the function KEY invokes. KEY is a string. If INSERT (the prefix arg) is non-nil, insert the message in the buffer." @@ -236,7 +237,8 @@ If INSERT (the prefix arg) is non-nil, insert the message in the buffer." (set-buffer (window-buffer window)) (goto-char position))) ;; Ok, now look up the key and name the command. - (let ((defn (key-binding key)) + (let ((defn (or (mode-line-key-binding key) + (key-binding key))) (key-desc (key-description key))) (if (or (null defn) (integerp defn)) (princ (format "%s is undefined" key-desc)) @@ -317,7 +319,7 @@ If FUNCTION is nil, applies `message' to it, thus printing it." (progn (set-buffer (window-buffer window)) (goto-char position))) - (let ((defn (key-binding key))) + (let ((defn (or (mode-line-key-binding key) (key-binding key)))) (if (or (null defn) (integerp defn)) (message "%s is undefined" (key-description key)) (with-output-to-temp-buffer "*Help*" @@ -327,7 +329,7 @@ If FUNCTION is nil, applies `message' to it, thus printing it." (princ " runs the command ") (prin1 defn) (princ "\n which is ") - (describe-function-1 defn nil) + (describe-function-1 defn nil (interactive-p)) (print-help-return-message))))))) (defun describe-mode () @@ -438,7 +440,13 @@ With numeric argument display information on correspondingly older changes." (defun view-emacs-FAQ () "Display the Emacs Frequently Asked Questions (FAQ) file." (interactive) - (find-file-read-only (expand-file-name "FAQ" data-directory))) +;;; (find-file-read-only (expand-file-name "FAQ" data-directory)) + (info "(emacs-faq)")) + +(defun view-emacs-problems () + "Display info on known problems with Emacs and possible workarounds." + (interactive) + (view-file (expand-file-name "PROBLEMS" data-directory))) (defun view-lossage () "Display last 100 input keystrokes." @@ -483,17 +491,19 @@ C-f Info-goto-emacs-command-node. Type a function name; i info. The info documentation reader. I describe-input-method. Describe a specific input method (if you type its name) or the current input method (if you type just RET). +C-i info-lookup-symbol. Display the definition of a specific symbol + as found in the manual for the language this buffer is written in. k describe-key. Type a command key sequence; it displays the full documentation. C-k Info-goto-emacs-key-command-node. Type a command key sequence; it takes you to the Info node for the command bound to that key. -l view-lossage. Shows last 100 characters you typed. +l view-lossage. Show last 100 characters you typed. L describe-language-environment. This describes either the a specific language environment (if you type its name) or the current language environment (if you type just RET). m describe-mode. Print documentation of current minor modes, and the current major mode, including their special commands. -n view-emacs-news. Shows emacs news file. +n view-emacs-news. Display news of recent Emacs changes. p finder-by-keyword. Find packages matching a given topic keyword. s describe-syntax. Display contents of syntax table, plus explanations t help-with-tutorial. Select the Emacs learn-by-doing tutorial. @@ -591,7 +601,7 @@ It can also be nil, if the definition is not associated with any file." ;; Use " is " instead of a colon so that ;; it is easier to get out the function name using forward-sexp. (princ " is ") - (describe-function-1 function nil) + (describe-function-1 function nil (interactive-p)) (print-help-return-message) (save-excursion (set-buffer standard-output) @@ -599,7 +609,7 @@ It can also be nil, if the definition is not associated with any file." (buffer-string))) (message "You didn't specify a function"))) -(defun describe-function-1 (function parens) +(defun describe-function-1 (function parens interactive-p) (let* ((def (if (symbolp function) (symbol-function function) function)) @@ -630,6 +640,18 @@ It can also be nil, if the definition is not associated with any file." (if (eq (nth 4 def) 'keymap) "keymap" (if (nth 4 def) "Lisp macro" "Lisp function")) )) + ;; perhaps use keymapp here instead + ((eq (car-safe def) 'keymap) + (let ((is-full nil) + (elts (cdr-safe def))) + (while elts + (if (char-table-p (car-safe elts)) + (setq is-full t + elts nil)) + (setq elts (cdr-safe elts))) + (if is-full + "a full keymap" + "a sparse keymap"))) (t ""))) (when (and parens (not (equal string ""))) (setq need-close t) @@ -639,7 +661,8 @@ It can also be nil, if the definition is not associated with any file." (save-excursion (save-match-data (if (re-search-backward "alias for `\\([^`']+\\)'" nil t) - (help-xref-button 1 #'describe-function def))))) + (help-xref-button 1 #'describe-function def + "mouse-2, RET: describe this function"))))) (or file-name (setq file-name (symbol-file function))) (if file-name @@ -658,7 +681,8 @@ It can also be nil, if the definition is not associated with any file." (find-function-noselect arg))) (pop-to-buffer (car location)) (goto-char (cdr location)))) - function))))) + function + "mouse-2, RET: find function's definition"))))) (if need-close (princ ")")) (princ ".") (terpri) @@ -671,21 +695,41 @@ It can also be nil, if the definition is not associated with any file." (car (append def nil))) ((eq (car-safe def) 'lambda) (nth 1 def)) + ((and (eq (car-safe def) 'autoload) + (not (eq (nth 4 def) 'keymap))) + (concat "[Arg list not available until " + "function definition is loaded.]")) (t t)))) - (if (listp arglist) - (progn - (princ (cons (if (symbolp function) function "anonymous") - (mapcar (lambda (arg) - (if (memq arg '(&optional &rest)) - arg - (intern (upcase (symbol-name arg))))) - arglist))) - (terpri)))) + (cond ((listp arglist) + (princ (cons (if (symbolp function) function "anonymous") + (mapcar (lambda (arg) + (if (memq arg '(&optional &rest)) + arg + (intern (upcase (symbol-name arg))))) + arglist))) + (terpri)) + ((stringp arglist) + (princ arglist) + (terpri)))) (let ((doc (documentation function))) (if doc (progn (terpri) (princ doc) - (help-setup-xref (list #'describe-function function) (interactive-p))) + (with-current-buffer standard-output + (beginning-of-line) + ;; Builtins get the calling sequence at the end of + ;; the doc string. Move it to the same place as + ;; for other functions. + (when (looking-at (format "(%S[ )]" function)) + (let ((start (point-marker))) + (goto-char (point-min)) + (forward-paragraph) + (insert-buffer-substring (current-buffer) start) + (insert ?\n) + (delete-region (1- start) (point-max)) + (goto-char (point-max))))) + (help-setup-xref (list #'describe-function function) + interactive-p)) (princ "not documented"))))) (defun variable-at-point () @@ -707,6 +751,29 @@ Return 0 if there is no such symbol." (set-syntax-table stab))) (error 0))) +(defun help-xref-on-pp (from to) + "Add xrefs for symbols in `pp's output between FROM and TO." + (let ((ost (syntax-table))) + (unwind-protect + (save-excursion + (save-restriction + (set-syntax-table emacs-lisp-mode-syntax-table) + (narrow-to-region from to) + (goto-char (point-min)) + (while (not (eobp)) + (cond + ((looking-at "\"") (forward-sexp 1)) + ((looking-at "#<") (search-forward ">" nil 'move)) + ((looking-at "\\(\\(\\sw\\|\\s_\\)+\\)") + (let* ((sym (intern-soft + (buffer-substring (match-beginning 1) (match-end 1)))) + (fn (cond ((fboundp sym) #'describe-function) + ((and sym (boundp sym)) #'describe-variable)))) + (when fn (help-xref-button 1 fn sym))) + (goto-char (match-end 1))) + (t (forward-char 1)))))) + (set-syntax-table ost)))) + (defun describe-variable (variable) "Display the full documentation of VARIABLE (a symbol). Returns the documentation as a string, also." @@ -728,26 +795,34 @@ Returns the documentation as a string, also." (if (not (boundp variable)) (progn (princ " is void") - (terpri) (setq valvoid t)) - (princ "'s value is ") - (terpri) - (pp (symbol-value variable)) - (terpri)) + (let ((val (symbol-value variable))) + (with-current-buffer standard-output + (princ "'s value is ") + (terpri) + (let ((from (point))) + (pp val) + (help-xref-on-pp from (point)))))) + (terpri) (if (local-variable-p variable) (progn (princ (format "Local in buffer %s; " (buffer-name))) (if (not (default-boundp variable)) (princ "globally void") - (princ "global value is ") - (terpri) - (pp (default-value variable))) + (let ((val (default-value variable))) + (with-current-buffer standard-output + (princ "global value is ") + (terpri) + (let ((from (point))) + (pp val) + (help-xref-on-pp from (point)))))) (terpri))) (terpri) (save-current-buffer (set-buffer standard-output) (if (> (count-lines (point-min) (point-max)) 10) (progn + (set-syntax-table emacs-lisp-mode-syntax-table) (goto-char (point-min)) (if valvoid (forward-line 1) @@ -766,7 +841,9 @@ Returns the documentation as a string, also." ;; Note, it is not reliable to test only for a custom-type property ;; because those are only present after the var's definition ;; has been loaded. - (if (or (user-variable-p variable) (get variable 'custom-type)) + (if (or (get variable 'custom-type) ; after defcustom + (get variable 'custom-loads) ; from loaddefs.el + (get variable 'standard-value)) ; from cus-start.el (let ((customize-label "customize")) (terpri) (terpri) @@ -776,7 +853,9 @@ Returns the documentation as a string, also." (re-search-backward (concat "\\(" customize-label "\\)") nil t) (help-xref-button 1 #'(lambda (v) - (customize-variable v)) variable) + (customize-variable v)) + variable + "mouse-2, RET: customize variable") )))) ;; Make a hyperlink to the library if appropriate. (Don't ;; change the format of the buffer's initial line in case @@ -789,12 +868,13 @@ Returns the documentation as a string, also." (with-current-buffer "*Help*" (save-excursion (re-search-backward "`\\([^`']+\\)'" nil t) - (help-xref-button 1 (lambda (arg) - (let ((location - (find-variable-noselect arg))) - (pop-to-buffer (car location)) - (goto-char (cdr location)))) - variable))))) + (help-xref-button + 1 (lambda (arg) + (let ((location + (find-variable-noselect arg))) + (pop-to-buffer (car location)) + (goto-char (cdr location)))) + variable "mouse-2, RET: find variable's definition"))))) (print-help-return-message) (save-excursion @@ -830,7 +910,7 @@ If INSERT (the prefix arg) is non-nil, insert the message in the buffer." (setq val (completing-read (if fn (format "Where is command (default %s): " fn) "Where is command: ") - obarray 'fboundp t)) + obarray 'commandp t)) (list (if (equal val "") fn (intern val)) current-prefix-arg))) @@ -910,8 +990,7 @@ and the file name is displayed in the echo area." (defcustom help-highlight-p t "*If non-nil, `help-make-xrefs' highlight cross-references. Under a window system it highlights them with face defined by -`help-highlight-face'. On a character terminal highlighted -references look like cross-references in info mode." +`help-highlight-face'." :group 'help :version "20.3" :type 'boolean) @@ -923,22 +1002,22 @@ Must be previously-defined." :version "20.3" :type 'face) -(defvar help-back-label "[back]" +(defvar help-back-label (purecopy "[back]") "Label to use by `help-make-xrefs' for the go-back reference.") -(defvar help-xref-symbol-regexp - (concat "\\(\\<\\(\\(variable\\|option\\)\\|" - "\\(function\\|command\\)\\|" - "\\(symbol\\)\\)\\s-+\\)?" - ;; Note starting with word-syntax character: - "`\\(\\sw\\(\\sw\\|\\s_\\)+\\)'") +(defconst help-xref-symbol-regexp + (purecopy (concat "\\(\\<\\(\\(variable\\|option\\)\\|" + "\\(function\\|command\\)\\|" + "\\(symbol\\)\\)\\s-+\\)?" + ;; Note starting with word-syntax character: + "`\\(\\sw\\(\\sw\\|\\s_\\)+\\)'")) "Regexp matching doc string references to symbols. The words preceding the quoted symbol can be used in doc strings to distinguish references to variables, functions and symbols.") -(defvar help-xref-info-regexp - "\\<[Ii]nfo[ \t\n]+node[ \t\n]+`\\([^']+\\)'" +(defconst help-xref-info-regexp + (purecopy "\\<[Ii]nfo[ \t\n]+node[ \t\n]+`\\([^']+\\)'") "Regexp matching doc string references to an Info node.") (defun help-setup-xref (item interactive-p) @@ -987,7 +1066,8 @@ that." (save-match-data (unless (string-match "^([^)]+)" data) (setq data (concat "(emacs)" data)))) - (help-xref-button 1 #'info data)))) + (help-xref-button 1 #'info data + "mouse-2, RET: read this Info node")))) ;; Quoted symbols (save-excursion (while (re-search-forward help-xref-symbol-regexp nil t) @@ -998,19 +1078,29 @@ that." ((match-string 3) ; `variable' &c (and (boundp sym) ; `variable' doesn't ensure ; it's actually bound - (help-xref-button 6 #'describe-variable sym))) + (help-xref-button + 6 #'describe-variable sym + "mouse-2, RET: describe this variable"))) ((match-string 4) ; `function' &c (and (fboundp sym) ; similarly - (help-xref-button 6 #'describe-function sym))) + (help-xref-button + 6 #'describe-function sym + "mouse-2, RET: describe this function"))) ((match-string 5)) ; nothing for symbol ((and (boundp sym) (fboundp sym)) ;; We can't intuit whether to use the ;; variable or function doc -- supply both. - (help-xref-button 6 #'help-xref-interned sym)) + (help-xref-button + 6 #'help-xref-interned sym + "mouse-2, RET: describe this symbol")) ((boundp sym) - (help-xref-button 6 #'describe-variable sym)) - ((fboundp sym) - (help-xref-button 6 #'describe-function sym))))))) + (help-xref-button + 6 #'describe-variable sym + "mouse-2, RET: describe this variable")) + ((fboundp sym) + (help-xref-button + 6 #'describe-function sym + "mouse-2, RET: describe this function"))))))) ;; An obvious case of a key substitution: (save-excursion (while (re-search-forward @@ -1019,7 +1109,9 @@ that." "\\ (move-to-column col) 0) - (looking-at "\\(\\sw\\|-\\)+$")) - ;; + (and (eolp) (forward-line)) + (end-of-line) + (skip-chars-backward "^\t\n") + (if (and (>= (current-column) col) + (looking-at "\\(\\sw\\|-\\)+$")) (let ((sym (intern-soft (match-string 0)))) (if (fboundp sym) (help-xref-button - 0 #'describe-function sym)))) - t) - (progn - (end-of-line) - (zerop (forward-line))) - (move-to-column 0))))))) + 0 #'describe-function sym + "mouse-2, RET: describe this function")))) + (zerop (forward-line))))))))) (set-syntax-table stab)) ;; Make a back-reference in this buffer if appropriate. (when help-xref-stack @@ -1064,13 +1155,14 @@ that." map)))) (set-buffer-modified-p old-modified)))) -(defun help-xref-button (match-number function data) +(defun help-xref-button (match-number function data &optional help-echo) "Make a hyperlink for cross-reference text previously matched. MATCH-NUMBER is the subexpression of interest in the last matched regexp. FUNCTION is a function to invoke when the button is activated, applied to DATA. DATA may be a single value or a list. -See `help-make-xrefs'." +See `help-make-xrefs'. +If optional arg HELP-ECHO is supplied, it is used as a help string." ;; Don't mung properties we've added specially in some instances. (unless (get-text-property (match-beginning match-number) 'help-xref) (add-text-properties (match-beginning match-number) @@ -1080,6 +1172,10 @@ See `help-make-xrefs'." (if (listp data) data (list data))))) + (if help-echo + (put-text-property (match-beginning match-number) + (match-end match-number) + 'help-echo help-echo)) (if help-highlight-p (put-text-property (match-beginning match-number) (match-end match-number) @@ -1092,15 +1188,17 @@ See `help-make-xrefs'." Both variable and function documentation are extracted into a single help buffer." - (let ((fdoc (describe-function symbol))) - (describe-variable symbol) - ;; We now have a help buffer on the variable. Insert the function - ;; text after it. - (goto-char (point-max)) - (let ((inhibit-read-only t)) - (insert "\n\n" fdoc))) - (goto-char (point-min)) - (help-setup-xref (list #'help-xref-interned symbol) nil)) + (let ((fdoc (when (fboundp symbol) (describe-function symbol)))) + (when (or (boundp symbol) (not fdoc)) + (describe-variable symbol) + ;; We now have a help buffer on the variable. Insert the function + ;; text before it. + (when fdoc + (with-current-buffer "*Help*" + (goto-char (point-min)) + (let ((inhibit-read-only t)) + (insert fdoc "\n\n" (symbol-name symbol) " is also a variable.\n\n")) + (help-setup-xref (list #'help-xref-interned symbol) nil)))))) (defun help-xref-mode (buffer) "Do a `describe-mode' for the specified BUFFER." @@ -1131,7 +1229,10 @@ help buffer." args (cddr item)) (setq help-xref-stack (cdr help-xref-stack)))) (apply method args) - (goto-char position))) + ;; We're not in the right buffer to do this, and we don't actually + ;; know which we should be in. + ;;(goto-char position) + )) (defun help-go-back () "Invoke the [back] button (if any) in the Help mode buffer." @@ -1143,16 +1244,29 @@ help buffer." For the cross-reference format, see `help-make-xrefs'." (interactive "d") - (let* ((help-data (or (and (not (= pos (point-max))) - (get-text-property pos 'help-xref)) - (and (not (= pos (point-min))) - (get-text-property (1- pos) 'help-xref)))) + (unless pos + (setq pos (point))) + (let* ((help-data + (or (and (not (= pos (point-max))) + (get-text-property pos 'help-xref)) + (and (not (= pos (point-min))) + (get-text-property (1- pos) 'help-xref)) + ;; check if the symbol under point is a function or variable + (let ((sym + (intern + (save-excursion + (goto-char pos) (skip-syntax-backward "w_") + (buffer-substring (point) + (progn (skip-syntax-forward "w_") + (point))))))) + (when (or (boundp sym) (fboundp sym)) + (list #'help-xref-interned sym))))) (method (car help-data)) (args (cdr help-data))) - (setq help-xref-stack (cons (cons (point) help-xref-stack-item) - help-xref-stack)) - (setq help-xref-stack-item nil) (when help-data + (setq help-xref-stack (cons (cons (point) help-xref-stack-item) + help-xref-stack)) + (setq help-xref-stack-item nil) ;; There is a reference at point. Follow it. (apply method args)))) @@ -1198,8 +1312,8 @@ This makes the window the right height for its contents, but never more than `temp-buffer-max-height' nor less than `window-min-height'. This applies to `help', `apropos' and `completion' buffers, and some others. -This variable should be set only with \\[customize], which is equivalent -to using the function `temp-buffer-resize-mode'." +Setting this variable directly does not take effect; +use either \\[customize] or the function `temp-buffer-resize-mode'." :get (lambda (symbol) (and (memq 'resize-temp-buffer-window temp-buffer-show-hook) t)) :set (lambda (symbol value) @@ -1254,8 +1368,86 @@ out of view." temp-buffer-max-height)) (win-height (1- (window-height))) (min-height (1- window-min-height)) - (text-height (window-buffer-height(selected-window))) + (text-height (count-screen-lines)) (new-height (max (min text-height max-height) min-height))) (enlarge-window (- new-height win-height))))) +;; `help-manyarg-func-alist' is defined primitively (in doc.c). +;; New primitives with `MANY' or `UNEVALLED' arglists should be added +;; to this alist. +;; The parens and function name are redundant, but it's messy to add +;; them in `documentation'. +(defconst help-manyarg-func-alist + (purecopy + '((list . "(list &rest OBJECTS)") + (vector . "(vector &rest OBJECTS)") + (make-byte-code . "(make-byte-code &rest ELEMENTS)") + (call-process + . "(call-process PROGRAM &optional INFILE BUFFER DISPLAY &rest ARGS)") + (string . "(string &rest CHARACTERS)") + (+ . "(+ &rest NUMBERS-OR-MARKERS)") + (- . "(- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS)") + (* . "(* &rest NUMBERS-OR-MARKERS)") + (/ . "(/ DIVIDEND DIVISOR &rest DIVISORS)") + (max . "(max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS)") + (min . "(min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS)") + (logand . "(logand &rest INTS-OR-MARKERS)") + (logior . "(logior &rest INTS-OR-MARKERS)") + (logxor . "(logxor &rest INTS-OR-MARKERS)") + (encode-time + . "(encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE)") + (insert . "(insert &rest ARGS)") + (insert-before-markers . "(insert-before-markers &rest ARGS)") + (message . "(message STRING &rest ARGUMENTS)") + (message-box . "(message-box STRING &rest ARGUMENTS)") + (message-or-box . "(message-or-box STRING &rest ARGUMENTS)") + (propertize . "(propertize STRING &rest PROPERTIES)") + (format . "(format STRING &rest OBJECTS)") + (apply . "(apply FUNCTION &rest ARGUMENTS)") + (run-hooks . "(run-hooks &rest HOOKS)") + (run-hook-with-args . "(run-hook-with-args HOOK &rest ARGS)") + (run-hook-with-args-until-failure + . "(run-hook-with-args-until-failure HOOK &rest ARGS)") + (run-hook-with-args-until-success + . "(run-hook-with-args-until-success HOOK &rest ARGS)") + (funcall . "(funcall FUNCTION &rest ARGUMENTS)") + (append . "(append &rest SEQUENCES)") + (concat . "(concat &rest SEQUENCES)") + (vconcat . "(vconcat vconcat)") + (nconc . "(nconc &rest LISTS)") + (widget-apply . "(widget-apply WIDGET PROPERTY &rest ARGS)") + (make-hash-table . "(make-hash-table &rest KEYWORD-ARGS)") + (insert-string . "(insert-string &rest ARGS)") + (start-process . "(start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS)") + (setq-default . "(setq-default SYMBOL VALUE [SYMBOL VALUE...])") + (save-excursion . "(save-excursion &rest BODY)") + (save-current-buffer . "(save-current-buffer &rest BODY)") + (save-restriction . "(save-restriction &rest BODY)") + (or . "(or CONDITIONS ...)") + (and . "(and CONDITIONS ...)") + (if . "(if COND THEN ELSE...)") + (cond . "(cond CLAUSES...)") + (progn . "(progn BODY ...)") + (prog1 . "(prog1 FIRST BODY...)") + (prog2 . "(prog2 X Y BODY...)") + (setq . "(setq SYM VAL SYM VAL ...)") + (quote . "(quote ARG)") + (function . "(function ARG)") + (defun . "(defun NAME ARGLIST [DOCSTRING] BODY...)") + (defmacro . "(defmacro NAME ARGLIST [DOCSTRING] BODY...)") + (defvar . "(defvar SYMBOL [INITVALUE DOCSTRING])") + (defconst . "(defconst SYMBOL INITVALUE [DOCSTRING])") + (let* . "(let* VARLIST BODY...)") + (let . "(let VARLIST BODY...)") + (while . "(while TEST BODY...)") + (catch . "(catch TAG BODY...)") + (unwind-protect . "(unwind-protect BODYFORM UNWINDFORMS...)") + (condition-case . "(condition-case VAR BODYFORM HANDLERS...)") + (track-mouse . "(track-mouse BOFY ...)") + (ml-if . "(ml-if COND THEN ELSE...)") + (ml-provide-prefix-argument . "(ml-provide-prefix-argument ARG1 ARG2)") + (with-output-to-temp-buffer + . "(with-output-to-temp-buffer BUFFNAME BODY ...)") + (save-window-excursion . "(save-window-excursion BODY ...)")))) + ;;; help.el ends here