首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“`delete directory`”中的问题,启用了“删除-逐个删除-到-垃圾”

“`delete directory`”中的问题,启用了“删除-逐个删除-到-垃圾”
EN

Stack Overflow用户
提问于 2010-04-06 08:33:39
回答 3查看 554关注 0票数 0

delete-directory函数有一个奇怪的行为,启用标志delete-by-removing-to-trash。它逐个删除文件,而不是将move-file-to-trash应用于目录。结果,emacs缓慢删除大目录,删除后垃圾中有许多文件,因此无法恢复该目录。

示例:目录结构:

代码语言:javascript
复制
ddd/
   ccc/
       1.txt

删除ddd后,垃圾中有三个文件

代码语言:javascript
复制
trash/
    ddd/
    ccc/
    1.txt

而不是一个:

代码语言:javascript
复制
trash/
    ddd/

因为emacs遍历目录recursively.

  • I无法恢复已删除的目录.

我需要的是与move-file-to-trash完全相同的行为。但是它应该是透明的。在dired模式下的x‘)。如何解决这个问题?作为一种临时解决方案,我看到了为“删除-目录”编写建议函数。

EN

回答 3

Stack Overflow用户

发布于 2010-04-10 13:30:52

作为临时解决办法,我使用:

代码语言:javascript
复制
(setq delete-by-moving-to-trash t)

(defadvice dired-delete-file (around
                              activate-move-to-trash
                              activate
                              compile)
  (if delete-by-moving-to-trash
      (move-file-to-trash (ad-get-arg 0))
    ad-do-it))
票数 1
EN

Stack Overflow用户

发布于 2010-04-16 06:46:44

这是我的整个系统。如果你看看底部,你会看到一个与安德烈欧几乎相同的defadvice

代码语言:javascript
复制
;;; trash-settings.el - Intelligent integration with system trash

;; Use the system trash, except for temp files and stuff
(require 'cl)

(defcustom system-trash-exclude-names
  nil
  "List of file names to exclude from system trash.
The names in this variable are matched only against the basename
of the file to be deleted."
  :type '(repeat string)
  :group 'trash)

(defcustom system-trash-exclude-paths
  nil
  "List of absolute paths to exclude from system trash.
If a path to a directory is excluded, then all the contents of that directory are also excluded."
  :type '(repeat string)
  :group 'trash)

(defcustom system-trash-exclude-matches
  nil
  "List of regexps or functions matching file names to exclude from system trash.
The matches are only applied against the file name, not the path."
  :type '(repeat (choice regexp function))
  :group 'trash)

(defcustom system-trash-exclude-path-matches
  nil
  "List of regexps or functions matching paths to exclude from system trash.
The matches are applied against the full path."
  :type '(repeat (choice regexp function))
  :group 'trash)

(defun call-process-discard-output (program &rest args)
  "Execute program with args without saving any output.
In particular, no temp files are created."
  (eval (append `(call-process ,program nil nil nil) args)))

(defun string-begins-with-p (string beginning)
  "Return t if and only if string begins with beginning"
  (string-match-p (concat "^" (regexp-quote beginning)) string))

(defun file-excluded-from-system-trash-p (path)
  "Returns non-nil if file name is excluded from trash."
  (let ((basename (file-name-nondirectory path)))
    (or
     (some (apply-partially 'string= basename)
           system-trash-exclude-names)
     (some (apply-partially 'string-begins-with-p path)
           system-trash-exclude-paths)
     (some (lambda (match)
             (funcall
              (cond ((stringp match) 'string-match-p)
                    ((functionp protected-match) 'funcall)
                    (t 'ignore))
              match
              basename))
           system-trash-exclude-matches)
     (some (lambda (match)
             (funcall
              (cond ((stringp match) 'string-match-p)
                    ((functionp protected-match) 'funcall)
                    (t 'ignore))
              match
              path))
           system-trash-exclude-path-matches))))

(defun trash-or-rm (filename)
  "Attempt to move a file to the trash. If this fails, simply delete it.
This guarantees that any deletable file will either be trashed or deleted.
If the file is excluded from the trash, it is simply deleted."
  (unless (file-excluded-from-system-trash-p filename)
    (ignore-errors
      (call-process-discard-output "gvfs-trash" filename)))
  (when (file-exists-p filename)
    (call-process-discard-output "rm" "-rf" filename)))

(defalias 'system-move-file-to-trash 'trash-or-rm)

(defadvice delete-directory (around no-recursive-trash activate)
  "When trashing a directory, there's no need to trash its contents first."
  (if delete-by-moving-to-trash
    (move-file-to-trash directory)
    ad-do-it))

(defadvice dired-delete-file (around no-recursive-trash activate)
  "When trashing a directory, there's no need to trash its contents first.
There's also no need to ask, because it's undoable."
  (if delete-by-moving-to-trash
      (move-file-to-trash file)
    ad-do-it))

编辑:我应该提到我上面的解决方案需要gvfs-trash命令行程序,它与GNOME相关联。如果您不使用GNOME,您可以将它替换为垃圾-cli包的trash

票数 1
EN

Stack Overflow用户

发布于 2011-08-21 16:55:27

我的“答案”是:M-x report-emacs-bug。窃听器报告对每个人都有帮助。Emacs将确定是否确实存在bug,每个参与其中的人都将从报告中学习。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2583541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档