Сравнение каталогов в Emacs


15

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

Я прочитал в документации, что, когда я нажимаю две директории ediff-directories, при нажатии ==Emacs сравнивает их рекурсивно.

Однако, если я нажимаю, ==я получаю только папки со =знаками (что означает, что две папки имеют идентичное содержимое) на уровне, где я запускаю команду. Если я хочу увидеть, какие папки имеют =знаки на более глубоких уровнях в иерархии папок, мне нужно повторно запустить ==команду на каждом уровне.

Как я могу сказать emacs рекурсивно пройти весь путь до листьев, чтобы я мог видеть все различия в directory difference buffer(доступны через команду клавиатуры D)?

Если кто-нибудь знает учебник по использованию ediff-directories(кроме официальной документации ), я был бы очень заинтересован.


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

Эта группа сессий имеет активные сеансы --- не может выйти

Как я могу выйти из сессионных групп, не выходя из под-сессий одна за другой?


1
Сколько бы я заплатил за ediff, чтобы он стал таким же удобным, как Beyond Compare ...
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-buffer и получил это: Вошел отладчик - ошибка Лиспа: (неправильный аргумент-символ-символ (автозагрузка "ediff" 890739 т ноль)) интерактивная форма ((автозагрузка "эдифф" 890739 т ноль)) Есть предложения?
племянник

0

В ztreeMelpa доступен пакет, поддерживающий рекурсивное сравнение дерева каталогов: 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.