1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-28 10:56:36 +00:00

Add support for Dired file marking from image-mode

* doc/emacs/files.texi (File Conveniences): Document them.

* lisp/image-mode.el (image-mode--mark-file): New function.
(image-mode-unmark-file, image-mode-mark-file)
(image-mode-copy-file-name-as-kill): New commands and keystrokes.
This commit is contained in:
Lars Ingebrigtsen 2019-10-01 19:53:48 +02:00
parent 41f59e71e2
commit 98bbded2b3
3 changed files with 88 additions and 1 deletions

View File

@ -2119,6 +2119,20 @@ displayed. You can press @kbd{n} (@code{image-next-file}) and @kbd{p}
(@code{image-previous-file}) to visit the next image file and the
previous image file in the same directory, respectively.
@findex image-mode-mark-file
@findex image-mode-unmark-file
@findex image-mode-copy-file-name-as-kill
When looking through images, it's sometimes convenient to be able to
mark the files for later processing (for instance, if you want to
select a group of images to copy somewhere else). The @kbd{m}
(@code{image-mode-mark-file}) command will mark the current file in
any Dired buffer(s) that display the current file's directory. If no
such buffer is open, the directory is opened in a new buffer. To
unmark files, use the @kbd{u} (@code{image-mode-mark-file}) command.
Finally, if you just want to copy the current buffers file name to the
kill ring, you can use the @kbd{w}
(@code{image-mode-copy-file-name-as-kill}) command.
@findex image-toggle-animation
@findex image-next-frame
@findex image-previous-frame

View File

@ -2725,6 +2725,12 @@ The image parameters 'image-transform-rotation',
buffer-local, so each buffer could have its own values for these
parameters.
+++
*** Three new 'image-mode' commands have been added: 'm', which marks
the file in the dired buffer(s) for the directory the file is in; 'u',
which unmarks the file; and 'w', which pushes the current buffer's file
name to the kill ring.
+++
*** The command 'image-rotate' now accepts a prefix argument.
With a prefix argument, 'image-rotate' now rotates the image at point

View File

@ -430,7 +430,9 @@ call."
(define-key map "a-" 'image-decrease-speed)
(define-key map "a0" 'image-reset-speed)
(define-key map "ar" 'image-reverse-speed)
(define-key map "k" 'image-kill-buffer)
(define-key map "w" 'image-mode-copy-file-name-as-kill)
(define-key map "m" 'image-mode-mark-file)
(define-key map "u" 'image-mode-unmark-file)
(define-key map [remap forward-char] 'image-forward-hscroll)
(define-key map [remap backward-char] 'image-backward-hscroll)
(define-key map [remap right-char] 'image-forward-hscroll)
@ -477,6 +479,9 @@ call."
:help "Move to next image in this directory"]
["Previous Image" image-previous-file :active buffer-file-name
:help "Move to previous image in this directory"]
["Copy File Name" image-mode-copy-file-name-as-kill
:active buffer-file-name
:help "Copy the current file name to the kill ring"]
"--"
["Fit Frame to Image" image-mode-fit-frame :active t
:help "Resize frame to match image"]
@ -986,6 +991,68 @@ replacing the current Image mode buffer."
(interactive "p")
(image-next-file (- n)))
(defun image-mode-copy-file-name-as-kill ()
"Push the currently visited file name onto the kill ring."
(interactive)
(unless buffer-file-name
(error "The current buffer doesn't visit a file"))
(kill-new buffer-file-name)
(message "Copied %s" buffer-file-name))
(defun image-mode-mark-file ()
"Mark the current file in the appropriate dired buffer(s).
Any dired buffer that's opened to the current file's directory
will have the line where the image appears (if any) marked.
If no such buffer exists, it will be opened."
(interactive)
(unless buffer-file-name
(error "The current buffer doesn't visit a file."))
(image-mode--mark-file buffer-file-name #'dired-mark "marked"))
(defun image-mode-unmark-file ()
"Unmark the current file in the appropriate dired buffer(s).
Any dired buffer that's opened to the current file's directory
will remove the mark from the line where the image appears (if
any).
If no such buffer exists, it will be opened."
(interactive)
(unless buffer-file-name
(error "The current buffer doesn't visit a file."))
(image-mode--mark-file buffer-file-name #'dired-unmark "unmarked"))
(declare-function dired-mark "dired" (arg &optional interactive))
(declare-function dired-unmark "dired" (arg &optional interactive))
(declare-function dired-goto-file "dired" (file))
(defun image-mode--mark-file (file function message)
(require 'dired)
(let* ((dir (file-name-directory file))
(buffers
(cl-loop for buffer in (buffer-list)
when (with-current-buffer buffer
(and (eq major-mode 'dired-mode)
(equal (file-truename dir)
(file-truename default-directory))))
collect buffer))
results)
(unless buffers
(save-excursion
(setq buffers (list (find-file-noselect dir)))))
(dolist (buffer buffers)
(with-current-buffer buffer
(if (not (dired-goto-file file))
(push (format "couldn't find in %s" (directory-file-name dir))
results)
(funcall function 1)
(push (format "%s in %s" message (directory-file-name dir))
results))))
;; Capitalize first character.
(let ((string (mapconcat #'identity results "; ")))
(message "%s%s" (capitalize (substring string 0 1))
(substring string 1)))))
(defun image-mode--images-in-directory (file)
(let* ((dir (file-name-directory buffer-file-name))
(files (directory-files dir nil