Confronto di directory in Emacs


15

Sto sperimentando ediff-directories, ma non sono sicuro di usarlo correttamente.

Ho letto nella documentazione che, una volta fornito a due directory ediff-directories, se premo ==Emacs le confronta in modo ricorsivo.

Tuttavia, se premo ==ottengo solo cartelle con =segni (il che significa che le due cartelle hanno contenuti identici) al livello in cui eseguo il comando. Se voglio vedere quali cartelle hanno =segni a livelli più profondi nella gerarchia delle cartelle, devo rieseguire il ==comando ad ogni livello.

Come posso dire a emacs di ricorrere in modo ricorsivo fino alle foglie in modo da poter vedere tutte le differenze directory difference buffer(accessibile tramite il comando da tastiera D)?

Se qualcuno fosse a conoscenza di un tutorial su come usare ediff-directories(diverso dalla documentazione ufficiale ), sarei molto interessato.


Inoltre, se voglio uscire da un gruppo di sessioni (confronto di cartelle a un livello), ma ho sessioni aperte per livelli più profondi, se premo q(esco da questo gruppo di sessioni), Emacs si lamenta del messaggio:

Questo gruppo di sessioni ha sessioni attive --- non può uscire

Come posso uscire dai gruppi di sessioni senza uscire le sottosessioni una alla volta?


1
Quello che pagherei perché Ediff diventasse utilizzabile come Beyond Compare ...
ckhan

1
ztree-diffpuò diff su due directory ricorsivamente. github.com/fourier/ztree
momeara

Risposte:


5

Ho usato M-x dired-compare-directories, ma c'è anche EdiffTrees , che potrebbe aiutarti meglio nella situazione che descrivi.


3

Avevo anche bisogno di questa funzione e ho pensato a quanto segue. La funzione ediff-directories-recursivefunziona come, ediff-directoriesma ricorre in sottodirectory.

La magia che sta dietro sta temporaneamente sostituendo quella incorporata directory-filescon un fatto da sé directory-files-recursiveprima di chiamare 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))))))

Ho fatto eval-buffer e ho ottenuto questo: Debugger inserito - Errore Lisp: (errore-tipo-argomento symbolp (autoload "ediff" 890739 t nil)) interattivo-form ((autoload "ediff" 890739 t nil)) Qualche suggerimento?
nipote

0

C'è un ztreepacchetto disponibile da Melpa che supporta il confronto di alberi di directory ricorsivi: M-x ztree-diffusare le diffutility GNU per confrontare i file corrispondenti.

Se lo usi use-packageper installare e configurare il ztreepacchetto, aggiungi a .emacs:

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.