(define-key help-map "q" 'help-quit)
+;; insert-button makes the action nil if it is not store somewhere
+(defvar help-button-cache nil)
+
\f
(defun help-quit ()
"Just exit from the Help command's command loop."
(defun function-called-at-point ()
"Return a function around point or else called by the list containing point.
If that doesn't give a function, return nil."
- (with-syntax-table emacs-lisp-mode-syntax-table
- (or (condition-case ()
- (save-excursion
- (or (not (zerop (skip-syntax-backward "_w")))
- (eq (char-syntax (following-char)) ?w)
- (eq (char-syntax (following-char)) ?_)
- (forward-sexp -1))
- (skip-chars-forward "'")
- (let ((obj (read (current-buffer))))
- (and (symbolp obj) (fboundp obj) obj)))
- (error nil))
- (condition-case ()
- (save-excursion
- (save-restriction
- (narrow-to-region (max (point-min)
- (- (point) 1000)) (point-max))
- ;; Move up to surrounding paren, then after the open.
- (backward-up-list 1)
- (forward-char 1)
- ;; If there is space here, this is probably something
- ;; other than a real Lisp function call, so ignore it.
- (if (looking-at "[ \t]")
- (error "Probably not a Lisp function call"))
- (let ((obj (read (current-buffer))))
- (and (symbolp obj) (fboundp obj) obj))))
- (error nil)))))
+ (or (with-syntax-table emacs-lisp-mode-syntax-table
+ (or (condition-case ()
+ (save-excursion
+ (or (not (zerop (skip-syntax-backward "_w")))
+ (eq (char-syntax (following-char)) ?w)
+ (eq (char-syntax (following-char)) ?_)
+ (forward-sexp -1))
+ (skip-chars-forward "'")
+ (let ((obj (read (current-buffer))))
+ (and (symbolp obj) (fboundp obj) obj)))
+ (error nil))
+ (condition-case ()
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (max (point-min)
+ (- (point) 1000)) (point-max))
+ ;; Move up to surrounding paren, then after the open.
+ (backward-up-list 1)
+ (forward-char 1)
+ ;; If there is space here, this is probably something
+ ;; other than a real Lisp function call, so ignore it.
+ (if (looking-at "[ \t]")
+ (error "Probably not a Lisp function call"))
+ (let ((obj (read (current-buffer))))
+ (and (symbolp obj) (fboundp obj) obj))))
+ (error nil))))
+ (let* ((str (find-tag-default))
+ (obj (if str (read str))))
+ (and (symbolp obj) (fboundp obj) obj))))
\f
;;; `User' help functions
The optional argument PREFIX, if non-nil, should be a key sequence;
then we display only bindings that start with that prefix.
The optional argument BUFFER specifies which buffer's bindings
-to display (default, the current buffer)."
+to display (default, the current buffer). BUFFER can be a buffer
+or a buffer name."
(interactive)
(or buffer (setq buffer (current-buffer)))
(help-setup-xref (list #'describe-bindings prefix buffer) (interactive-p))
(lambda (a b) (string-lessp (car a) (car b)))))
(when minor-modes
(princ "Summary of minor modes:\n")
- (dolist (mode minor-modes)
- (let ((pretty-minor-mode (nth 0 mode))
- (indicator (nth 2 mode)))
- (princ (format " %s minor mode (%s):\n"
- pretty-minor-mode
- (if indicator
- (format "indicator%s" indicator)
- "no indicator")))))
+ (make-local-variable 'help-button-cache)
+ (with-current-buffer standard-output
+ (dolist (mode minor-modes)
+ (let ((pretty-minor-mode (nth 0 mode))
+ (mode-function (nth 1 mode))
+ (indicator (nth 2 mode)))
+ (add-text-properties 0 (length pretty-minor-mode)
+ '(face bold) pretty-minor-mode)
+ (save-excursion
+ (goto-char (point-max))
+ (princ "\n\f\n")
+ (push (point-marker) help-button-cache)
+ ;; Document the minor modes fully.
+ (insert pretty-minor-mode)
+ (princ (format " minor mode (%s):\n"
+ (if indicator
+ (format "indicator%s" indicator)
+ "no indicator")))
+ (princ (documentation mode-function)))
+ (princ " ")
+ (insert-button pretty-minor-mode
+ 'action (car help-button-cache)
+ 'help-echo "mouse-2, RET: show full information")
+ (princ (format " minor mode (%s):\n"
+ (if indicator
+ (format "indicator%s" indicator)
+ "no indicator"))))))
(princ "\n(Full information about these minor modes
follows the description of the major mode.)\n\n"))
;; Document the major mode.
- (princ mode-name)
+ (let ((mode mode-name))
+ (with-current-buffer standard-output
+ (insert mode)
+ (add-text-properties (- (point) (length mode)) (point) '(face bold))))
(princ " mode:\n")
- (princ (documentation major-mode))
- ;; Document the minor modes fully.
- (dolist (mode minor-modes)
- (let ((pretty-minor-mode (nth 0 mode))
- (mode-function (nth 1 mode))
- (indicator (nth 2 mode)))
- (princ "\n\f\n")
- (princ (format "%s minor mode (%s):\n"
- pretty-minor-mode
- (if indicator
- (format "indicator%s" indicator)
- "no indicator")))
- (princ (documentation mode-function)))))
+ (princ (documentation major-mode)))
(print-help-return-message))))