Membandingkan direktori di Emacs

15

Saya bereksperimen dengan ediff-directories, tetapi saya tidak yakin saya menggunakannya dengan benar.

Saya membaca dalam dokumentasi itu, begitu saya memasok dua direktori ediff-directories, jika saya menekan ==Emacs membandingkannya secara rekursif.

Namun, jika saya menekan ==saya hanya mendapatkan folder dengan =tanda (artinya kedua folder memiliki konten yang identik) pada tingkat di mana saya menjalankan perintah. Jika saya ingin melihat folder mana yang memiliki =tanda pada level yang lebih dalam dalam hirarki folder, saya perlu menjalankan kembali ==perintah di setiap level.

Bagaimana saya bisa memberitahu emacs untuk pergi secara rekursif ke daun sehingga saya bisa melihat semua perbedaan dalam directory difference buffer(diakses melalui perintah keyboard D)?

Jika ada yang tahu tutorial tentang cara menggunakan ediff-directories(selain dari dokumentasi resmi ), saya akan sangat tertarik.


Juga, jika saya ingin keluar dari grup sesi (perbandingan folder pada satu level), tetapi saya memiliki sesi terbuka untuk level yang lebih dalam, jika saya menekan q(keluar dari grup sesi ini), Emacs mengeluh dengan pesan:

Grup sesi ini memiliki sesi aktif --- tidak dapat keluar

Bagaimana saya bisa keluar dari grup sesi tanpa keluar dari sub-sesi satu per satu?

Amelio Vazquez-Reina
sumber
1
Apa yang akan saya bayar untuk ediff agar dapat digunakan seperti Beyond Compare ...
ckhan
1
ztree-diffdapat membedakan dua direktori secara rekursif. github.com/fourier/ztree
momeara

Jawaban:

5

Saya telah menggunakan M-x dired-compare-directories, tetapi ada juga EdiffTrees , yang mungkin bisa membantu Anda lebih baik dalam situasi yang Anda gambarkan.

Steen
sumber
3

Saya juga membutuhkan fitur ini dan muncul sebagai berikut. Fungsi ini ediff-directories-recursiveberfungsi seperti ediff-directoriestetapi berulang menjadi sub-direktori.

Keajaiban di balik itu untuk sementara menggantikan built-in directory-filesdengan buatan sendiri directory-files-recursivesebelum memanggil 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
sumber
Saya melakukan eval-buffer dan mendapatkan ini: Debugger dimasukkan - Kesalahan Lisp: (salah-jenis-simbol symbolp (autoload "ediff" 890739 t nil)) bentuk interaktif ((autoload "ediff" 890739 t nil)) Ada saran?
nephewtom
0

Ada ztreepaket yang tersedia dari Melpa yang mendukung perbandingan pohon direktori rekursif: M-x ztree-diffmenggunakan diffutilitas GNU untuk membandingkan file yang sesuai.

Jika Anda gunakan use-packageuntuk menginstal dan mengkonfigurasi ztreepaket, tambahkan ke .emacs:

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