So sánh các thư mục trong Emacs


15

Tôi đang thử nghiệm ediff-directories, nhưng tôi không chắc mình đang sử dụng nó một cách chính xác.

Tôi đọc trong tài liệu rằng, một khi tôi cung cấp hai thư mục ediff-directories, nếu tôi nhấn ==Emacs sẽ so sánh chúng một cách đệ quy.

Tuy nhiên, nếu tôi nhấn, ==tôi chỉ nhận được các thư mục có =dấu hiệu (nghĩa là hai thư mục có nội dung giống hệt nhau) ở cấp độ tôi chạy lệnh. Nếu tôi muốn xem thư mục nào có =dấu hiệu ở cấp độ sâu hơn trong hệ thống phân cấp thư mục, tôi cần chạy lại ==lệnh ở mỗi cấp.

Làm thế nào tôi có thể bảo emacs đi theo cách đệ quy đến các lá để tôi có thể thấy tất cả sự khác biệt trong directory difference buffer(có thể truy cập thông qua lệnh bàn phím D)?

Nếu bất cứ ai biết về một hướng dẫn về cách sử dụng ediff-directories(ngoài tài liệu chính thức ), tôi sẽ rất thích thú.


Ngoài ra, nếu tôi muốn thoát khỏi một nhóm phiên (so sánh các thư mục ở một cấp độ), nhưng tôi có các phiên mở cho các cấp độ sâu hơn, nếu tôi nhấn q(thoát khỏi nhóm phiên này), Emacs phàn nàn với mớ hỗn độn:

Nhóm sesssion này có các phiên hoạt động --- không thể thoát

Làm cách nào tôi có thể thoát khỏi các nhóm phiên mà không thoát từng phiên phụ?


1
Những gì tôi sẽ trả cho ediff để có thể sử dụng được như Beyond So sánh ...
ckhan

1
ztree-diffcó thể khác hai thư mục đệ quy. github.com/fourier/ztree
momeara

Câu trả lời:


5

Tôi đã sử dụng M-x dired-compare-directories, nhưng cũng có EdiffTrees , có thể phục vụ bạn tốt hơn trong tình huống bạn mô tả.


3

Tôi cũng cần tính năng này và đưa ra những điều sau đây. Hàm này ediff-directories-recursivehoạt động như thế ediff-directoriesnhưng đệ quy vào các thư mục con.

Phép thuật đằng sau đó đang tạm thời thay thế tích hợp directory-filesbằng cách tự tạo directory-files-recursivetrước khi gọi 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))))))

Tôi đã thực hiện eval-buffer và nhận được điều này: Debugger đã nhập - Lỗi Lisp: (ký hiệu đối số kiểu sai (autoload "ediff" 890739 t nil)) dạng tương tác ((autoload "ediff" 890739 t nil)) Có gợi ý nào không?
cháu trai

0

ztreesẵn gói từ Melpa hỗ trợ so sánh cây thư mục đệ quy: M-x ztree-diffsử dụng diffcác tiện ích GNU để so sánh các tệp tương ứng.

Nếu bạn sử dụng use-packagesau đó để cài đặt và định cấu hình ztreegói, hãy thêm vào .emacs:

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.