branch: externals/dired-preview commit 3f2588abb3124ecb12b280261cc1985d4cd8d285 Author: Protesilaos Stavrou <i...@protesilaos.com> Commit: Protesilaos Stavrou <i...@protesilaos.com>
Make all preview state be handled by the trigger This way we simplify other functions, while making the open/close behaviour predictable. Thanks to Bruno Boal for taking a look into this with me: <https://git.sr.ht/~bboal>. This was done in a private channel and the information is shared with permission. --- dired-preview.el | 83 +++++++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 46 deletions(-) diff --git a/dired-preview.el b/dired-preview.el index b61f5ded41..81adeee873 100644 --- a/dired-preview.el +++ b/dired-preview.el @@ -181,14 +181,6 @@ See user option `dired-preview-ignored-extensions-regexp'." (window (get-buffer-window buffer))) (window-live-p window))) -(defun dired-preview--preview-p (file) - "Return non-nil if FILE can be previewed." - (and (file-exists-p file) - (not (file-directory-p file)) - (not (dired-preview--file-displayed-p file)) - (not (dired-preview--file-ignored-p file)) - (not (dired-preview--file-large-p file)))) - (defun dired-preview--delete-windows () "Delete preview windows." (mapc @@ -213,11 +205,8 @@ See user option `dired-preview-ignored-extensions-regexp'." (dired-preview--delete-windows)) (defun dired-preview--return-preview-buffer (file) - "Return buffer to preview FILE in. -Determine the propriety of this action by checking that FILE -conforms with `dired-preview--preview-p'." - (when (dired-preview--preview-p file) - (dired-preview--add-to-previews file))) + "Return buffer to preview FILE in." + (dired-preview--add-to-previews file)) (defun dired-preview--close-previews-outside-dired () "Call `dired-preview--close-previews' if BUFFER is not in Dired mode." @@ -234,31 +223,13 @@ conforms with `dired-preview--preview-p'." (defun dired-preview--display-buffer (buffer) "Call `display-buffer' for BUFFER. Only do it with the current major mode is Dired." - ;; We check for `dired-mode' because we want to avoid the scenario - ;; where the user switches to another buffer/window/frame before the - ;; timer elapses. - (when-let* (((eq major-mode 'dired-mode)) - ;; FIXME 2023-06-29: We check again for the file in Dired - ;; because this function runs on a timer and we only want - ;; it to happen if the file at point is still the one we - ;; were about to display. There probably is a better way - ;; of doing things, given that `dired-file-name-at-point' - ;; is called by the `dired-preview-display-file' that - ;; ultimately calls this one. - (file (dired-file-name-at-point)) - ((eq buffer (get-file-buffer file)))) - (display-buffer - buffer - dired-preview-display-action-alist) - (dired-preview-set-up-preview-window buffer))) - -(defun dired-preview-display-file () - "Display preview of `dired-file-name-at-point' if appropriate. -Return buffer object of displayed buffer." - (if-let* ((file (dired-file-name-at-point)) - (buffer (dired-preview--return-preview-buffer file))) - (dired-preview--display-buffer buffer) - (dired-preview--close-previews))) + (display-buffer buffer dired-preview-display-action-alist) + (dired-preview-set-up-preview-window buffer)) + +(defun dired-preview-display-file (file) + "Display preview of FILE if appropriate." + (when-let ((buffer (dired-preview--return-preview-buffer file))) + (dired-preview--display-buffer buffer))) (defvar dired-preview-trigger-commands '(dired-next-line dired-previous-line dired-mark dired-goto-file) @@ -272,18 +243,38 @@ Return buffer object of displayed buffer." (when (timerp dired-preview--timer) (cancel-timer dired-preview--timer))) -(defun dired-preview-trigger () - "Trigger display of file at point after `dired-preview-trigger-commands'." - (if (and (eq major-mode 'dired-mode) +(defun dired-preview--preview-p (file) + "Return non-nil if FILE can be previewed." + (and (file-exists-p file) + (not (file-directory-p file)) + (not (dired-preview--file-displayed-p file)) + (not (dired-preview--file-ignored-p file)) + (not (dired-preview--file-large-p file)))) + +(defun dired-preview-trigger (&optional no-delay) + "Trigger display of file at point after `dired-preview-trigger-commands'. +With optional NO-DELAY do not start a timer. Otherwise produce +the preview with `dired-preview-delay' of idleness." + (dired-preview--cancel-timer) + (let* ((file (dired-file-name-at-point))) + (cond + ((and file + (dired-preview--preview-p file) (memq this-command dired-preview-trigger-commands)) - (progn - (dired-preview--cancel-timer) + (if no-delay + (dired-preview-display-file file) (setq dired-preview--timer (run-with-idle-timer dired-preview-delay nil - #'dired-preview-display-file))) - (dired-preview--close-previews-outside-dired))) + #'dired-preview-display-file + file)))) + ((and file + (not (dired-preview--preview-p file)) + (eq major-mode 'dired-mode)) + (dired-preview--close-previews)) + (t + (dired-preview--close-previews-outside-dired))))) (defun dired-preview-disable-preview () "Disable Dired preview." @@ -298,7 +289,7 @@ Return buffer object of displayed buffer." (error "Can only use `dired-preview' in Dired")) (add-hook 'post-command-hook #'dired-preview-trigger nil :local) (add-hook 'post-command-hook #'dired-preview--close-previews-outside-dired nil :local) - (dired-preview-display-file)) + (dired-preview-trigger :no-delay)) ;;;###autoload (define-minor-mode dired-preview-mode