X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/7d5989e14aacad4aa0775339dab645db80ab7144..da2cfeef7a578a7d9010d45193938e706ff609bc:/lisp/help-mode.el diff --git a/lisp/help-mode.el b/lisp/help-mode.el index 075b893ad6..83313fdc51 100644 --- a/lisp/help-mode.el +++ b/lisp/help-mode.el @@ -1,17 +1,17 @@ ;;; help-mode.el --- `help-mode' used by *Help* buffers ;; Copyright (C) 1985, 1986, 1993, 1994, 1998, 1999, 2000, 2001, 2002, -;; 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +;; 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ;; Maintainer: FSF ;; Keywords: help, internal ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,9 +19,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -32,6 +30,7 @@ (require 'button) (require 'view) +(eval-when-compile (require 'easymenu)) (defvar help-mode-map (make-sparse-keymap) "Keymap for help mode.") @@ -45,6 +44,20 @@ ;; Documentation only, since we use minor-mode-overriding-map-alist. (define-key help-mode-map "\r" 'help-follow) +(easy-menu-define help-mode-menu help-mode-map + "Menu for Help Mode." + '("Help-Mode" + ["Show Help for Symbol" help-follow-symbol + :help "Show the docs for the symbol at point"] + ["Previous Topic" help-go-back + :help "Go back to previous topic in this help buffer"] + ["Next Topic" help-go-forward + :help "Go back to next topic in this help buffer"] + ["Move to Previous Button" backward-button + :help "Move to the Next Button in the help buffer"] + ["Move to Next Button" forward-button + :help "Move to the Next Button in the help buffer"])) + (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'. @@ -54,7 +67,7 @@ To use the element, do (apply FUNCTION ARGS) then goto the point.") (make-variable-buffer-local 'help-xref-stack) (defvar help-xref-forward-stack nil - "The stack of used to navigate help forwards after using the back button. + "A stack used to navigate help forwards after using the back button. Used by `help-follow' and `help-xref-go-forward'. An element looks like (POSITION FUNCTION ARGS...). To use the element, do (apply FUNCTION ARGS) then goto the point.") @@ -144,6 +157,12 @@ The format is (FUNCTION ARGS...).") 'help-function #'help-xref-go-forward 'help-echo (purecopy "mouse-2, RET: move forward to next help buffer")) +(define-button-type 'help-info-variable + :supertype 'help-xref + ;; the name of the variable is put before the argument to Info + 'help-function (lambda (a v) (info v)) + 'help-echo (purecopy "mouse-2, RET: read this Info node")) + (define-button-type 'help-info :supertype 'help-xref 'help-function #'info @@ -221,13 +240,22 @@ Commands: (use-local-map help-mode-map) (setq mode-name "Help") (setq major-mode 'help-mode) + (view-mode) - (make-local-variable 'view-no-disable-on-exit) - (setq view-no-disable-on-exit t) - (setq view-exit-action (lambda (buffer) - (or (window-minibuffer-p (selected-window)) - (one-window-p t) - (delete-window)))) + (set (make-local-variable 'view-no-disable-on-exit) t) + ;; With Emacs 22 `view-exit-action' could delete the selected window + ;; disregarding whether the help buffer was shown in that window at + ;; all. Since `view-exit-action' is called with the help buffer as + ;; argument it seems more appropriate to have it work on the buffer + ;; only and leave it to `view-mode-exit' to delete any associated + ;; window(s). + (setq view-exit-action + (lambda (buffer) + ;; Use `with-current-buffer' to make sure that `bury-buffer' + ;; also removes BUFFER from the selected window. + (with-current-buffer buffer + (bury-buffer)))) + (run-mode-hooks 'help-mode-hook)) ;;;###autoload @@ -237,16 +265,23 @@ Commands: ;;;###autoload (defun help-mode-finish () - (let ((entry (assq (selected-window) view-return-to-alist))) - (if entry - ;; When entering Help mode from the Help window, - ;; such as by following a link, preserve the same - ;; meaning for the q command. - ;; (setcdr entry (cons (selected-window) help-return-method)) - nil - (setq view-return-to-alist - (cons (cons (selected-window) help-return-method) - view-return-to-alist)))) + (if (eq help-window t) + ;; If `help-window' is t, `view-return-to-alist' is handled by + ;; `with-help-window'. In this case set `help-window' to the + ;; selected window since now is the only moment where we can + ;; unambiguously identify it. + (setq help-window (selected-window)) + (let ((entry (assq (selected-window) view-return-to-alist))) + (if entry + ;; When entering Help mode from the Help window, + ;; such as by following a link, preserve the same + ;; meaning for the q command. + ;; (setcdr entry (cons (selected-window) help-return-method)) + nil + (setq view-return-to-alist + (cons (cons (selected-window) help-return-method) + view-return-to-alist))))) + (when (eq major-mode 'help-mode) ;; View mode's read-only status of existing *Help* buffer is lost ;; by with-output-to-temp-buffer. @@ -321,6 +356,7 @@ restore it properly when going back." (defvar help-xref-following nil "Non-nil when following a help cross-reference.") +;;;###autoload (defun help-buffer () (buffer-name ;for with-output-to-temp-buffer (if help-xref-following @@ -461,9 +497,11 @@ that." ;; An obvious case of a key substitution: (save-excursion (while (re-search-forward - ;; Assume command name is only word characters - ;; and dashes to get things like `use M-x foo.'. - "\\bar'. + ;; Command required to end with word constituent + ;; to avoid `.' at end of a sentence. + "\\= (current-column) col) - (looking-at "\\(\\sw\\|-\\)+$")) + (looking-at "\\(\\sw\\|\\s_\\)+$")) (let ((sym (intern-soft (match-string 0)))) (if (fboundp sym) (help-xref-button 0 'help-function sym)))) @@ -666,14 +704,14 @@ help buffer." (if (get-buffer-window buffer) (set-window-point (get-buffer-window buffer) position) (goto-char position))))) - + (defun help-go-back () "Go back to previous topic in this help buffer." (interactive) (if help-xref-stack (help-xref-go-back (current-buffer)) (error "No previous help buffer"))) - + (defun help-go-forward () "Go back to next topic in this help buffer." (interactive)