我正在尝试ediff-directories
,但我不确定我是否正确使用它。
我读到文档一旦我向 提供两个目录ediff-directories
,如果我按==
Emacs 就会递归地比较它们。
但是,如果我按下,==
我只会=
在运行命令的级别上获得带有符号的文件夹(意味着这两个文件夹具有相同的内容)。如果我想查看哪些文件夹在文件夹层次结构中具有更深级别的标志,我需要在每个级别=
重新运行该命令。==
我如何告诉 emacs 一直递归到叶子,以便我可以看到directory difference buffer
(可通过键盘命令访问D
)中的所有差异?
如果有人知道如何使用教程ediff-directories
(除了官方的文档),我会非常感兴趣。
另外,如果我想退出一个会话组(比较某一级别的文件夹),但我打开了更深层次的会话,如果我按下q
(退出此会话组),Emacs 会抱怨以下消息:
该会话组有活动会话---无法退出
如何退出会话组而不逐一退出子会话?
答案1
有ztree
Melpa 提供的软件包支持递归目录树比较:M-x ztree-diff
使用 GNUdiff
实用程序来比较相应的文件。
如果你使用use-package
然后要安装和配置ztree
包,请添加到您的.emacs
:
;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
:ensure t) ; needs GNU diff utility
答案2
我用过M-x dired-compare-directories
,不过还有埃迪夫树,在您描述的情况下这可能会更好地为您服务。
答案3
我也需要这个功能并提出了以下内容。该函数的ediff-directories-recursive
工作原理与此类似ediff-directories
,但会递归到子目录中。
其背后的魔力是在调用之前暂时directory-files
用自制的替换内置的。directory-files-recursive
ediff-directories
(eval
(let ((directory-files-original (symbol-function 'directory-files)))
`(defun directory-files-recursive (directory &optional full match nosort)
"Like `directory-files' but recurses into subdirectories. Does not follow symbolic links."
(let* ((prefix (or (and full "") directory))
dirs
files)
(mapc (lambda (p)
(let ((fullname (if full p (concat prefix "/" p))))
(when (and (file-directory-p fullname)
(null (or (string-match "\\(^\\|/\\).$" p)
(string-match "\\(^\\|/\\)..$" p)
(file-symlink-p fullname))))
(setq dirs (cons p dirs)))))
(funcall ,directory-files-original directory full nil nosort))
(setq dirs (nreverse dirs))
(mapc (lambda (p)
(when (null (file-directory-p (if full p (concat prefix "/" p))))
(setq files (cons p files))))
(funcall ,directory-files-original directory full match nosort))
(setq files (nreverse files))
(mapc (lambda (d)
(setq files
(append files
(if full
(apply 'directory-files-recursive (list d full match nosort))
(mapcar (lambda (n)
(concat d "/" n))
(apply 'directory-files-recursive (list (concat prefix "/" d) full match nosort)))))))
dirs)
files))))
(eval
`(defun ediff-directories-recursive (dir1 dir2 regexp)
"Like `ediff-directories' but recurses into sub-directories. Does not follow symbolic links."
,(interactive-form (symbol-function 'ediff-directories))
(let ((directory-files-original (symbol-function 'directory-files)))
(unwind-protect
(progn
(fset 'directory-files (symbol-function 'directory-files-recursive))
(ediff-directories dir1 dir2 regexp)
(fset 'directory-files directory-files-original))))))