Browser-like Info-history button menu (bug#37184)

* doc/misc/info.texi (Help-Int): Using tool-bar to navigate history.

* lisp/info.el (Info-history-menu): New function.
(Info-history-back-menu, Info-history-forward-menu): New commands.
(Info-mode-map): Bind Info-history-back-menu and
Info-history-forward-menu to tool-bar on C-key.
This commit is contained in:
Juri Linkov 2019-08-27 23:48:57 +03:00
parent ba1f7797fb
commit ba5d9795f8
3 changed files with 45 additions and 0 deletions

View file

@ -886,6 +886,14 @@ which the header says is the @samp{Previous} node (from this node, the
to revisit nodes in the history list in the forward direction, so that
@kbd{r} will return you to the node you came from by typing @kbd{l}.
@cindex using tool-bar to navigate history
Clicking the mouse on the left arrow icon in the tool-bar while
holding down the @key{CTRL} key in Emacs opens a menu of previously
visited nodes: the same nodes that you can revisit by
@code{Info-history-back}. Selecting a node after clicking on the
right arrow icon revisits the same nodes as available by
@code{Info-history-forward}.
@kindex L @r{(Info mode)}
@findex Info-history
@cindex history list of visited nodes

View file

@ -953,6 +953,11 @@ early init file.
** Info
+++
*** Clicking on the left/right arrow icon in the Info tool-bar while
holding down the Ctrl key pops up a menu of previously visited Info nodes
where you can select a node to go back (like in browsers).
---
*** Info can now follow 'file://' protocol URLs.
The 'file://' URLs in Info documents can now be followed by passing

View file

@ -4059,6 +4059,8 @@ If FORK is non-nil, it is passed to `Info-goto-node'."
(define-key map [follow-link] 'mouse-face)
(define-key map [XF86Back] 'Info-history-back)
(define-key map [XF86Forward] 'Info-history-forward)
(define-key map [tool-bar C-Back\ in\ history] 'Info-history-back-menu)
(define-key map [tool-bar C-Forward\ in\ history] 'Info-history-forward-menu)
map)
"Keymap containing Info commands.")
@ -4151,6 +4153,36 @@ If FORK is non-nil, it is passed to `Info-goto-node'."
:vert-only t)
map))
(defun Info-history-menu (e name history command)
(let* ((i (length history))
(map (make-sparse-keymap name)))
(mapc (lambda (history)
(let ((file (nth 0 history))
(node (nth 1 history)))
(when (stringp file)
(setq file (file-name-sans-extension
(file-name-nondirectory file))))
(define-key map (vector (intern (format "history-%i" i)))
`(menu-item ,(format "(%s) %s" file node)
(lambda ()
(interactive)
(dotimes (_ ,i) (call-interactively ',command))))))
(setq i (1- i)))
(reverse history))
(let* ((selection (x-popup-menu e map))
(binding (and selection (lookup-key map (vector (car selection))))))
(if binding (call-interactively binding)))))
(defun Info-history-back-menu (e)
"Pop up the menu with a list of previously visited Info nodes."
(interactive "e")
(Info-history-menu e "Back in history" Info-history 'Info-history-back))
(defun Info-history-forward-menu (e)
"Pop up the menu with a list of Info nodes visited with Info-history-back."
(interactive "e")
(Info-history-menu e "Forward in history" Info-history-forward 'Info-history-forward))
(defvar Info-menu-last-node nil)
;; Last node the menu was created for.
;; Value is a list, (FILE-NAME NODE-NAME).