Verzeichnisse in Emacs vergleichen

15

Ich experimentiere mit ediff-directories, bin mir aber nicht sicher, ob ich es richtig verwende.

Ich habe in der Dokumentation gelesen, dass, sobald ich zwei Verzeichnisse anliege ediff-directories, wenn ich ==Emacs drücke, diese rekursiv verglichen werden.

Wenn ich jedoch drücke, ==erhalte ich nur Ordner mit =Zeichen (dh die beiden Ordner haben identischen Inhalt) auf der Ebene, auf der ich den Befehl ausführe. Wenn ich sehen möchte, welche Ordner =Zeichen auf tieferen Ebenen in der Ordnerhierarchie haben, muss ich den ==Befehl auf jeder Ebene erneut ausführen .

Wie kann ich Emacs anweisen, rekursiv bis zu den Blättern zu gehen, damit ich alle Unterschiede in der directory difference buffer(über den Tastaturbefehl D) sehen kann?

Wenn jemand eine Anleitung zur Verwendung kennt ediff-directories(außer der offiziellen Dokumentation ), wäre ich sehr interessiert.


Auch wenn ich eine Sitzungsgruppe verlassen möchte (Vergleich von Ordnern auf einer Ebene), aber Sitzungen für tiefere Ebenen geöffnet sind, qbeschwert sich Emacs mit der Meldung:

Diese Sitzungsgruppe hat aktive Sitzungen - kann nicht beendet werden

Wie kann ich Sitzungsgruppen verlassen, ohne die Untersitzungen einzeln zu verlassen?

Amelio Vazquez-Reina
quelle
1
Was ich dafür bezahlen würde, dass Ediff so brauchbar wird wie Beyond Compare ...
ckhan
1
ztree-diffkann zwei Verzeichnisse rekursiv unterscheiden. github.com/fourier/ztree
momeara

Antworten:

5

Ich habe verwendet M-x dired-compare-directories, aber es gibt auch EdiffTrees , die Ihnen in der von Ihnen beschriebenen Situation besser dienen könnten.

Steen
quelle
3

Ich brauchte auch diese Funktion und kam mit den folgenden. Die Funktion ediff-directories-recursivefunktioniert wie ediff-directories, kehrt aber in Unterverzeichnisse zurück.

Die Magie dahinter besteht darin, das eingebaute vorübergehend directory-filesdurch ein selbstgemachtes zu ersetzen , directory-files-recursivebevor man anruft 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))))))
Tobias
quelle
Ich habe eval-buffer ausgeführt und Folgendes erhalten: Debugger eingegeben - Lisp-Fehler: (Argument mit falschem Typ symbolp (Autoload "ediff" 890739 t nil)) Interaktives Formular ((Autoload "ediff" 890739 t nil)) Irgendwelche Vorschläge?
Neffe
0

Es gibt ein ztreePaket von Melpa, das den rekursiven Verzeichnisbaumvergleich unterstützt: M-x ztree-diffVerwenden von GNU- diffDienstprogrammen, um entsprechende Dateien zu vergleichen.

Wenn Sie das Paket use-packagedann zum Installieren und Konfigurieren verwenden ztree, fügen Sie Folgendes hinzu .emacs:

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