Comparaison des répertoires dans Emacs

15

J'expérimente ediff-directories, mais je ne suis pas sûr de l'utiliser correctement.

J'ai lu dans la documentation qu'une fois que j'ai fourni deux répertoires ediff-directories, si j'appuie sur ==Emacs, il les compare récursivement.

Cependant, si j'appuie sur, ==j'obtiens uniquement des dossiers avec des =signes (ce qui signifie que les deux dossiers ont un contenu identique) au niveau où j'exécute la commande. Si je veux voir quels dossiers ont= signes à des niveaux plus profonds dans la hiérarchie des dossiers, je dois réexécuter la ==commande à chaque niveau.

Comment puis-je dire à emacs d'aller récursivement jusqu'aux feuilles pour que je puisse voir toutes les différences directory difference buffer (accessible via la commande clavier D)?

Si quelqu'un connaît un tutoriel sur l'utilisation ediff-directories(autre que la documentation officielle ), je serais très intéressé.


De plus, si je veux quitter un groupe de sessions (comparaison de dossiers à un niveau), mais que j'ai des sessions ouvertes pour des niveaux plus profonds, si j'appuie sur q(quitter ce groupe de sessions), Emacs se plaint du message:

Ce groupe de sessions a des sessions actives --- ne peut pas quitter

Comment puis-je quitter les groupes de sessions sans quitter les sous-sessions une par une?

Amelio Vazquez-Reina
la source
1
Ce que je paierais pour qu'ediff devienne aussi utilisable que Beyond Compare ...
ckhan
1
ztree-diffpeut différencier récursivement deux répertoires. github.com/fourier/ztree
momeara

Réponses:

5

J'ai utilisé M-x dired-compare-directories, mais il y a aussi EdiffTrees , qui pourrait mieux vous servir dans la situation que vous décrivez.

Steen
la source
3

J'avais également besoin de cette fonctionnalité et j'ai trouvé ce qui suit. La fonction ediff-directories-recursivefonctionne comme ediff-directoriesmais revient dans les sous-répertoires.

La magie derrière cela remplace temporairement l'intégré directory-filespar un self-made directory-files-recursiveavant d'appeler 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
la source
J'ai fait eval-buffer et j'ai obtenu ceci: Débogueur entré - Erreur Lisp: (symbolp de type incorrect (autoload "ediff" 890739 t nil)) forme interactive ((autoload "ediff" 890739 t nil)) Une suggestion?
nevhewtom
0

Il existe un ztreepackage disponible auprès de Melpa qui prend en charge la comparaison récursive de l'arborescence des répertoires: en M-x ztree-diffutilisant les diffutilitaires GNU pour comparer les fichiers correspondants.

Si vous utilisez use-packageensuite pour installer et configurer le ztreepackage, ajoutez à votre .emacs:

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