Comparación de directorios en Emacs

15

Estoy experimentando con ediff-directories, pero no estoy seguro de si lo estoy usando correctamente.

Leí en la documentación que, una vez que proporciono dos directorios ediff-directories, si presiono ==Emacs los compara recursivamente.

Sin embargo, si presiono ==, solo obtengo carpetas con =signos (lo que significa que las dos carpetas tienen contenidos idénticos) en el nivel donde ejecuto el comando. Si quiero ver qué carpetas tienen =signos en niveles más profundos en la jerarquía de carpetas, necesito volver a ejecutar el ==comando en cada nivel.

¿Cómo puedo decirle a emacs que vaya recursivamente hasta las hojas para poder ver todas las diferencias en el directory difference buffer(accesible a través del comando del teclado D)?

Si alguien conoce un tutorial sobre cómo usarlo ediff-directories(aparte de la documentación oficial ), estaría muy interesado.


Además, si quiero salir de un grupo de sesión (comparación de carpetas en un nivel), pero tengo sesiones abiertas para niveles más profundos, si qpresiono (salir de este grupo de sesión), Emacs se queja con el mensaje:

Este grupo de sesiones tiene sesiones activas --- no puede salir

¿Cómo puedo salir de los grupos de sesiones sin salir de las sub-sesiones una por una?

Amelio Vazquez-Reina
fuente
1
Lo que pagaría por ediff llegar a ser tan usable como que no tiene comparación ...
ckhan
1
ztree-diffPuede diferenciar dos directorios de forma recursiva. github.com/fourier/ztree
momeara

Respuestas:

5

Lo he usado M-x dired-compare-directories, pero también está EdiffTrees , que podría servirle mejor en la situación que describe.

Steen
fuente
3

También necesitaba esta función y se me ocurrió lo siguiente. La función ediff-directories-recursivefunciona como ediff-directoriespero se repite en subdirectorios.

La magia detrás de eso está reemplazando temporalmente el incorporado directory-filespor uno propio directory-files-recursiveantes de llamar 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
fuente
Hice eval-buffer y obtuve esto: Depurador ingresado - Error de Lisp: (símbolo de argumento de tipo incorrectop (carga automática "ediff" 890739 t nil)) forma interactiva ((carga automática "ediff" 890739 t nil)) ¿Alguna sugerencia?
nephewtom
0

Hay un ztreepaquete disponible de Melpa que admite la comparación recursiva del árbol de directorios: el M-x ztree-diffuso de diffutilidades GNU para comparar los archivos correspondientes.

Si lo usa use-packagepara instalar y configurar el ztreepaquete, agregue a su .emacs:

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