From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Nick Roberts Newsgroups: gmane.emacs.devel Subject: [PATCH] Forward button for help buffer Date: Thu, 7 Jun 2007 10:29:17 +1200 Message-ID: <18023.13629.716910.945060@kahikatea.snap.net.nz> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Trace: sea.gmane.org 1181168983 18561 80.91.229.12 (6 Jun 2007 22:29:43 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Wed, 6 Jun 2007 22:29:43 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Jun 07 00:29:41 2007 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1Hw40a-00067g-E6 for ged-emacs-devel@m.gmane.org; Thu, 07 Jun 2007 00:29:40 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Hw40Z-0006uY-Rq for ged-emacs-devel@m.gmane.org; Wed, 06 Jun 2007 18:29:39 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Hw40W-0006tZ-22 for emacs-devel@gnu.org; Wed, 06 Jun 2007 18:29:36 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Hw40V-0006sn-BV for emacs-devel@gnu.org; Wed, 06 Jun 2007 18:29:35 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Hw40V-0006sQ-4k for emacs-devel@gnu.org; Wed, 06 Jun 2007 18:29:35 -0400 Original-Received: from viper.snap.net.nz ([202.37.101.8]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Hw40U-0006TW-0u for emacs-devel@gnu.org; Wed, 06 Jun 2007 18:29:34 -0400 Original-Received: from kahikatea.snap.net.nz (25.62.255.123.dynamic.snap.net.nz [123.255.62.25]) by viper.snap.net.nz (Postfix) with ESMTP id 0DC473D9256 for ; Thu, 7 Jun 2007 10:29:31 +1200 (NZST) Original-Received: by kahikatea.snap.net.nz (Postfix, from userid 1000) id 79E248F9CE; Thu, 7 Jun 2007 10:29:18 +1200 (NZST) X-Mailer: VM 7.19 under Emacs 22.1.50.11 X-detected-kernel: Linux 2.4-2.6 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:72387 Archived-At: Here's a patch (from about two years ago!) that gives the help buffer a forward button so that, with the back button, it functions a bit like web browsers do. OK to apply to the trunk now? -- Nick http://www.inet.net.nz/~nickrob *** help-mode.el 21 Jan 2007 16:53:11 +1300 1.51 --- help-mode.el 07 Jun 2007 10:21:12 +1200 *************** *** 40,45 **** --- 40,46 ---- (define-key help-mode-map [mouse-2] 'help-follow-mouse) (define-key help-mode-map "\C-c\C-b" 'help-go-back) + (define-key help-mode-map "\C-c\C-f" 'help-go-forward) (define-key help-mode-map "\C-c\C-c" 'help-follow-symbol) ;; Documentation only, since we use minor-mode-overriding-map-alist. (define-key help-mode-map "\r" 'help-follow) *************** To use the element, do (apply FUNCTION A *** 52,64 **** --- 53,80 ---- (put 'help-xref-stack 'permanent-local t) (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. + 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.") + (put 'help-xref-forward-stack 'permanent-local t) + (make-variable-buffer-local 'help-xref-forward-stack) + (defvar help-xref-stack-item nil "An item for `help-follow' in this buffer to push onto `help-xref-stack'. The format is (FUNCTION ARGS...).") (put 'help-xref-stack-item 'permanent-local t) (make-variable-buffer-local 'help-xref-stack-item) + (defvar help-xref-stack-forward-item nil + "An item for `help-go-back' to push onto `help-xref-forward-stack'. + The format is (FUNCTION ARGS...).") + (put 'help-xref-stack-forward-item 'permanent-local t) + (make-variable-buffer-local 'help-xref-stack-forward-item) + (setq-default help-xref-stack nil help-xref-stack-item nil) + (setq-default help-xref-forward-stack nil help-xref-forward-stack-item nil) (defcustom help-mode-hook nil "Hook run by `help-mode'." *************** The format is (FUNCTION ARGS...).") *** 123,128 **** --- 139,149 ---- 'help-function #'help-xref-go-back 'help-echo (purecopy "mouse-2, RET: go back to previous help buffer")) + (define-button-type 'help-forward + :supertype 'help-xref + 'help-function #'help-xref-go-forward + 'help-echo (purecopy "mouse-2, RET: move forward to next help buffer")) + (define-button-type 'help-info :supertype 'help-xref 'help-function #'info *************** Commands: *** 242,247 **** --- 263,271 ---- (defvar help-back-label (purecopy "[back]") "Label to use by `help-make-xrefs' for the go-back reference.") + (defvar help-forward-label (purecopy "[forward]") + "Label to use by `help-make-xrefs' for the go-forward reference.") + (defconst help-xref-symbol-regexp (purecopy (concat "\\(\\<\\(\\(variable\\|option\\)\\|" ; Link to var "\\(function\\|command\\)\\|" ; Link to function *************** because we want to record the \"previous *** 286,292 **** restore it properly when going back." (with-current-buffer (help-buffer) (when help-xref-stack-item ! (push (cons (point) help-xref-stack-item) help-xref-stack)) (when interactive-p (let ((tail (nthcdr 10 help-xref-stack))) ;; Truncate the stack. --- 310,317 ---- restore it properly when going back." (with-current-buffer (help-buffer) (when help-xref-stack-item ! (push (cons (point) help-xref-stack-item) help-xref-stack) ! (setq help-xref-forward-stack nil)) (when interactive-p (let ((tail (nthcdr 10 help-xref-stack))) ;; Truncate the stack. *************** that." *** 480,485 **** --- 505,515 ---- (insert "\n") (help-insert-xref-button help-back-label 'help-back (current-buffer)) + (insert "\t")) + ;; Make a forward-reference in this buffer if appropriate. + (when help-xref-forward-stack + (help-insert-xref-button help-forward-label 'help-forward + (current-buffer)) (insert "\n"))) ;; View mode steals RET from us. (set (make-local-variable 'minor-mode-overriding-map-alist) *************** help buffer." *** 598,603 **** --- 628,634 ---- "From BUFFER, go back to previous help buffer text using `help-xref-stack'." (let (item position method args) (with-current-buffer buffer + (push (cons (point) help-xref-stack-item) help-xref-forward-stack) (when help-xref-stack (setq item (pop help-xref-stack) ;; Clear the current item so that it won't get pushed *************** help buffer." *** 613,624 **** --- 644,682 ---- (set-window-point (get-buffer-window buffer) position) (goto-char position))))) + (defun help-xref-go-forward (buffer) + "From BUFFER, go forward to next help buffer." + (let (item position method args) + (with-current-buffer buffer + (push (cons (point) help-xref-stack-item) help-xref-stack) + (when help-xref-forward-stack + (setq item (pop help-xref-forward-stack) + ;; Clear the current item so that it won't get pushed + ;; by the function we're about to call. TODO: We could also + ;; push it onto a "forward" stack and add a `forw' button. + help-xref-stack-item nil + position (car item) + method (cadr item) + args (cddr item)))) + (apply method args) + (with-current-buffer 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) + (if help-xref-forward-stack + (help-xref-go-forward (current-buffer)) + (error "No next help buffer"))) (defun help-do-xref (pos function args) "Call the help cross-reference function FUNCTION with args ARGS.