比较 Emacs 中的目录

比较 Emacs 中的目录

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

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

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

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

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


另外,如果我想退出一个会话组(比较某一级别的文件夹),但我打开了更深层次的会话,如果我按下q(退出此会话组),Emacs 会抱怨以下消息:

该会话组有活动会话---无法退出

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

答案1

ztreeMelpa 提供的软件包支持递归目录树比较: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-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))))))

答案4

想添加到ztree上面的推荐中; ztree 太棒了。对于那些持观望态度的人,这里有一个屏幕截图。在此输入图像描述

相关内容