diff --git a/lisp/dired.el b/lisp/dired.el index 75dcd33e67..89b81ca0db 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -2870,12 +2870,10 @@ dired-copy-filename-as-kill ;;; Keeping Dired buffers in sync with the filesystem and with each other -(defun dired-buffers-for-dir (dir &optional file subdirs) +(defun dired-buffers-for-dir (dir &optional file) "Return a list of buffers for DIR (top level or in-situ subdir). If FILE is non-nil, include only those whose wildcard pattern (if any) matches FILE. -If SUBDIRS is non-nil, also include the dired buffers of -directories below DIR. The list is in reverse order of buffer creation, most recent last. As a side effect, killed dired buffers for DIR are removed from `dired-buffers'." @@ -2889,8 +2887,7 @@ dired-buffers-for-dir (setq dired-buffers (delq elt dired-buffers))) ((dired-in-this-tree-p dir (car elt)) (with-current-buffer buf - (when (and (or subdirs - (assoc dir dired-subdir-alist)) + (when (and (assoc dir dired-subdir-alist) (or (null file) (if (stringp dired-directory) (let ((wildcards (file-name-nondirectory @@ -2903,6 +2900,22 @@ dired-buffers-for-dir (setq result (cons buf result))))))) result)) +(defun dired-buffers-for-dir-or-subdir (dir) + "Return a list of buffers for DIR or a subdirectory thereof. +As a side effect, killed dired buffers for DIR are removed from +`dired-buffers'." + (setq dir (file-name-as-directory dir)) + (let (result buf) + (dolist (elt dired-buffers) + (setq buf (cdr elt)) + (cond + ((null (buffer-name buf)) + ;; Buffer is killed - clean up: + (setq dired-buffers (delq elt dired-buffers))) + ((dired-in-this-tree-p (car elt) dir) + (setq result (cons buf result))))) + result)) + (defun dired-glob-regexp (pattern) "Convert glob-pattern PATTERN to a regular expression." (let ((matched-in-pattern 0) ;; How many chars of PATTERN we've handled. @@ -3479,15 +3492,16 @@ dired-clean-up-after-deletion (file-name-nondirectory fn)))) (not dired-clean-confirm-killing-deleted-buffers)) (kill-buffer buf))) - (let ((buf-list (dired-buffers-for-dir (expand-file-name fn) - nil 'subdirs))) + (let ((buf-list (dired-buffers-for-dir-or-subdir + (expand-file-name fn)))) (and buf-list (or (and dired-clean-confirm-killing-deleted-buffers (y-or-n-p (format - (ngettext "Kill Dired buffer of %s, too? " - "Kill Dired buffers of %s, too? " - (length buf-list)) + (ngettext + "Kill Dired buffer of %s, too? " + "Kill Dired buffers of %s and its sub-directories, too? " + (length buf-list)) (file-name-nondirectory ;; FN may end in a / if `dired-listing-switches' ;; contains -p, so we need to strip that