branch: externals/dired-preview commit 0dceaef04debd0543bf80080c03beedb39d9c721 Author: Protesilaos Stavrou <i...@protesilaos.com> Commit: Protesilaos Stavrou <i...@protesilaos.com>
Use a function to return the display-buffer action This gives the user maximum control over the behaviour of the display-buffer mechanism. 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 | 70 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/dired-preview.el b/dired-preview.el index c13a5f2b08..34074cc5a6 100644 --- a/dired-preview.el +++ b/dired-preview.el @@ -82,28 +82,16 @@ :group 'dired-preview :type 'integer) -(defcustom dired-preview-buffer-name "*dired-preview*" - "Name of preview buffer. -Used by the default value of `dired-preview-display-action-alist'." - :group 'dired-preview - :type 'string) - -(defcustom dired-preview-display-action-alist - `((display-buffer-in-side-window) - (side . right) - (slot . -1) - (window-width . 0.3) - (dedicated . t) - (window-parameters . ((no-other-window . t) - (mode-line-format . ("%e" - mode-line-front-space - ,dired-preview-buffer-name))))) - "The `display-buffer' action for the preview. +(defcustom dired-preview-display-action-alist-function + #'dired-preview-display-action-alist-dwim + "Function to return the `display-buffer' action for the preview. This is the same data that is passed to `display-buffer-alist'. Read Info node `(elisp) Displaying Buffers'. As such, it is -meant for experienced users." +meant for experienced users. See the reference function +`dired-preview-display-action-alist-dwim' for the implementation +details." :group 'dired-preview - :type 'alist) + :type 'function) (defcustom dired-preview-delay 0.7 "Time in seconds to wait before previewing." @@ -222,11 +210,51 @@ See user option `dired-preview-ignored-extensions-regexp'." (set-window-parameter window 'dired-preview-window :preview) (add-hook 'window-state-change-hook #'dired-preview--close-previews-outside-dired))) +(defvar dired-preview-buffer-name "*dired-preview*" + "Name of preview buffer.") + +(defun dired-preview-return-window-size (dimension) + "Return window size by checking for DIMENSION. +DIMENSION is either a `:width' or `:height' keyword. It is +checked against `split-width-threshold' or +`split-height-threshold'" + (pcase dimension + (:width (if (>= (* fill-column 2) split-width-threshold) + fill-column + (- (window-body-width) fill-column))) + (:height (let ((height (frame-height))) + (if (>= (* height 2) split-height-threshold) + height + (- (window-body-height) height)))))) + +(defun dired-preview-display-action-side () + "Pick a side window that is appropriate for the given frame." + (if (>= (frame-pixel-width) (frame-pixel-height)) + `(:side right :dimension window-width :size ,(dired-preview-return-window-size :width)) + `(:side bottom :dimension window-height :size ,(dired-preview-return-window-size :height)))) + +(defun dired-preview-display-action-alist-dwim () + "Reference function for `dired-preview-display-action-alist-function'. +Return a `display-buffer' action alist, as described in the +aforementioned user option." + (let ((properties (dired-preview-display-action-side))) + `((display-buffer-in-side-window) + (side . ,(plist-get properties :side)) + (slot . -1) + (,(plist-get properties :dimension) . ,(plist-get properties :size)) + (dedicated . t) + (window-parameters . ((no-other-window . t) + (mode-line-format . ("%e" + mode-line-front-space + ,dired-preview-buffer-name))))))) + (defun dired-preview--display-buffer (buffer) "Call `display-buffer' for BUFFER. Only do it with the current major mode is Dired." - (display-buffer buffer dired-preview-display-action-alist) - (dired-preview-set-up-preview-window buffer)) + (display-buffer buffer (funcall (or dired-preview-display-action-alist-function + #'dired-preview-display-action-alist-dwim))) + (when (window-live-p (get-buffer-window buffer)) + (dired-preview-set-up-preview-window buffer))) (defun dired-preview-display-file (file) "Display preview of FILE if appropriate."