GNU bug report logs - #78658
30.1; [PATCH] Dired feature suggestion: dired-on-marked-files-in-all-buffers

Previous Next

Package: emacs;

Reported by: Phil Sainty <psainty <at> orcon.net.nz>

Date: Sun, 1 Jun 2025 03:20:06 UTC

Severity: normal

Tags: patch

Found in version 30.1

Full log


View this message in rfc822 format

From: Drew Adams <drew.adams <at> oracle.com>
To: Juri Linkov <juri <at> linkov.net>, Phil Sainty <psainty <at> orcon.net.nz>
Cc: "78658 <at> debbugs.gnu.org" <78658 <at> debbugs.gnu.org>
Subject: bug#78658: 30.1; [PATCH] Dired feature suggestion: dired-on-marked-files-in-all-buffers
Date: Mon, 2 Jun 2025 00:13:50 +0000
> > I've attached a patch with a first pass implementation.

It's a very good idea.  I plan to add it to Dired+ (with
attribution), for use with older Emacs, even if it doesn't
get added to Emacs. 

> Ideally, it could find the common prefix, then set
> default-directory to it and list only relative file names,
> like in the output of e.g. 'find-dired-with-command'.

Another good idea.
___

Here's the code I have for this now.  If you add the feature
to Emacs then the Dired+ functions will just become aliases
for the vanilla Emacs functions (in releases where they exist).

(defun diredp-get-marked-files-in-all-buffers ()
  "Return names of files and directories marked in any Dired buffers.
Like `dired-get-marked-files', but for all Dired buffers."
  (diredp-delete-dups
   (let ((dired-bufs  (delq nil (mapcar (lambda (d.b)
                                          (and (buffer-live-p (cdr d.b))
                                               (cdr d.b)))
                                        dired-buffers))))
     (apply #'nconc
            (mapcar (lambda (buf)
                      (with-current-buffer buf
                        (let ((files  (dired-get-marked-files nil nil nil t)))
                          (setq files  (and (cdr files)  (if (eq (car files) t)
                                                             (cadr files)
                                                           files))))))
                    dired-bufs)))))

(defun diredp-marked-files-in-all-buffers ()
  "Dired the files and directories marked in any Dired buffers.
Like `diredp-marked-files', but for all Dired buffers."
  (interactive)
  (let ((files  (diredp-get-marked-files-in-all-buffers)))
    (unless (directory-name-p common) (setq common  (diredp-parent-dir common)))
    (let ((default-directory  (or common  default-directory)))
      (dired (cons "MARKED-ANYWHERE"
                   (if common
                       (mapcar (lambda (file) (file-relative-name file common))
                               files)
                     files)))))))

Differences from Phil's patch (besides the function names):

1. Use Juri's suggestion of using a common ancestor directory
   and relative file names.  IIRC, file systems can sometimes
   have no common prefix - in which case use absolute names if
   there's no common ancestor directory.

2. The Dired buffer is named `MARKED ANYWHERE', so as not to
   interfere with (i.e., replace) another (e.g., normal)
   listing of the same directory.

3. Use variable `dired-buffers', to check only Dired buffers
   instead of all buffers.

4. Quick check of marked-files list (without `length'). 
___

FWIW -

Dired+ has long had commands that act on all marked files & dirs
in a Dired buffer, and all marked files & dirs in Dired buffers
for marked subdirs,... defined recursively.

IOW, instead of (as in Phil's feature) checking all Dired buffers
for markings, such functions check only the current Dired buffer,
Dired buffers for its marked subdirs, and so on recursively.

Applying `dired' to that collection of marked files & dirs is
only one possible action.  In general, all of the usual actions
for marked files are provided (by separate commands).

Phil's feature is a good addition to such functionality.




This bug report was last modified 5 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.