branch: elpa/hyperdrive
commit 16d7963b6a8195e081c2e23a157f73797f0697a5
Merge: 73006298c8 0809111811
Author: Adam Porter <a...@alphapapa.net>
Commit: Adam Porter <a...@alphapapa.net>

    Merge branch 'wip/find-in-other-window'
---
 hyperdrive-dir.el     | 46 +++++++++++++++++++++++++++++-----------------
 hyperdrive-history.el | 29 +++++++++++++++++++++++------
 hyperdrive-lib.el     | 27 +++++++++++++++------------
 hyperdrive-menu.el    | 12 +++++-------
 hyperdrive.el         | 10 +++++++---
 5 files changed, 79 insertions(+), 45 deletions(-)

diff --git a/hyperdrive-dir.el b/hyperdrive-dir.el
index 7de84da566..ac4ebfedb8 100644
--- a/hyperdrive-dir.el
+++ b/hyperdrive-dir.el
@@ -41,8 +41,7 @@
 ;;;###autoload
 (cl-defun hyperdrive-dir-handler (directory-entry &key then)
   "Show DIRECTORY-ENTRY.
-If THEN, call it in the directory buffer with no arguments after
-the metadata has been loaded."
+If THEN, call it in the directory buffer with no arguments."
   ;; NOTE: ENTRY is not necessarily "filled" yet.
   ;; TODO: Set a timer and say "Opening URL..." if entry doesn't load
   ;; in a couple of seconds (same in hyperdrive-handler-default)
@@ -98,9 +97,7 @@ the metadata has been loaded."
                                                (or (when prev-entry
                                                      (goto-entry prev-entry 
ewoc))
                                                    (goto-char prev-point)))
-                                             (set-buffer-modified-p nil)
-                                             (when then
-                                               (funcall then)))
+                                             (set-buffer-modified-p nil))
                                            ;; TODO: Remove this and the 
commented out `debug-start-time'
                                            ;; binding when we're done 
experimenting.
                                            ;; (message "Elapsed: %s"
@@ -117,7 +114,8 @@ the metadata has been loaded."
               :then (lambda (&rest _)
                       (update-footer (cl-incf num-filled) num-entries))))
           (plz-run metadata-queue)
-          (display-buffer (current-buffer) 
hyperdrive-directory-display-buffer-action))))))
+          (when then
+            (funcall then)))))))
 
 (defun hyperdrive-dir-column-headers (prefix)
   "Return column headers as a string with PREFIX.
@@ -241,6 +239,7 @@ With point on header, returns directory entry."
   :parent hyperdrive-ewoc-mode-map
   :doc "Local keymap for `hyperdrive-dir-mode' buffers."
   "RET" #'hyperdrive-dir-find-file
+  "o"   #'hyperdrive-dir-find-file-other-window
   "v"   #'hyperdrive-dir-view-file
   "j"   #'imenu
   "w"   #'hyperdrive-dir-copy-url
@@ -271,16 +270,29 @@ With point on header, returns directory entry."
   "Find entry at EVENT's position."
   (interactive "e")
   (mouse-set-point event)
-  (call-interactively #'hyperdrive-dir-find-file))
+  (call-interactively #'hyperdrive-dir-find-file-other-window))
 
-(defun hyperdrive-dir-find-file (entry)
+(cl-defun hyperdrive-dir-find-file
+    (entry &key (display-buffer-action 
hyperdrive-directory-display-buffer-action))
   "Visit hyperdrive ENTRY at point.
 Interactively, visit file or directory at point in
+`hyperdrive-dir' buffer.  DISPLAY-BUFFER-ACTION is passed to
+`pop-to-buffer'."
+  (declare (modes hyperdrive-dir-mode))
+  (interactive (list (or (hyperdrive-dir--entry-at-point)
+                         (hyperdrive-user-error "No file/directory at 
point"))))
+  (hyperdrive-open entry
+    :then (lambda ()
+            (pop-to-buffer (current-buffer) display-buffer-action))))
+
+(defun hyperdrive-dir-find-file-other-window (entry)
+  "Visit hyperdrive ENTRY at point in other window.
+Interactively, visit file or directory at point in
 `hyperdrive-dir' buffer."
   (declare (modes hyperdrive-dir-mode))
-  (interactive (list (hyperdrive-dir--entry-at-point)))
-  (cl-assert entry nil "No file/directory at point")
-  (hyperdrive-open entry))
+  (interactive (list (or (hyperdrive-dir--entry-at-point)
+                         (hyperdrive-user-error "No file/directory at 
point"))))
+  (hyperdrive-dir-find-file entry :display-buffer-action t))
 
 (declare-function hyperdrive-view-file "hyperdrive")
 (defun hyperdrive-dir-view-file (entry)
@@ -288,8 +300,8 @@ Interactively, visit file or directory at point in
 Interactively, opens file or directory at point in
 `hyperdrive-dir' buffer."
   (declare (modes hyperdrive-dir-mode))
-  (interactive (list (hyperdrive-dir--entry-at-point)))
-  (cl-assert entry nil "No file/directory at point")
+  (interactive (list (or (hyperdrive-dir--entry-at-point)
+                         (hyperdrive-user-error "No file/directory at 
point"))))
   (hyperdrive-view-file entry))
 
 (declare-function hyperdrive-copy-url "hyperdrive")
@@ -297,16 +309,16 @@ Interactively, opens file or directory at point in
 (defun hyperdrive-dir-copy-url (entry)
   "Copy URL of ENTRY into the kill ring."
   (declare (modes hyperdrive-dir-mode))
-  (interactive (list (hyperdrive-dir--entry-at-point)))
-  (cl-assert entry nil "No file/directory at point")
+  (interactive (list (or (hyperdrive-dir--entry-at-point)
+                         (hyperdrive-user-error "No file/directory at 
point"))))
   (hyperdrive-copy-url entry))
 
 (declare-function hyperdrive-history "hyperdrive-history")
 
 (defun hyperdrive-dir-history (entry)
   "Display version history for ENTRY at point."
-  (interactive (list (hyperdrive-dir--entry-at-point)))
-  (cl-assert entry nil "No file/directory at point")
+  (interactive (list (or (hyperdrive-dir--entry-at-point)
+                         (hyperdrive-user-error "No file/directory at 
point"))))
   (hyperdrive-history entry))
 
 (defun hyperdrive-create-directory-no-op ()
diff --git a/hyperdrive-history.el b/hyperdrive-history.el
index 262f0df5bf..130e6d8994 100644
--- a/hyperdrive-history.el
+++ b/hyperdrive-history.el
@@ -37,7 +37,7 @@
   "Find entry at EVENT's position."
   (interactive "e")
   (mouse-set-point event)
-  (call-interactively #'hyperdrive-history-find-file))
+  (call-interactively #'hyperdrive-history-find-file-other-window))
 
 (defun hyperdrive-history-pp (thing)
   "Pretty-print THING.
@@ -124,6 +124,7 @@ and ENTRY's version are nil."
   :parent  hyperdrive-ewoc-mode-map
   :doc "Local keymap for `hyperdrive-history-mode' buffers."
   "RET" #'hyperdrive-history-find-file
+  "o"   #'hyperdrive-history-find-file-other-window
   "v"   #'hyperdrive-history-view-file
   "="   #'hyperdrive-history-diff
   "+"   #'hyperdrive-history-fill-version-ranges
@@ -257,11 +258,13 @@ Interactively, diff range entry at point with previous 
entry."
     :then (lambda ()
             (pop-to-buffer (current-buffer)))))
 
-(defun hyperdrive-history-find-file (range-entry)
+(cl-defun hyperdrive-history-find-file
+    (range-entry &key (then (lambda ()
+                              (pop-to-buffer (current-buffer) 
'(display-buffer-same-window)))))
   "Visit hyperdrive entry in RANGE-ENTRY at point.
-When entry does not exist, does nothing and returns nil.
-When entry is not known to exist, attempts to load entry at
-RANGE-ENTRY's RANGE-END.
+Then call THEN.  When entry does not exist, does nothing and
+returns nil.  When entry is not known to exist, attempts to load
+entry at RANGE-ENTRY's RANGE-END.
 
 Interactively, visit entry at point in `hyperdrive-history'
 buffer."
@@ -270,7 +273,7 @@ buffer."
   (pcase-exhaustive (hyperdrive-range-entry-exists-p range-entry)
     ('t
      ;; Known to exist: open it.
-     (hyperdrive-open (cdr range-entry)))
+     (hyperdrive-open (cdr range-entry) :then then))
     ('nil
      ;; Known to not exist: warn user.
      (hyperdrive-user-error "File does not exist!"))
@@ -278,6 +281,20 @@ buffer."
      ;; Not known to exist: fill version ranges:
      (hyperdrive-history-fill-version-ranges range-entry))))
 
+(defun hyperdrive-history-find-file-other-window (range-entry)
+  "Visit hyperdrive entry in RANGE-ENTRY at point in other window.
+Then call THEN.  When entry does not exist, does nothing and
+returns nil.  When entry is not known to exist, attempts to load
+entry at RANGE-ENTRY's RANGE-END.
+
+Interactively, visit entry at point in `hyperdrive-history'
+buffer."
+  (declare (modes hyperdrive-history-mode))
+  (interactive (list (hyperdrive-history-range-entry-at-point)))
+  (hyperdrive-history-find-file
+   range-entry :then (lambda ()
+                       (pop-to-buffer (current-buffer) t))))
+
 (declare-function hyperdrive-view-file "hyperdrive")
 (defun hyperdrive-history-view-file (range-entry)
   "Open hyperdrive entry in RANGE-ENTRY at point in `view-mode'.
diff --git a/hyperdrive-lib.el b/hyperdrive-lib.el
index e2696160c9..7c6b24d4fa 100644
--- a/hyperdrive-lib.el
+++ b/hyperdrive-lib.el
@@ -488,7 +488,10 @@ Sends a request to the gateway for hyperdrive's latest 
version."
         ('unknown 'unknown)))))
 
 (declare-function hyperdrive-history "hyperdrive-history")
-(cl-defun hyperdrive-open (entry &key then recurse (createp t))
+(cl-defun hyperdrive-open
+    (entry &key recurse (createp t)
+           (then (lambda ()
+                   (pop-to-buffer (current-buffer) 
'(display-buffer-same-window)))))
   "Open hyperdrive ENTRY.
 If RECURSE, proceed up the directory hierarchy if given path is
 not found.  THEN is a function to pass to the handler which will
@@ -1242,11 +1245,6 @@ If then, then call THEN with no arguments.  Default 
handler."
                         buffer-read-only (or (not (hyperdrive-writablep 
hyperdrive)) version))
                   (set-buffer-modified-p nil)
                   (set-visited-file-modtime (current-time))))
-              ;; TODO: Option to defer showing buffer.
-              ;; It seems that `pop-to-buffer' is moving point, even
-              ;; though it shouldn't, so we call it here, before going
-              ;; to a link target.
-              (pop-to-buffer (current-buffer))
               (when target
                 (pcase major-mode
                   ('org-mode
@@ -1288,12 +1286,17 @@ If `hyperdrive-render-html' is non-nil, render HTML with
 `shr-insert-document', then calls THEN if given.  Otherwise, open
 with `hyperdrive-handler-default'."
   (if hyperdrive-render-html
-      (progn
-        (eww (hyperdrive-entry-url entry))
-        ;; Set `hyperdrive-current-entry' and use `hyperdrive-mode'
-        ;; for remapped keybindings for, e.g., `hyperdrive-up'.
-        (setq-local hyperdrive-current-entry entry)
-        (hyperdrive-mode)
+      (let (buffer)
+        (save-window-excursion
+          ;; Override EWW's calling `pop-to-buffer-same-window'; we
+          ;; want our callback to display the buffer.
+          (eww (hyperdrive-entry-url entry))
+          ;; Set `hyperdrive-current-entry' and use `hyperdrive-mode'
+          ;; for remapped keybindings for, e.g., `hyperdrive-up'.
+          (setq-local hyperdrive-current-entry entry)
+          (hyperdrive-mode)
+          (setq buffer (current-buffer)))
+        (set-buffer buffer)
         (when then
           (funcall then)))
     (hyperdrive-handler-default entry :then then)))
diff --git a/hyperdrive-menu.el b/hyperdrive-menu.el
index d148523f64..70fc26c170 100644
--- a/hyperdrive-menu.el
+++ b/hyperdrive-menu.el
@@ -125,14 +125,12 @@
                  (propertize (hyperdrive--format-path (hyperdrive-entry-path 
entry))
                              'face 'transient-value))))
      ("g" "Refresh" revert-buffer)
-     ("^" "Up to parent" (lambda ()
-                           (interactive)
-                           (hyperdrive-up (oref transient-current-prefix scope)
-                                          :then (lambda ()
-                                                  (call-interactively 
#'hyperdrive-menu))))
+     ("^" "Up to parent"
+      (lambda ()
+        (interactive)
+        (hyperdrive-up (oref transient-current-prefix scope)))
       :inapt-if-not (lambda ()
-                      (hyperdrive-parent (oref transient--prefix scope)))
-      :transient t)
+                      (hyperdrive-parent (oref transient--prefix scope))))
      ("s" "Sort" hyperdrive-dir-sort
       :if (lambda ()
             (eq major-mode 'hyperdrive-dir-mode))
diff --git a/hyperdrive.el b/hyperdrive.el
index aae4740529..135e2c068a 100644
--- a/hyperdrive.el
+++ b/hyperdrive.el
@@ -525,7 +525,7 @@ hyperdrive directory listing or a `hyperdrive-mode' file 
buffer."
     (kill-new url)
     (hyperdrive-message "%s" url)))
 
-(cl-defun hyperdrive-up (entry &key then)
+(cl-defun hyperdrive-up (entry &key (then nil then-set-p))
   "Go up to parent directory of ENTRY.
 Interactively, use the `hyperdrive-current-entry'.  If THEN, pass
 it to `hyperdrive-open'."
@@ -536,7 +536,10 @@ it to `hyperdrive-open'."
                  (list hyperdrive-current-entry)))
   (if-let ((parent (hyperdrive-parent entry)))
       ;; TODO: Go to entry in parent directory.
-      (hyperdrive-open parent :then then)
+      (if then-set-p
+          (hyperdrive-open parent :then then)
+        ;; Allow default callback to be used.
+        (hyperdrive-open parent))
     (hyperdrive-user-error "At root directory")))
 
 (defvar-keymap hyperdrive-up-map
@@ -603,7 +606,8 @@ Works in `hyperdrive-mode' and `hyperdrive-dir-mode' 
buffers."
              ;; name could change in the future, and that would make
              ;; the record invalid, which would cause
              ;; `bookmark-default-handler' to signal an error.
-             (append bookmark `((buffer . ,(current-buffer))))))))
+             (append bookmark `((buffer . ,(current-buffer)))))
+            (pop-to-buffer (current-buffer) '(display-buffer-same-window)))))
 (put 'hyperdrive-bookmark-handler 'bookmark-handler-type "hyperdrive")
 
 (defun hyperdrive-bookmark-jump (bookmark)

Reply via email to