การเปรียบเทียบไดเรกทอรีใน Emacs


15

ฉันกำลังทดลองกับediff-directoriesแต่ฉันไม่แน่ใจว่าฉันใช้มันถูกต้อง

ฉันอ่านในเอกสารที่เมื่อฉันจัดหาสองไดเรกทอรีให้ediff-directoriesถ้าฉันกด==Emacs เปรียบเทียบพวกเขาซ้ำ ๆ

อย่างไรก็ตามถ้าฉันกด==ฉันจะได้รับโฟลเดอร์ที่มี=เครื่องหมาย (หมายความว่าทั้งสองโฟลเดอร์มีเนื้อหาเหมือนกัน) ในระดับที่ฉันเรียกใช้คำสั่ง หากฉันต้องการดูว่าโฟลเดอร์ใดมี=เครื่องหมายที่ระดับลึกกว่าในลำดับชั้นของโฟลเดอร์ฉันต้องเรียกใช้==คำสั่งอีกครั้งในแต่ละระดับ

ฉันจะบอก emacs ให้ออกไปเรื่อย ๆ จนไปถึงใบไม้ได้อย่างไรเพื่อที่ฉันจะได้เห็นความแตกต่างทั้งหมดในdirectory difference buffer(สามารถเข้าถึงได้ผ่านคำสั่งแป้นพิมพ์D)

หากใครรู้เกี่ยวกับการสอนเกี่ยวกับวิธีการใช้ediff-directories(นอกเหนือจากเอกสารอย่างเป็นทางการ) ฉันจะสนใจอย่างมาก


นอกจากนี้หากฉันต้องการออกจากกลุ่มเซสชัน (เปรียบเทียบโฟลเดอร์ที่ระดับหนึ่ง) แต่ฉันมีเซสชันเปิดสำหรับระดับที่ลึกกว่าถ้าฉันกดq(ออกจากกลุ่มเซสชันนี้) Emacs บ่นกับ messaage:

กลุ่ม sesssion นี้มีเซสชันที่ใช้งานอยู่ --- ไม่สามารถออกได้

ฉันจะออกจากกลุ่มเซสชันโดยไม่ออกจากเซสชันย่อยหนึ่งต่อหนึ่งได้อย่างไร


1
สิ่งที่ฉันจ่ายให้ ediff เพื่อใช้งานได้เปรียบ Beyond ...
ckhan

1
ztree-diffสามารถแตกต่างกันสองไดเรกทอรีซ้ำ github.com/fourier/ztree
momeara

คำตอบ:


5

ฉันเคยใช้M-x dired-compare-directoriesแต่ยังมีEdiffTreesซึ่งอาจให้บริการคุณได้ดีขึ้นในสถานการณ์ที่คุณอธิบาย


3

ฉันยังต้องการคุณสมบัตินี้และมาพร้อมกับสิ่งต่อไปนี้ ฟังก์ชั่นediff-directories-recursiveทำงานเหมือนediff-directoriesแต่เรียกใช้ซ้ำในไดเรกทอรีย่อย

มายากลที่อยู่เบื้องหลังที่ชั่วคราวแทนที่ในตัวdirectory-filesโดยที่ตัวเองทำก่อนที่จะเรียกdirectory-files-recursiveediff-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 และได้รับสิ่งนี้: ดีบักเกอร์ที่ป้อน - ข้อผิดพลาดกระเพื่อม: (สัญลักษณ์ประเภทอาร์กิวเมนต์ที่ไม่ถูกต้อง (autoload "ediff" 890739 t nil)) รูปแบบโต้ตอบ ((autoload "ediff" 890739 t ไม่มี)) ข้อเสนอแนะ?
หลานชาย

0

มีztreeแพ็คเกจพร้อมใช้งานจาก Melpa ซึ่งรองรับการเปรียบเทียบทรีไดเรกทอรีแบบเรียกซ้ำ: M-x ztree-diffใช้diffโปรแกรมอรรถประโยชน์GNU เพื่อเปรียบเทียบไฟล์ที่เกี่ยวข้อง

หากคุณใช้use-packageเพื่อติดตั้งและกำหนดค่าztreeแพ็คเกจให้เพิ่มใน.emacs:

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.