[unix] Emacs에서 디렉토리 비교

실험 ediff-directories중이지만 올바르게 사용하고 있는지 확실하지 않습니다.

문서 에서 두 개의 디렉토리를 제공 ediff-directories하면 ==Emacs를 누르면 재귀 적으로 비교 한다는 내용을 읽었습니다 .

그러나 키를 누르면 명령을 실행하는 수준에서 기호가 ==있는 폴더 만 =표시됩니다 (두 폴더의 내용이 동일 함을 의미 함). =폴더 계층에서 더 깊은 수준의 표시 가있는 폴더를 보려면 ==각 수준에서 명령 을 다시 실행해야 합니다.

emacs에게 directory difference buffer(키보드 명령을 통해 액세스 할 수있는)의 모든 차이점을 볼 수 있도록 잎까지 반복적으로 가도록 지시하려면 D어떻게해야합니까?

누구든지 ediff-directories(공식 문서 이외의) 사용 방법에 대한 자습서를 알고 있다면 매우 관심이 있습니다.


또한 세션 그룹 (한 레벨의 폴더 비교)을 종료하고 싶지만 더 깊은 수준의 세션을 열려면 q(이 세션 그룹을 종료하십시오)을 누르면 Emacs는 메시지와 함께 불평합니다.

이 세션 그룹에는 활성 세션이 있습니다.

하위 세션을 하나씩 종료하지 않고 세션 그룹을 종료하려면 어떻게해야합니까?



답변

나는 사용 M-x dired-compare-directories했지만 , 당신이 묘사 한 상황에서 더 잘 봉사 할 수있는 EdiffTrees 도 있습니다.


답변

나는 또한이 기능이 필요했고 다음을 생각해 냈습니다. 함수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))))))


답변

ztree재귀 디렉토리 트리 비교를 지원 Melpa에서 사용할 패키지 : M-x ztree-diffGNU를 사용하여diff 해당 파일을 비교하는 유틸리티.

use-package그런 다음 ztree패키지 를 설치 및 구성하는 데 사용하는 경우 다음에 추가하십시오 .emacs.

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility


답변