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