diff options
| author | Paul Nelson <ultrono@gmail.com> | 2025-04-13 13:40:47 +0200 |
|---|---|---|
| committer | Paul Nelson <ultrono@gmail.com> | 2025-04-13 13:40:47 +0200 |
| commit | 490c1967baba978cbed7883def0b89d90b67e267 (patch) | |
| tree | 50b5e5c610a7069e2d8eca5ab8858620289a9edf | |
| parent | 79a1cab807acffc96b1ccc15a28948c9d718b204 (diff) | |
Add prefix map
* doc-view-follow.el (doc-view-follow-mode-submap): New keymap for
Follow mode commands.
(doc-view-follow-mode-prefix-key): New variable to store prefix key.
(doc-view-follow--update-prefix-key): New function to handle prefix
key changes.
(doc-view-follow-mode-map): Add submap binding.
(doc-view-follow-mode): Add documentation for follow-mode commands.
(doc-view-follow-get-page): For pdf-view-mode, use
image-mode-window-get instead of pdf-view-current-page. This avoids
some issue with pdf-view-current-page not being defined on startup.
| -rw-r--r-- | doc-view-follow.el | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/doc-view-follow.el b/doc-view-follow.el index dc6a039..b317e3f 100644 --- a/doc-view-follow.el +++ b/doc-view-follow.el @@ -56,13 +56,39 @@ "Synchronize pages between windows displaying the same document." :group 'convenience) +(defvar-keymap doc-view-follow-mode-submap + "1" #'follow-delete-other-windows-and-split + "b" #'follow-switch-to-buffer + "C-b" #'follow-switch-to-buffer-all + "<" #'follow-first-window + ">" #'follow-last-window + "n" #'follow-next-window + "p" #'follow-previous-window) + +(defvar doc-view-follow-mode-prefix-key follow-mode-prefix-key + "Prefix key to use for follow commands in Doc View Follow mode. +By default, this matches `follow-mode-prefix-key'.") + +(defun doc-view-follow--update-prefix-key (_sym newval op _where) + "Update doc-view-follow mode keymap when the prefix key changes. +Called when `follow-mode-prefix-key' is customized." + (when (and (eq op 'set) (boundp 'doc-view-follow-mode-map)) + (keymap-unset doc-view-follow-mode-map doc-view-follow-mode-prefix-key t) + (setq doc-view-follow-mode-prefix-key newval) + (keymap-set doc-view-follow-mode-map newval doc-view-follow-mode-submap))) + +(add-variable-watcher + 'follow-mode-prefix-key #'doc-view-follow--update-prefix-key) + (defvar-keymap doc-view-follow-mode-map - :doc "Keymap for `doc-view-follow-mode'." "<remap> <doc-view-first-page>" #'doc-view-follow-beginning-of-buffer "<remap> <doc-view-last-page>" #'doc-view-follow-end-of-buffer "<remap> <pdf-view-first-page>" #'doc-view-follow-beginning-of-buffer "<remap> <pdf-view-last-page>" #'doc-view-follow-end-of-buffer) +(keymap-set doc-view-follow-mode-map + doc-view-follow-mode-prefix-key doc-view-follow-mode-submap) + ;;;###autoload (cl-defgeneric doc-view-follow-supported-p (_mode) "Check if MODE supports `doc-view-follow-mode'." @@ -93,7 +119,7 @@ (defun doc-view-follow-beginning-of-buffer () "Navigate to the beginning of the document, Doc-View-Follow mode style. - + This selects the first window in the window chain and displays the first page of the document in that window. Other windows in the chain will display consecutive pages." @@ -106,7 +132,7 @@ display consecutive pages." (defun doc-view-follow-end-of-buffer () "Navigate to the end of the document, Doc-View-Follow mode style. - + This selects the last window in the window chain and displays the last page of the document in that window." (interactive) @@ -119,7 +145,17 @@ page of the document in that window." ;;;###autoload (define-minor-mode doc-view-follow-mode - "Minor mode to sync pages between document windows." + "Minor mode to sync pages between document windows. + +With `doc-view-follow-mode' enabled, navigating pages in one window +automatically adjusts the other windows to show adjacent pages. This +allows a \"book view\" where the document is shown in multiple windows +displaying consecutive pages. + +The following commands are available on the keymap bound to the value of +`follow-mode-prefix': + +\\{doc-view-follow-mode-submap}" :global nil :keymap doc-view-follow-mode-map (unless (doc-view-follow-supported-p major-mode) @@ -158,14 +194,15 @@ page of the document in that window." (declare-function doc-view-goto-page "doc-view") (declare-function doc-view-last-page-number "doc-view") (declare-function doc-view-current-page "doc-view") - + (cl-defmethod doc-view-follow-supported-p ((_mode (eql doc-view-mode))) t) (cl-defmethod doc-view-follow-setup ((_mode (eql doc-view-mode))) (advice-add 'doc-view-goto-page :after #'doc-view-follow-sync-pages)) (cl-defmethod doc-view-follow-teardown ((_mode (eql doc-view-mode))) (advice-remove 'doc-view-goto-page #'doc-view-follow-sync-pages)) (cl-defmethod doc-view-follow-set-page (page (_mode (eql doc-view-mode))) - (doc-view-goto-page (max 1 (min page (doc-view-follow-get-page-count 'doc-view-mode))))) + (doc-view-goto-page + (max 1 (min page (doc-view-follow-get-page-count 'doc-view-mode))))) (cl-defmethod doc-view-follow-get-page ((_mode (eql doc-view-mode))) (doc-view-current-page)) (cl-defmethod doc-view-follow-get-page-count ((_mode (eql doc-view-mode))) @@ -174,7 +211,6 @@ page of the document in that window." (with-eval-after-load 'pdf-tools (declare-function pdf-view-goto-page "pdf-view") (declare-function pdf-cache-number-of-pages "pdf-cache") - (declare-function pdf-view-current-page "pdf-view") (defvar pdf-view-inhibit-redisplay) (cl-defmethod doc-view-follow-supported-p ((_mode (eql pdf-view-mode))) t) (cl-defmethod doc-view-follow-setup ((_mode (eql pdf-view-mode))) @@ -185,9 +221,12 @@ page of the document in that window." #'doc-view-follow-sync-pages t)) (cl-defmethod doc-view-follow-set-page (page (_mode (eql pdf-view-mode))) (let ((pdf-view-inhibit-redisplay nil)) - (pdf-view-goto-page (max 1 (min page (doc-view-follow-get-page-count 'pdf-view-mode)))))) + (pdf-view-goto-page + (max 1 (min page (doc-view-follow-get-page-count 'pdf-view-mode)))))) (cl-defmethod doc-view-follow-get-page ((_mode (eql pdf-view-mode))) - (pdf-view-current-page)) + (require 'image-mode) + (declare-function image-mode-window-get "image-mode") + (image-mode-window-get 'page)) (cl-defmethod doc-view-follow-get-page-count ((_mode (eql pdf-view-mode))) (pdf-cache-number-of-pages))) |
