Emacs dizinlerini karşılaştırma


15

Deniyorum ediff-directories, ancak doğru kullandığımdan emin değilim.

Belgelere okudum, iki dizin sağladığımda ediff-directories, ==Emacs tuşuna basarsam bunları yinelemeli olarak karşılaştırır.

Ancak, tuşuna basarsam, komutu çalıştırdığım düzeyde ==yalnızca =işaretli klasörler (iki klasörün aynı içeriğe sahip olduğu anlamına gelir) alıyorum. =Klasör hiyerarşisinde hangi klasörlerin daha derin düzeylerde işaretlere sahip olduğunu görmek istersem , ==komutu her düzeyde yeniden çalıştırmam gerekir .

Emacs'a yapraklara kadar tekrar tekrar gitmesini nasıl söyleyebilirim, böylece yapraklardaki tüm farklılıkları görebilirim. directory difference buffer (klavye komutu aracılığıyla erişilebilir)D ?

Herkes ediff-directories(resmi belgeler dışında ) nasıl kullanılacağına dair bir eğitim biliyorsa, çok ilgilenirim.


Ayrıca, bir oturum grubundan çıkmak (bir düzeydeki klasörlerin karşılaştırılması), ancak daha derin düzeylerde açık oturumlarım varsa, q(bu oturum grubundan çık) düğmesine basarsam, Emacs mesajla şikayet eder:

Bu oturum grubunun etkin oturumları var - çıkamıyor

Alt gruplardan tek tek çıkmadan oturum gruplarından nasıl çıkabilirim?


1
Ediff için karşılaştırmak ötesinde kullanılabilir hale getirmek için ne ödeyeceğim ...
ckhan

1
ztree-diffiki dizini özyinelemeli olarak ayırabilir. github.com/fourier/ztree
momeara

Yanıtlar:


5

Kullandım M-x dired-compare-directories, ancak tarif ettiğiniz durumda size daha iyi hizmet edebilecek EdiffTrees de var .


3

Bu özelliğe de ihtiyacım vardı ve aşağıdakileri buldum. Fonksiyon şöyle ediff-directories-recursiveçalışırediff-directories ancak alt dizinlere geri döner.

Bunun arkasındaki sihir, çağrılmadan önce yerleşik olanı directory-fileskendiliğinden yapılmış directory-files-recursivebiriyle değiştirir 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))))))

Eval-buffer yaptım ve bunu aldım: Hata ayıklayıcı girildi - Lisp hatası: (yanlış tip-argüman symbolp (autoload "ediff" 890739 t nil)) interaktif-form ((autoload "ediff" 890739 t nil)) Herhangi bir öneriniz var mı?
yeğeni

0

Orada ztree: özyinelemeli dizin ağacı karşılaştırma destekler Melpa temin paket M-x ztree-diffGNU kullanarak diffkarşılık gelen dosyaları karşılaştırmak için yardımcı programları.

Paketi use-packageyüklemek ve yapılandırmak için o zaman kullanıyorsanız ztree, aşağıdakilere ekleyin .emacs:

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.