【发布时间】:2011-02-04 08:26:18
【问题描述】:
C-x s 使用diff 来显示更改。如何改用ediff?
【问题讨论】:
标签: emacs diff emacs-ediff
C-x s 使用diff 来显示更改。如何改用ediff?
【问题讨论】:
标签: emacs diff emacs-ediff
我可以看到几种方法来做到这一点。第一种是用修改后的代码替换save-some-buffers-action-alist变量,这样更直接。第二种是建议save-some-buffers,重新定义那些action调用的函数,不过这有点棘手。
两种方法我都试过了,我认为这是最好的选择:
;; 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))
【讨论】:
save-some-buffers-action-alist。我已经相应地编辑了这个答案,并改进了代码,以便我只更改与“d”键关联的操作。
文档说,变量diff-command 是可自定义的。但是,请记住它指向外部程序,而不是 elisp 函数。 ediff 是 ediff.el 中的一个 elisp 函数。您可能需要将 diff.el 编辑为 (require 'ediff),然后在 diff.el 中到处调整以确保您没有破坏其他任何内容。
【讨论】: