File 在Emacs lisp中选择忽略子目录的异步复制目录?

File 在Emacs lisp中选择忽略子目录的异步复制目录?,file,emacs,directory,File,Emacs,Directory,几个月来,我一直在使用异步复制目录问题答案中的代码,但有时我需要忽略一个或多个子目录。有没有一种简单的方法可以通过稍微修改代码来做到这一点 我曾尝试使用选择性目录复制:SDC-package-from,但当文件或文件夹已经存在时,它会停止 这是我现在正在使用的代码: (异步启动) `(lambda() (复制目录,“~/Documents/data/”,“~/Dropbox/data\u backup/”t) ,“~/Documents/data/”) (lambda(返回路径) (消息“上载“

几个月来,我一直在使用异步复制目录问题答案中的代码,但有时我需要忽略一个或多个子目录。有没有一种简单的方法可以通过稍微修改代码来做到这一点

我曾尝试使用选择性目录复制:SDC-package-from,但当文件或文件夹已经存在时,它会停止

这是我现在正在使用的代码:

(异步启动)
`(lambda()
(复制目录,“~/Documents/data/”,“~/Dropbox/data\u backup/”t)
,“~/Documents/data/”)
(lambda(返回路径)
(消息“上载“%s”已完成”返回路径)))

~/Documents/data
中有一个子目录,有时我希望它被忽略,因为它大于阈值。

复制目录
递归调用自身。您可以使用
cl-flet
在本地重新定义它,同时保留原始定义。您也可以使用建议来实现这一点(实际上,这种
cl-flet
技术似乎打破了建议),但它实际上是在全局范围内重新定义函数,您需要使用变量等来控制它

(defun jpk/copy-directory (directory newname &optional keep-time parents copy-contents)
  (cl-letf (((symbol-function 'orig/copy-directory) (symbol-function 'copy-directory))
            ((symbol-function 'copy-directory)
             (lambda (directory newname &optional keep-time parents copy-contents)
               (if (string= directory "/path/to/foo")
                   (message "skipping: %s" directory)
                 (orig/copy-directory directory newname keep-time parents copy-contents)))))
    (copy-directory directory newname keep-time parents copy-contents)))
更详细地说:将原始函数存储到
orig/copy directory
,将函数
copy directory
替换为lambda,仅当目录名与某些字符串不匹配时才调用
orig/copy directory
,然后调用
copy directory
的新定义。对
copy directory
的递归调用也使用新定义。所有这些都封装在
jpk/copy目录中
。为了使测试更加灵活,您可以在
jpk/copy目录中添加一个谓词参数
,这样测试就不会硬编码