Emacsでのディレクトリの比較


15

私はを試していますがediff-directories、それを正しく使用しているかどうかはわかりません。

Emacs を押すとに2つのディレクトリを指定すると、ドキュメントを読んでそれらを再帰的に比較します。ediff-directories==

ただし、押す===、コマンドを実行するレベルで記号の付いたフォルダー(2つのフォルダーの内容が同じであることを意味する)のみが取得されます。=フォルダー階層のより深いレベルでどのフォルダーにサインがあるかを確認したい場合は==、各レベルでコマンドを再実行する必要があります。

directory difference buffer(キーボードコマンドでアクセス可能D)のすべての違いを見ることができるように、emacsに葉までずっと再帰的に進むように指示するにはどうすればよいですか?

使用方法に関するチュートリアルediff-directories(公式ドキュメント以外)を知っている人がいれば、非常に興味があります。


また、セッショングループを終了したい(あるレベルのフォルダーの比較)が、より深いレベルのセッションを開いている場合、q(このセッショングループを終了する)を押すと、Emacsはメッセージに文句を言います:

このセッショングループにはアクティブなセッションがあります---終了できません

サブセッションを1つずつ終了せずにセッショングループを終了するにはどうすればよいですか?


1
私は何として使えるようになるためにediffを支払うだろう向こうが比較 ...
ckhan

1
ztree-diff2つのディレクトリを再帰的に比較できます。github.com/fourier/ztree
momeara

回答:



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を実行し、これを取得しました:デバッガーが入力されました-Lispエラー:(wrong-type-argument symbolp(autoload "ediff" 890739 t nil))interactive-form((autoload "ediff" 890739 t nil))提案はありますか?
nephewtom

0

ありztree:再帰的なディレクトリツリーの比較をサポートしていMelpaから利用可能なパッケージM-x ztree-diffのGNU使用してdiff、対応するファイルを比較するユーティリティが。

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.