aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorTino Calancha2017-08-09 14:47:15 +0900
committerTino Calancha2017-08-09 14:48:49 +0900
commitda4438e14f1c55808937872b6d651a807404daa2 (patch)
treea7b3a8d1f8425b56071759d5b3507e1378afa585 /lisp
parent9ecbdeeaa845a75c63210057a8a554eedc9387bf (diff)
downloademacs-da4438e14f1c55808937872b6d651a807404daa2.tar.gz
emacs-da4438e14f1c55808937872b6d651a807404daa2.zip
dired-delete-file: Dont't ask for empty dirs
* lisp/dired.el (dired--yes-no-all-quit-help): New defun. (dired-delete-file): Use it. Dont't ask for empty dirs (Bug#27940). * test/lisp/dired-tests.el (dired-test-with-temp-dirs): New auxiliar macro. (dired-test-bug27940): Add new test.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/dired.el71
1 files changed, 38 insertions, 33 deletions
diff --git a/lisp/dired.el b/lisp/dired.el
index 2e5b847f9b2..0455f3d1378 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -2989,6 +2989,29 @@ Any other value means to ask for each directory."
2989`quit' to exit, 2989`quit' to exit,
2990`help' to show this help message.") 2990`help' to show this help message.")
2991 2991
2992(defun dired--yes-no-all-quit-help (prompt &optional help-msg)
2993 "Ask a question with valid answers: yes, no, all, quit, help.
2994PROMPT must end with '? ', for instance, 'Delete it? '.
2995If optional arg HELP-MSG is non-nil, then is a message to show when
2996the user answers 'help'. Otherwise, default to `dired-delete-help'."
2997 (let ((valid-answers (list "yes" "no" "all" "quit"))
2998 (answer "")
2999 (input-fn (lambda ()
3000 (read-string
3001 (format "%s [yes, no, all, quit, help] " prompt)))))
3002 (setq answer (funcall input-fn))
3003 (when (string= answer "help")
3004 (with-help-window "*Help*"
3005 (with-current-buffer "*Help*"
3006 (insert (or help-msg dired-delete-help)))))
3007 (while (not (member answer valid-answers))
3008 (unless (string= answer "help")
3009 (beep)
3010 (message "Please answer `yes' or `no' or `all' or `quit'")
3011 (sleep-for 2))
3012 (setq answer (funcall input-fn)))
3013 answer))
3014
2992;; Delete file, possibly delete a directory and all its files. 3015;; Delete file, possibly delete a directory and all its files.
2993;; This function is useful outside of dired. One could change its name 3016;; This function is useful outside of dired. One could change its name
2994;; to e.g. recursive-delete-file and put it somewhere else. 3017;; to e.g. recursive-delete-file and put it somewhere else.
@@ -3009,39 +3032,21 @@ TRASH non-nil means to trash the file instead of deleting, provided
3009 ;; but more efficient 3032 ;; but more efficient
3010 (if (not (eq t (car (file-attributes file)))) 3033 (if (not (eq t (car (file-attributes file))))
3011 (delete-file file trash) 3034 (delete-file file trash)
3012 (let* ((valid-answers (list "yes" "no" "all" "quit" "help")) 3035 (let* ((empty-dir-p (null (directory-files file t dired-re-no-dot))))
3013 (answer "") 3036 (if (and recursive (not empty-dir-p))
3014 (input-fn 3037 (unless (eq recursive 'always)
3015 (lambda () 3038 (let ((prompt
3016 (setq answer 3039 (format "Recursively %s %s? "
3017 (read-string 3040 (if (and trash delete-by-moving-to-trash)
3018 (format "Recursively %s %s? [yes, no, all, quit, help] " 3041 "trash"
3019 (if (and trash 3042 "delete")
3020 delete-by-moving-to-trash) 3043 (dired-make-relative file))))
3021 "trash" 3044 (pcase (dired--yes-no-all-quit-help prompt) ; Prompt user.
3022 "delete") 3045 ('"all" (setq recursive 'always dired-recursive-deletes recursive))
3023 (dired-make-relative file)))) 3046 ('"yes" (if (eq recursive 'top) (setq recursive 'always)))
3024 (when (string= answer "help") 3047 ('"no" (setq recursive nil))
3025 (with-help-window "*Help*" 3048 ('"quit" (keyboard-quit)))))
3026 (with-current-buffer "*Help*" (insert dired-delete-help)))) 3049 (setq recursive nil)) ; Empty dir or recursive is nil.
3027 answer)))
3028 (if (and recursive
3029 (directory-files file t dired-re-no-dot) ; Not empty.
3030 (eq recursive 'always))
3031 (if (eq recursive 'top) (setq recursive 'always)) ; Don't ask again.
3032 ;; Otherwise prompt user:
3033 (funcall input-fn)
3034 (while (not (member answer valid-answers))
3035 (unless (string= answer "help")
3036 (beep)
3037 (message "Please answer `yes' or `no' or `all' or `quit'")
3038 (sleep-for 2))
3039 (funcall input-fn))
3040 (pcase answer
3041 ('"all" (setq recursive 'always dired-recursive-deletes recursive))
3042 ('"yes" (if (eq recursive 'top) (setq recursive 'always)))
3043 ('"no" (setq recursive nil))
3044 ('"quit" (keyboard-quit))))
3045 (delete-directory file recursive trash)))) 3050 (delete-directory file recursive trash))))
3046 3051
3047(defun dired-do-flagged-delete (&optional nomessage) 3052(defun dired-do-flagged-delete (&optional nomessage)