(Buffer-menu-make-sort-button) Make sorting by mouse-2 work from a different window.
[bpt/emacs.git] / lisp / help.el
index fc43d8d..5a2867b 100644 (file)
 
 (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."
@@ -237,32 +240,35 @@ C-w Display information on absence of warranty for GNU Emacs."
 (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
@@ -428,7 +434,8 @@ We put that list in a buffer, and display the buffer.
 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))
@@ -651,32 +658,42 @@ whose documentation describes the minor mode."
                    (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))))