Skip to content

Commit

Permalink
Use an advice instead of defining new commands; delete our keymap
Browse files Browse the repository at this point in the history
This is the same ideas as in commit ae93720, except more generalised.
Instead of defining our own commands, we advise Dired to display a
preview after one of its standard commands is called.  This way we
avoid the problem where the key remap mechanism does not actually
remap all keys associated with a given command.[1][2]

[1] Thanks to Peter Prevos for reporting this in issue 1 on the GitHub
    mirror: <#1>.

[2] Thanks to Christian Tietze and Ed Hamilton for discussing this
    with me on the mailing list:
    <https://lists.sr.ht/~protesilaos/general-issues/%3Cm1zg4noej2.fsf%40christiantietze.de%3E>.
    Commit ae93720 by Christian Tietze is based on this discussion.
  • Loading branch information
protesilaos committed Jun 27, 2023
1 parent ae93720 commit 3304286
Showing 1 changed file with 13 additions and 37 deletions.
50 changes: 13 additions & 37 deletions dired-preview.el
Original file line number Diff line number Diff line change
Expand Up @@ -242,62 +242,38 @@ Only do it with the current major mode is Dired."
(run-with-timer dired-preview-delay nil
#'dired-preview--display-buffer-action buffer)))

(defun dired-preview--display-file (&optional file)
"Display preview of file if appropriate.
File is either FILE or the value of `dired-file-name-at-point'.
Return buffer object of displayed buffer."
(if-let* ((f (or file (dired-file-name-at-point)))
(buffer (dired-preview--return-preview-buffer f)))
(defun dired-preview-display-file (&rest _)
"Display preview of `dired-file-name-at-point' if appropriate.
Return buffer object of displayed buffer. Ignore any arguments.
Use this as advice after relevant Dired commands (see
`dired-preview-enable-preview', `dired-preview-disable-preview')."
(if-let* ((file (dired-file-name-at-point))
(buffer (dired-preview--return-preview-buffer file)))
(dired-preview--display-buffer-with-delay buffer)
(dired-preview--close-previews)))

(defun dired-preview--display-file-after-mark (&rest args)
"Preview file at point in dired buffer after a mark was changed."
(dired-preview--display-file))

(defun dired-preview-disable-preview ()
"Disable preview."
(unless (eq major-mode 'dired-mode)
(error "Can only use `dired-preview' in Dired"))
(advice-remove #'dired-mark #'dired-preview--display-file-after-mark)
(dolist (command '(dired-next-line dired-previous-line dired-mark dired-goto-file))
(advice-remove command #'dired-preview-display-file))
(dired-preview--close-previews))

(defun dired-preview-enable-preview ()
"Enable preview and store window configuration."
(unless (eq major-mode 'dired-mode)
(error "Can only use `dired-preview' in Dired"))
(advice-add #'dired-mark :after #'dired-preview--display-file-after-mark)
(dolist (command '(dired-next-line dired-previous-line dired-mark dired-goto-file))
(advice-add command :after #'dired-preview-display-file))
(add-hook 'post-command-hook #'dired-preview--close-previews-outside-dired nil :local)
(dired-preview--display-file))

(defun dired-preview-next-file (number)
"Preview next file in Dired.
With optional numeric argument NUMBER move than many lines. Default is 1."
(interactive "^p")
(dired-next-line (or number 1))
(dired-preview--display-file))

(defun dired-preview-previous-file (number)
"Preview previous file in Dired.
With optional numeric argument NUMBER move than many lines. Default is 1."
(interactive "^p")
(dired-next-line (- (or number 1)))
(dired-preview--display-file))

(defvar dired-preview-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [remap dired-next-line] #'dired-preview-next-file)
(define-key map [remap dired-previous-line] #'dired-preview-previous-file)
map)
"Keymap for `dired-preview-mode'.")
(dired-preview-display-file))

;;;###autoload
(define-minor-mode dired-preview-mode
"Buffer-local mode to preview file at point in Dired."
:global nil
:keymap dired-preview-mode-map
(if dired-preview-mode
(dired-preview-enable-preview)
(dired-preview-disable-preview)))
Expand Down

0 comments on commit 3304286

Please sign in to comment.