Porównywanie katalogów w Emacsie

15

Eksperymentuję z ediff-directories, ale nie jestem pewien, czy używam go poprawnie.

Przeczytałem w dokumentacji, że gdy dostarczę dwa katalogi ediff-directories, po naciśnięciu ==Emacs porównuje je rekurencyjnie.

Jednak po naciśnięciu ==dostaję tylko foldery ze =znakami (co oznacza, że ​​dwa foldery mają identyczną zawartość) na poziomie, na którym uruchamiam polecenie. Jeśli chcę zobaczyć, które foldery mają =znaki na głębszych poziomach w hierarchii folderów, muszę ponownie uruchomić ==polecenie na każdym poziomie.

Jak mogę powiedzieć emacsowi, aby rekurencyjnie podążał do liści, aby zobaczyć wszystkie różnice w directory difference buffer(dostępne za pomocą polecenia klawiatury D)?

Jeśli ktoś zna tutorial na temat korzystania ediff-directories(inny niż oficjalna dokumentacja ), byłbym bardzo zainteresowany.


Ponadto, jeśli chcę wyjść z grupy sesji (porównanie folderów na jednym poziomie), ale mam otwarte sesje dla głębszych poziomów, jeśli qnacisnę (wyjdę z tej grupy sesji), Emacs narzeka na komunikat:

Ta grupa sesji ma aktywne sesje --- nie może wyjść

Jak wyjść z grup sesji bez wychodzenia z podsekcji jedna po drugiej?

Amelio Vazquez-Reina
źródło
1
Co zapłaciłbym, aby Ediff stał się tak użyteczny jak Beyond Compare ...
ckhan
1
ztree-diffmoże rekurencyjnie różnicować dwa katalogi. github.com/fourier/ztree
momeara

Odpowiedzi:

5

Użyłem M-x dired-compare-directories, ale są też EdiffTrees , które mogą ci lepiej służyć w opisywanej sytuacji.

Steen
źródło
3

Potrzebowałem również tej funkcji i wymyśliłem następujące. Funkcja ediff-directories-recursivedziała jak, ediff-directoriesale rekursuje w podkatalogach.

Magia, która za tym stoi, tymczasowo zastępuje wbudowane directory-filesprzez siebie, directory-files-recursivezanim zadzwoni 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))))))
Tobiasz
źródło
Zrobiłem bufor ewaluacyjny i otrzymałem to: Debuger wszedł - Błąd Lisp: (niepoprawny typ argumentu symbolp (autoload „ediff” 890739 do zera)) interaktywna forma ((autoload „ediff” 890739 do zera)) Wszelkie sugestie?
nephewtom,
0

Dostępny jest ztreepakiet od Melpy, który obsługuje rekurencyjne porównywanie drzew katalogów: M-x ztree-diffużywanie diffnarzędzi GNU do porównywania odpowiednich plików.

Jeśli używasz use-packagenastępnie, aby zainstalować i skonfigurować ztreepakiet, dodaj do .emacs:

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility
jfs
źródło