Add buffer-local register commands to DocView

* lisp/doc-view.el (doc-view-register-alist): New defvar to keep
track of buffer-local register-alist.
(doc-view-page-to-register, doc-view-jump-to-register): Add new
commands to set and jump to buffer-local registers.
(register-val-insert, register-val-describe)
(register-val-jump-to): Register defmethod to save and restore
doc-view registers.
(doc-view-mode-map): Bind the new commands.
* doc/emacs/misc.texi (DocView Navigation): Document the new
commands.  (Bug#73293)
* etc/NEWS: Announce the change.
This commit is contained in:
Visuwesh 2024-09-15 13:56:21 +05:30 committed by Eli Zaretskii
parent bba14a2767
commit fb3aa69356
3 changed files with 69 additions and 1 deletions

View file

@ -593,6 +593,16 @@ can further customize how @code{imenu} items are formatted and
displayed using the variables @code{doc-view-imenu-format} and
@code{doc-view-imenu-flatten}.
@findex doc-view-page-to-register
@findex doc-view-jump-to-register
@kindex m @r{(DocView mode)}
@kindex ' @r{(DocView mode)}
You can save the current page to a register with @kbd{m}
(@code{doc-view-page-to-register}) (@pxref{Registers}). However, these
registers are not shared across buffers and stay local to the DocView
buffer. You can later jump to the register with @kbd{'}
(@code{doc-view-jump-to-register}).
@node DocView Searching
@subsection DocView Searching

View file

@ -345,6 +345,12 @@ When switching to the plain text contents with 'doc-view-open-text',
DocView now creates a dedicated buffer to display it. 'C-c C-c' gets you
back to real DocView buffer if it still exists.
+++
*** New commands to save and restore pages in buffer local registers.
Docview can store current page to buffer local registers with the new
command 'doc-view-page-to-register' (bound to 'm'), and later can be
restored with 'doc-view-jump-to-register' (bound to ''').
** Tramp
+++

View file

@ -556,7 +556,10 @@ Typically \"page-%s.png\".")
"C-c C-c" #'doc-view-toggle-display
;; Open a new buffer with doc's text contents
"C-c C-t" #'doc-view-open-text
"r" #'revert-buffer)
"r" #'revert-buffer
;; Registers
"m" #'doc-view-page-to-register
"'" #'doc-view-jump-to-register)
(define-obsolete-function-alias 'doc-view-revert-buffer #'revert-buffer "27.1")
(defvar revert-buffer-preserve-modes)
@ -2468,6 +2471,55 @@ See the command `doc-view-mode' for more information on this mode."
(put 'doc-view-bookmark-jump 'bookmark-handler-type "DocView")
;;; Register integration
(defvar-local doc-view-register-alist nil
"Register alist containing only doc-view registers for current buffer.
Each doc-view register entry is of the form (doc-view . ALIST) where
ALIST has the keys `buffer', `file', and `page'. `buffer' is the buffer
the `file' is visiting. `page' is the page number to be show.")
(defun doc-view-page-to-register (register)
"Store the current page to the register REGISTER."
(interactive
(let ((register-alist doc-view-register-alist))
(list (register-read-with-preview "Page to register: "))))
(let ((register-alist doc-view-register-alist))
(set-register register
`(doc-view
(buffer . ,(current-buffer))
(file . ,(buffer-file-name))
(page . ,(doc-view-current-page))))
(setq doc-view-register-alist register-alist)))
(defun doc-view-jump-to-register (register)
"Jump to the register REGISTER."
(interactive
(let ((register-alist doc-view-register-alist))
(list (register-read-with-preview "Jump to register: "))))
(let ((register-alist doc-view-register-alist))
(jump-to-register register)))
(cl-defmethod register-val-insert ((val (head doc-view)))
(prin1 val))
(cl-defmethod register-val-describe ((val (head doc-view)) _verbose)
(let* ((alist (cdr val))
(name (or (file-name-nondirectory (alist-get 'file alist))
(buffer-name (alist-get 'buffer alist)))))
(princ name)
(princ " p. ")
(princ (alist-get 'page alist))))
(cl-defmethod register-val-jump-to ((val (head doc-view)) _arg)
(let* ((alist (cdr val))
(buffer (or (alist-get 'buffer alist)
(find-buffer-visiting (alist-get 'file alist)))))
(unless buffer
(user-error "Cannot find the doc-view buffer to jump to"))
(switch-to-buffer buffer)
(doc-view-goto-page (alist-get 'page alist))))
;; Obsolete.
(defun doc-view-intersection (l1 l2)