diff options
| author | Richard M. Stallman | 1999-09-15 23:29:16 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1999-09-15 23:29:16 +0000 |
| commit | f06280268ad4dd2e28e352a0e265154769c8251e (patch) | |
| tree | 8b6e7976005530210d83c8ff5794145e6df39ce2 | |
| parent | faa935b653571584c6caad016b29421b55e975eb (diff) | |
| download | emacs-f06280268ad4dd2e28e352a0e265154769c8251e.tar.gz emacs-f06280268ad4dd2e28e352a0e265154769c8251e.zip | |
(dired-recursive-deletes): New custom variable.
(dired-re-no-dot): New variable.
(dired-delete-file): New function deletes files and directories recursively.
(dired-internal-do-deletions): Use `dired-delete-file' to delete files.
| -rw-r--r-- | lisp/dired.el | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/lisp/dired.el b/lisp/dired.el index 748965f89f2..f89259964ec 100644 --- a/lisp/dired.el +++ b/lisp/dired.el | |||
| @@ -1780,6 +1780,50 @@ Optional argument means return a file name relative to `default-directory'." | |||
| 1780 | 1780 | ||
| 1781 | ;; Deleting files | 1781 | ;; Deleting files |
| 1782 | 1782 | ||
| 1783 | (defcustom dired-recursive-deletes nil ; Default only delete empty directories. | ||
| 1784 | "*Decide whether recursive deletes are allowed. | ||
| 1785 | Nil means no recursive deletes. | ||
| 1786 | `always' means delete recursively without asking. This is DANGEROUS! | ||
| 1787 | `top' means ask for each directory at top level, but delete its subdirectories | ||
| 1788 | without asking. | ||
| 1789 | Anything else means ask for each directory." | ||
| 1790 | :type '(choice :tag "Delete not empty directory" | ||
| 1791 | (const :tag "No. Only empty directories" nil) | ||
| 1792 | (const :tag "Ask for each directory" t) | ||
| 1793 | (const :tag "Ask for each top directory only" top)) | ||
| 1794 | :group 'dired) | ||
| 1795 | |||
| 1796 | ;; Match anything but `.' and `..'. | ||
| 1797 | (defvar dired-re-no-dot "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*") | ||
| 1798 | |||
| 1799 | ;; Delete file, possibly delete a directory and all its files. | ||
| 1800 | ;; This function is usefull outside of dired. One could change it's name | ||
| 1801 | ;; to e.g. recursive-delete-file and put it somewhere else. | ||
| 1802 | (defun dired-delete-file (file &optional recursive) "\ | ||
| 1803 | Delete FILE or directory (possibly recursively if optional RECURSIVE is true.) | ||
| 1804 | RECURSIVE determines what to do with a non-empty directory. If RECURSIVE is: | ||
| 1805 | Nil, do not delete. | ||
| 1806 | `always', delete recursively without asking. | ||
| 1807 | `top', ask for each directory at top level. | ||
| 1808 | Anything else, ask for each sub-directory." | ||
| 1809 | (let (files) | ||
| 1810 | ;; This test is equivalent to | ||
| 1811 | ;; (and (file-directory-p fn) (not (file-symlink-p fn))) | ||
| 1812 | ;; but more efficient | ||
| 1813 | (if (not (eq t (car (file-attributes file)))) | ||
| 1814 | (delete-file file) | ||
| 1815 | (when (and recursive | ||
| 1816 | (setq files | ||
| 1817 | (directory-files file t dired-re-no-dot)) ; Not empty. | ||
| 1818 | (or (eq recursive 'always) | ||
| 1819 | (yes-or-no-p (format "Recursive delete of %s " | ||
| 1820 | (dired-make-relative file))))) | ||
| 1821 | (if (eq recursive 'top) (setq recursive 'always)) ; Don't ask again. | ||
| 1822 | (while files ; Recursively delete (possibly asking). | ||
| 1823 | (dired-delete-file (car files) recursive) | ||
| 1824 | (setq files (cdr files)))) | ||
| 1825 | (delete-directory file)))) | ||
| 1826 | |||
| 1783 | (defun dired-do-flagged-delete (&optional nomessage) | 1827 | (defun dired-do-flagged-delete (&optional nomessage) |
| 1784 | "In dired, delete the files flagged for deletion. | 1828 | "In dired, delete the files flagged for deletion. |
| 1785 | If NOMESSAGE is non-nil, we don't display any message | 1829 | If NOMESSAGE is non-nil, we don't display any message |
| @@ -1835,12 +1879,7 @@ if there are no flagged files." | |||
| 1835 | (let (buffer-read-only) | 1879 | (let (buffer-read-only) |
| 1836 | (condition-case err | 1880 | (condition-case err |
| 1837 | (let ((fn (car (car l)))) | 1881 | (let ((fn (car (car l)))) |
| 1838 | ;; This test is equivalent to | 1882 | (dired-delete-file fn dired-recursive-deletes) |
| 1839 | ;; (and (file-directory-p fn) (not (file-symlink-p fn))) | ||
| 1840 | ;; but more efficient | ||
| 1841 | (if (eq t (car (file-attributes fn))) | ||
| 1842 | (delete-directory fn) | ||
| 1843 | (delete-file fn)) | ||
| 1844 | ;; if we get here, removing worked | 1883 | ;; if we get here, removing worked |
| 1845 | (setq succ (1+ succ)) | 1884 | (setq succ (1+ succ)) |
| 1846 | (message "%s of %s deletions" succ count) | 1885 | (message "%s of %s deletions" succ count) |