image-dired: Navigate from image display buffer

* lisp/image-dired.el
(image-dired-mark-thumb-original-file)
(image-dired-unmark-thumb-original-file)
(image-dired-flag-thumb-original-file)
(image-dired-toggle-mark-thumb-original-file)
(image-dired-unmark-all-marks)
(image-dired-display-next-thumbnail-original)
(image-dired-display-previous-thumbnail-original): Make commands
usable from image-dired-display-image-mode.
(image-dired-display-image-mode-map): Bind above commands.
(image-dired--with-thumbnail-buffer): New macro.
This commit is contained in:
Stefan Kangas
2021-12-07 23:28:44 +01:00
parent 5364c57198
commit 10655ce02f
2 changed files with 63 additions and 38 deletions

View File

@@ -552,6 +552,16 @@ user options that are no longer needed are now obsolete:
'image-dired-display-window-width-correction',
'image-dired-temp-image-file'.
---
*** Navigation and marking commands now work in image display buffer.
The following new bindings have been added:
n / SPC image-dired-display-previous-thumbnail-original
p / DEL image-dired-display-next-thumbnail-original
m image-dired-mark-thumb-original-file
d image-dired-flag-thumb-original-file
u image-dired-unmark-thumb-original-file
---
*** Reduce dependency on external "exiftool" command.
The 'image-dired-copy-with-exif-file-name' no longer requires an
@@ -562,7 +572,7 @@ external "exiftool" command to be available. The user options
---
*** New command for the thumbnail buffer.
The new command 'image-dired-unmark-all-marks' has been added. It is
bound to 'U' in the thumbnail buffer.
bound to 'U' in the thumbnail and display buffer.
---
*** Support Thumbnail Managing Standard v0.9.0 (Dec 2020).

View File

@@ -1445,11 +1445,20 @@ for. The default is to look for `dired-marker-char'."
"In Dired, return t if file on current line is flagged for deletion."
(image-dired-dired-file-marked-p dired-del-marker))
(defmacro image-dired--with-thumbnail-buffer (&rest body)
(declare (indent defun) (debug t))
`(if-let ((buf (get-buffer image-dired-thumbnail-buffer)))
(with-current-buffer buf
(if-let ((win (get-buffer-window buf)))
(with-selected-window win
,@body)
,@body))
(user-error "No such buffer: %s" image-dired-thumbnail-buffer)))
(defmacro image-dired--on-file-in-dired-buffer (&rest body)
"Run BODY with point on file at point in Dired buffer.
Should be called from commands in `image-dired-thumbnail-mode'."
(declare (indent defun)
(debug 1))
(declare (indent defun) (debug t))
`(let ((file-name (image-dired-original-file-name))
(dired-buf (image-dired-associated-dired-buffer)))
(if (not (and dired-buf file-name))
@@ -1461,40 +1470,45 @@ Should be called from commands in `image-dired-thumbnail-mode'."
(defun image-dired-mark-thumb-original-file ()
"Mark original image file in associated Dired buffer."
(interactive nil image-dired-thumbnail-mode)
(image-dired--on-file-in-dired-buffer
(dired-mark 1))
(image-dired-forward-image))
(interactive nil image-dired-thumbnail-mode image-dired-display-image-mode)
(image-dired--with-thumbnail-buffer
(image-dired--on-file-in-dired-buffer
(dired-mark 1))
(image-dired-forward-image)))
(defun image-dired-unmark-thumb-original-file ()
"Unmark original image file in associated Dired buffer."
(interactive nil image-dired-thumbnail-mode)
(image-dired--on-file-in-dired-buffer
(dired-unmark 1))
(image-dired-forward-image))
(interactive nil image-dired-thumbnail-mode image-dired-display-image-mode)
(image-dired--with-thumbnail-buffer
(image-dired--on-file-in-dired-buffer
(dired-unmark 1))
(image-dired-forward-image)))
(defun image-dired-flag-thumb-original-file ()
"Flag original image file for deletion in associated Dired buffer."
(interactive nil image-dired-thumbnail-mode)
(image-dired--on-file-in-dired-buffer
(dired-flag-file-deletion 1))
(image-dired-forward-image))
(interactive nil image-dired-thumbnail-mode image-dired-display-image-mode)
(image-dired--with-thumbnail-buffer
(image-dired--on-file-in-dired-buffer
(dired-flag-file-deletion 1))
(image-dired-forward-image)))
(defun image-dired-toggle-mark-thumb-original-file ()
"Toggle mark on original image file in associated Dired buffer."
(interactive nil image-dired-thumbnail-mode)
(image-dired--on-file-in-dired-buffer
(if (image-dired-dired-file-marked-p)
(dired-unmark 1)
(dired-mark 1))))
(interactive nil image-dired-thumbnail-mode image-dired-display-image-mode)
(image-dired--with-thumbnail-buffer
(image-dired--on-file-in-dired-buffer
(if (image-dired-dired-file-marked-p)
(dired-unmark 1)
(dired-mark 1)))))
(defun image-dired-unmark-all-marks ()
"Remove all marks from all files in associated Dired buffer.
Also update the marks in the thumbnail buffer."
(interactive nil image-dired-thumbnail-mode)
(with-current-buffer (image-dired-associated-dired-buffer)
(dired-unmark-all-marks))
(image-dired-thumb-update-marks))
(interactive nil image-dired-thumbnail-mode image-dired-display-image-mode)
(image-dired--with-thumbnail-buffer
(with-current-buffer (image-dired-associated-dired-buffer)
(dired-unmark-all-marks))
(image-dired-thumb-update-marks)))
(defun image-dired-jump-original-dired-buffer ()
"Jump to the Dired buffer associated with the current image file.
@@ -1638,16 +1652,16 @@ You probably want to use this together with
(defvar image-dired-display-image-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "S" #'image-dired-slideshow-start)
(define-key map (kbd "SPC") #'image-dired-display-next-thumbnail-original)
(define-key map (kbd "DEL") #'image-dired-display-previous-thumbnail-original)
(define-key map "n" #'image-dired-display-next-thumbnail-original)
(define-key map "p" #'image-dired-display-previous-thumbnail-original)
(define-key map "m" #'image-dired-mark-thumb-original-file)
(define-key map "d" #'image-dired-flag-thumb-original-file)
(define-key map "u" #'image-dired-unmark-thumb-original-file)
(define-key map "U" #'image-dired-unmark-all-marks)
;; Disable keybindings from `image-mode-map' that doesn't make sense here.
(define-key map "o" nil) ; image-save
(define-key map "n" nil) ; image-next-file
(define-key map "p" nil) ; image-previous-file
;; FIXME: Should be replaced with image-dired commands.
(define-key map (kbd "DEL") nil) ; image-next-file
(define-key map (kbd "SPC") nil) ; image-next-file
;; FIXME: Should be replaced with image-dired commands.
(define-key map "m" nil) ; image-mode-mark-file
(define-key map "u" nil) ; image-mode-unmark-file
map)
"Keymap for `image-dired-display-image-mode'.")
@@ -2129,16 +2143,17 @@ function. The result is a couple of new files in
;;; Thumbnail mode (cont.)
(defun image-dired-display-next-thumbnail-original (&optional arg)
"In thumbnail buffer, move to next thumbnail and display the image.
"Move to the next image in the thumbnail buffer and display it.
With prefix ARG, move that many thumbnails."
(interactive "p" image-dired-thumbnail-mode)
(image-dired-forward-image arg t)
(image-dired-display-thumbnail-original-image))
(interactive "p" image-dired-thumbnail-mode image-dired-display-image-mode)
(image-dired--with-thumbnail-buffer
(image-dired-forward-image arg t)
(image-dired-display-thumbnail-original-image)))
(defun image-dired-display-previous-thumbnail-original (arg)
"In thumbnail buffer, move to previous thumbnail and display image.
"Move to the previous image in the thumbnail buffer and display it.
With prefix ARG, move that many thumbnails."
(interactive "p" image-dired-thumbnail-mode)
(interactive "p" image-dired-thumbnail-mode image-dired-display-image-mode)
(image-dired-display-next-thumbnail-original (- arg)))