2

C-x s変更を表示するために使用diffします。代わりにどのように使用できediffますか?

4

2 に答える 2

3

これを行うためのいくつかのアプローチを見ることができます。1 つ目は、変数を変更されたコードに置き換えることsave-some-buffers-action-alistです。これはより簡単です。2 つ目は、これらのアクションによって呼び出される関数をアドバイスsave-some-buffersして再定義することですが、これは少しトリッキーです。

私は両方の方法で試しましたが、これが最良の選択肢だと思います:

;; Use ediff instead of diff in `save-some-buffers'
(eval-after-load "files"
  '(progn
     (setcdr (assq ?d save-some-buffers-action-alist)
             `(,(lambda (buf)
                  (if (null (buffer-file-name buf))
                      (message "Not applicable: no file")
                    (add-hook 'ediff-after-quit-hook-internal
                              'my-save-some-buffers-with-ediff-quit t)
                    (save-excursion
                      (set-buffer buf)
                      (let ((enable-recursive-minibuffers t))
                        (ediff-current-file)
                        (recursive-edit))))
                  ;; Return nil to ask about BUF again.
                  nil)
               ,(purecopy "view changes in this buffer")))

     (defun my-save-some-buffers-with-ediff-quit ()
       "Remove ourselves from the ediff quit hook, and
return to the save-some-buffers minibuffer prompt."
       (remove-hook 'ediff-after-quit-hook-internal
                    'my-save-some-buffers-with-ediff-quit)
       (exit-recursive-edit))))

アドバイスを使用する私の試みには欠陥があります (これはC-rも呼び出す動作を壊し、view-bufferこの目的でアドバイスを使用することを再考させました)、しかし FWIW:

(defadvice save-some-buffers (around my-save-some-buffers-with-ediff)
  "Use ediff instead of diff."
  (require 'cl)
  (flet ((view-buffer (&rest) nil)
         (diff-buffer-with-file
          (buf)
          (add-hook 'ediff-after-quit-hook-internal
                    'my-save-some-buffers-with-ediff-quit t)
          (save-excursion
            (set-buffer buf)
            (ediff-current-file))))
    (let ((enable-recursive-minibuffers t))
      ad-do-it)))
(ad-activate 'save-some-buffers)

(defun my-save-some-buffers-with-ediff-quit ()
  "Remove ourselves from the ediff quit hook, and
    return to the save-some-buffers minibuffer prompt."
  (remove-hook 'ediff-after-quit-hook-internal
               'my-save-some-buffers-with-ediff-quit)
  (exit-recursive-edit))
于 2011-02-04T13:32:49.593 に答える
1

変数diff-commandはカスタマイズ可能です、とドキュメントは述べています。ただし、elisp 関数ではなく、外部プログラムを指していることに注意してください。 ediffediff.el にある elisp 関数です。diff.el を編集してから diff.elのあちこち(require 'ediff)を微調整して、他に何も壊れていないことを確認する必要がある場合があります。

于 2011-02-04T09:31:33.470 に答える