;;; help-fns.el --- Complex help functions -*- lexical-binding: t -*-
-;; Copyright (C) 1985-1986, 1993-1994, 1998-2011
+;; Copyright (C) 1985-1986, 1993-1994, 1998-2012
;; Free Software Foundation, Inc.
;; Maintainer: FSF
(defun help-split-fundoc (docstring def)
"Split a function DOCSTRING into the actual doc and the usage info.
-Return (USAGE . DOC) or nil if there's no usage info.
+Return (USAGE . DOC) or nil if there's no usage info, where USAGE info
+is a string describing the argument list of DEF, such as
+\"(apply FUNCTION &rest ARGUMENTS)\".
DEF is the function whose usage we're looking for in DOCSTRING."
;; Functions can get the calling sequence at the end of the doc string.
;; In cases where `function' has been fset to a subr we can't search for
(defun help-make-usage (function arglist)
(cons (if (symbolp function) function 'anonymous)
(mapcar (lambda (arg)
- (if (not (symbolp arg))
- (if (and (consp arg) (symbolp (car arg)))
- ;; CL style default values for optional args.
- (cons (intern (upcase (symbol-name (car arg))))
- (cdr arg))
- arg)
+ (if (not (symbolp arg)) arg
(let ((name (symbol-name arg)))
(cond
((string-match "\\`&" name) arg)
(defun help-do-arg-highlight (doc args)
(with-syntax-table (make-syntax-table emacs-lisp-mode-syntax-table)
(modify-syntax-entry ?\- "w")
- (dolist (arg args doc)
+ (dolist (arg args)
(setq doc (replace-regexp-in-string
;; This is heuristic, but covers all common cases
;; except ARG1-ARG2
"\\(?:-[{([<`\"].*?\\)?"; for ARG-{x}, (x), <x>, [x], `x'
"\\>") ; end of word
(help-highlight-arg arg)
- doc t t 1)))))
+ doc t t 1)))
+ doc))
(defun help-highlight-arguments (usage doc &rest args)
(when (and usage (string-match "^(" usage))
;; so let's skip over it
(search-backward "(")
(goto-char (scan-sexps (point) 1)))))
- ;; Highlight aguments in the USAGE string
+ ;; Highlight arguments in the USAGE string
(setq usage (help-do-arg-highlight (buffer-string) args))
;; Highlight arguments in the DOC string
(setq doc (and doc (help-do-arg-highlight doc args))))))
(if (member (event-modifiers (aref key 0)) '(nil (shift)))
(push key non-modified-keys)))
(when remapped
- (princ "It is remapped to `")
+ (princ "Its keys are remapped to `")
(princ (symbol-name remapped))
- (princ "'"))
+ (princ "'.\n"))
(when keys
- (princ (if remapped ", which is bound to " "It is bound to "))
+ (princ (if remapped
+ "Without this remapping, it would be bound to "
+ "It is bound to "))
;; If lots of ordinary text characters run this command,
;; don't mention them one by one.
(if (< (length non-modified-keys) 10)
(with-current-buffer standard-output
(setq val-start-pos (point))
(princ "value is ")
- (let ((from (point)))
- (terpri)
- (pp val)
- (if (< (point) (+ 68 (line-beginning-position 0)))
- (delete-region from (1+ from))
- (delete-region (1- from) from))
+ (let ((from (point))
+ (line-beg (line-beginning-position))
+ ;;
+ (print-rep
+ (let ((print-quoted t))
+ (prin1-to-string val))))
+ (if (< (+ (length print-rep) (point) (- line-beg)) 68)
+ (insert print-rep)
+ (terpri)
+ (pp val)
+ (if (< (point) (+ 68 (line-beginning-position 0)))
+ (delete-region from (1+ from))
+ (delete-region (1- from) from)))
(let* ((sv (get variable 'standard-value))
(origval (and (consp sv)
(condition-case nil
(delete-region (1- from) from)))))))
(terpri)
(when locus
- (if (bufferp locus)
- (princ (format "%socal in buffer %s; "
- (if (get variable 'permanent-local)
- "Permanently l" "L")
- (buffer-name)))
- (princ (format "It is a frame-local variable; ")))
+ (cond
+ ((bufferp locus)
+ (princ (format "%socal in buffer %s; "
+ (if (get variable 'permanent-local)
+ "Permanently l" "L")
+ (buffer-name))))
+ ((framep locus)
+ (princ (format "It is a frame-local variable; ")))
+ ((terminal-live-p locus)
+ (princ (format "It is a terminal-local variable; ")))
+ (t
+ (princ (format "It is local to %S" locus))))
(if (not (default-boundp variable))
(princ "globally void")
(let ((val (default-value variable)))
(when obsolete
(setq extra-line t)
(princ " This variable is obsolete")
- (if (cdr obsolete) (princ (format " since %s" (cdr obsolete))))
+ (if (nth 2 obsolete)
+ (princ (format " since %s" (nth 2 obsolete))))
(princ (cond ((stringp use) (concat ";\n " use))
(use (format ";\n use `%s' instead." (car obsolete)))
(t ".")))