branch: externals/doc-view-follow
commit 490c1967baba978cbed7883def0b89d90b67e267
Author: Paul Nelson <ultr...@gmail.com>
Commit: Paul Nelson <ultr...@gmail.com>

    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.
---
 doc-view-follow.el | 57 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 48 insertions(+), 9 deletions(-)

diff --git a/doc-view-follow.el b/doc-view-follow.el
index dc6a03912c..b317e3fdee 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)))
 

Reply via email to