Function: dired-bunch-files
dired-bunch-files is a byte-compiled function defined in
dired-aux.el.gz.
Signature
(dired-bunch-files MAX FUNCTION ARGS FILES)
Source Code
;; Defined in /usr/src/emacs/lisp/dired-aux.el.gz
;; Process all the files in FILES in batches of a convenient size,
;; by means of (FUNCALL FUNCTION ARGS... SOME-FILES...).
;; Batches are chosen to need less than MAX chars for the file names,
;; allowing 3 extra characters of separator per file name.
(defun dired-bunch-files (max function args files)
(let (pending
past
(pending-length 0)
failures)
;; Accumulate files as long as they fit in MAX chars,
;; then process the ones accumulated so far.
(while files
(let* ((thisfile (car files))
(thislength (+ (length thisfile) 3))
(rest (cdr files)))
;; If we have at least 1 pending file
;; and this file won't fit in the length limit, process now.
(if (and pending (> (+ thislength pending-length) max))
(setq pending (nreverse pending)
;; The elements of PENDING are now in forward order.
;; Do the operation and record failures.
failures (nconc (apply function (append args pending))
failures)
;; Transfer the elements of PENDING onto PAST
;; and clear it out. Now PAST contains the first N files
;; specified (for some N), and FILES contains the rest.
past (nconc past pending)
pending nil
pending-length 0))
;; Do (setq pending (cons thisfile pending))
;; but reuse the cons that was in `files'.
(setcdr files pending)
(setq pending files)
(setq pending-length (+ thislength pending-length))
(setq files rest)))
(setq pending (nreverse pending))
(prog1
(nconc (apply function (append args pending))
failures)
;; Now the original list FILES has been put back as it was.
(nconc past pending))))