Comparando diretórios no Emacs

13

Estou experimentando com ediff-directories , mas não tenho certeza se estou usando corretamente.

Eu li na documentação que, uma vez eu forneço dois diretórios para ediff-directories , se eu pressionar == o Emacs os compara recursivamente.

No entanto, se eu pressionar == , só obtenho pastas com = sinais (o que significa que as duas pastas têm conteúdos idênticos) no nível em que executo o comando. Se eu quiser ver quais pastas têm sinais = em níveis mais profundos na hierarquia de pastas, preciso executar novamente o comando == em cada nível.

Como posso dizer ao emacs para ir recursivamente até as folhas para que eu possa ver todas as diferenças no directory difference buffer (acessível via o comando de teclado D )?

Se alguém souber de um tutorial sobre como usar o ediff-directories (além da documentação oficial da ), eu estaria muito interessado.

Além disso, se eu quiser sair de um grupo de sessão (comparação de pastas em um nível), mas tiver sessões abertas para níveis mais profundos, se pressionar q (sair deste grupo de sessão), o Emacs reclamará com a mensagem:

This sesssion group has active sessions---cannot exit

Como posso sair de grupos de sessão sem sair das sub sessões uma por uma?

    
por Amelio Vazquez-Reina 19.12.2011 / 00:02

3 respostas

5

Eu usei M-x dired-compare-directories , mas também há EdiffTrees , que pode ser útil para você na situação descrita .

    
por 24.09.2012 / 13:35
3

Eu também precisava desse recurso e recebi o seguinte. A função ediff-directories-recursive funciona como ediff-directories , mas recursa em subdiretórios.

A mágica por trás disso está substituindo temporariamente o directory-files incorporado por um directory-files-recursive feito por você mesmo antes de chamar 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))))))
    
por 28.08.2014 / 18:53
0

Existe o pacote ztree disponível no Melpa que suporta a comparação de árvore de diretórios recursivos: M-x ztree-diff usando utilitários GNU diff para comparar arquivos correspondentes.

Se você usar use-package para instalar e configurar o ztree package, adicione ao seu .emacs :

;; ** recursive directory tree comparison: M-x ztree-diff
(use-package ztree
  :ensure t) ; needs GNU diff utility
    
por 18.10.2018 / 07:43

Tags