Порівняння каталогів у Emacs


15

Я експериментую ediff-directories, але я не впевнений, чи правильно ним користуюся.

У документації я читаю, що, як тільки я надсилаю два каталоги ediff-directories, якщо натискаю ==Emacs, їх рекурсивно порівнює.

Однак якщо я натискаю, ==я отримую лише папки зі =знаками ( маючи на увазі, що дві папки мають однаковий вміст) на рівні, де я запускаю команду. Якщо я хочу побачити, які папки мають =ознаки на більш глибоких рівнях в ієрархії папок, мені потрібно запустити ==команду на кожному рівні.

Як я можу сказати emacs пройти рекурсивно весь шлях до листя, щоб я міг бачити всі відмінності в directory difference buffer(доступний за допомогою команди клавіатури D)?

Якщо хтось знає про підручник щодо використання ediff-directories(крім офіційної документації ), я був би дуже зацікавлений.


Крім того, якщо я хочу вийти з групи сеансів (порівняння папок на одному рівні), але у мене відкриті сесії для більш глибоких рівнів, якщо я натискаю q(вийдіть із цієї групи сеансів), Emacs скаржиться на повідомлення:

Ця група сесій має активні сеанси --- не може вийти

Як я можу вийти з сесійних груп, не виходячи з підсесій по черзі?


1
Що б я заплатив за те, щоб едіфф став таким же придатним, як і поза порівнянням ...
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-recursiveперед викликом 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-буфер і отримав це: Введено налагоджувач - помилка Lisp: (неправильний тип-аргумент symbolp (автоматичне завантаження "ediff" 890739 t nil)) interactive-form ((autoload "ediff" 890739 t nil)) Будь-яка пропозиція?
племінник

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.