Emacs의 디렉토리 비교

Emacs의 디렉토리 비교

사용해 보고 있지만 ediff-directories올바르게 사용하고 있는지 잘 모르겠습니다.

나는 읽었다문서두 개의 디렉토리를 제공하고 Emacs를 ediff-directories누르면 ==재귀적으로 비교할 것입니다.

그러나 이 버튼을 누르면 명령이 실행된 수준의 기호가 있는 폴더 ===가져옵니다(두 폴더 모두 동일한 내용을 가짐). 폴더 계층 구조에서 더 깊은 수준의 플래그가 있는 폴더를 확인하려면 =각 수준에서 명령을 다시 실행해야 합니다.==

Emacs에게 나뭇잎 의 모든 차이점을 볼 수 있도록 리프까지 반복하도록 어떻게 지시합니까 directory difference buffer(키보드 명령을 통해 액세스 가능 )?D

ediff-directories공식 튜토리얼 외에 튜토리얼 사용법을 아는 사람이 있다면문서), 정말 관심이 많을 것 같아요.


또한 세션을 종료하고 싶지만(특정 수준의 폴더 비교) 더 깊은 세션이 열려 있는 경우 q(이 세션 종료)를 누르면 Emacs는 다음 메시지를 표시합니다.

이 대화 그룹에는 활성 세션이 있습니다. --- 종료할 수 없습니다.

하위 세션을 하나씩 종료하지 않고 대화 그룹을 종료하는 방법은 무엇입니까?

답변1

가지다ztreeMelpa에서 제공하는 패키지는 재귀적인 디렉토리 트리 비교를 지원합니다. M-x ztree-diffGNU diff유틸리티를 사용하여 해당 파일을 비교합니다.

당신이 사용하는 경우use-packageztree그런 다음 패키지를 설치하고 구성하려면 다음을 추가하세요 .emacs.

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

답변2

사용해봤지만 M-x dired-compare-directories아직 남아있어요edif 트리, 귀하가 설명하는 상황에서 더 나은 서비스를 제공할 수 있습니다.

답변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는 훌륭합니다. 울타리에 계신 분들을 위해 여기 스크린샷이 있습니다.여기에 이미지 설명을 입력하세요.

관련 정보