在Emacs中比较目录


15

我正在尝试ediff-directories,但是不确定我是否正确使用它。

我在文档中读到,一旦向提供了两个目录ediff-directories,如果按==Emacs ,则会递归比较它们。

但是,如果按该按钮,则在运行命令的级别上==只会得到带有=符号的文件夹(这意味着两个文件夹具有相同的内容)。如果要查看哪些文件夹=在文件夹层次结构的更深层具有标志,则需要==在每个级别重新运行该命令。

我怎样才能告诉emacs递归地一直到叶子,以便我可以看到中的所有差异directory difference buffer(可通过键盘命令访问D)?

如果有人知道如何使用的教程ediff-directories(除了官方文档),我将非常感兴趣。


另外,如果我要退出会话组(在一个级别上比较文件夹),但是我打开了更深层次的会话,如果按q(退出此会话组),Emacs会抱怨:

此会话组的会话正在进行-无法退出

如何退出会话组而又不一一退出子会话?


1
我所付出的ediff成为作为可用作超越比较 ...
ckhan

1
ztree-diff可以递归地区分两个目录。github.com/fourier/ztree
momeara 2015年

Answers:


5

我已经使用过M-x dired-compare-directories,但是还有EdiffTrees,它可以在您描述的情况下更好地为您提供服务。


3

我还需要此功能,并提出以下建议。该函数的ediff-directories-recursive工作方式类似,ediff-directories但递归到子目录中。

其背后的魔力是在呼叫之前directory-files用自制的临时替代内置组件。directory-files-recursiveediff-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))))))

我做了eval-buffer并得到了以下信息:调试器输入-Lisp错误:(错误类型的参数symbolp(自动加载“ ediff” 890739 t零))interactive-form((自动加载“ ediff” 890739零))有什么建议吗?
nephewtom

0

ztree从Melpa包支持递归目录树比较:M-x ztree-diff使用GNU diff工具来比较相应的文件。

如果您使用use-packagethen安装和配置ztree软件包,请添加到.emacs

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.