在Emacs中使用带有C-x s(保存一些缓冲区)的ediff?
C-x s使用在Emacs中使用带有C-x s(保存一些缓冲区)的ediff?,emacs,diff,emacs-ediff,Emacs,Diff,Emacs Ediff,C-x s使用diff显示更改。如何改用ediff?文档中说,变量diff命令是可自定义的。但是,请记住,它指向外部程序,而不是elisp函数ediff是ediff.el中的一个elisp函数。您可能需要将diff.el编辑为(需要'ediff),然后在diff.el中四处调整,以确保不破坏任何其他内容。我可以看到一些方法来实现这一点。第一种方法是用修改过的代码替换save some buffers操作变量,这更简单。第二种方法是建议保存一些缓冲区,并重新定义这些操作调用的函数,但这有点棘手 我
diff
显示更改。如何改用ediff
?文档中说,变量diff命令是可自定义的。但是,请记住,它指向外部程序,而不是elisp函数ediff
是ediff.el中的一个elisp函数。您可能需要将diff.el编辑为(需要'ediff)
,然后在diff.el中四处调整,以确保不破坏任何其他内容。我可以看到一些方法来实现这一点。第一种方法是用修改过的代码替换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行为,C-r行为也会调用视图缓冲区
,这导致我重新考虑为此目的使用建议),但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))
我改变了主意,选择直接更新保存一些缓冲区操作。我已经相应地编辑了这个答案,并改进了代码,因此我只更改与“d”键相关的操作。在使用cygwin的windows box上,我第一次使用它时,在*ediff errors*缓冲区中出现“cygwin warning:MS-DOS style path detected”错误,但所有后续使用都按预期工作。我想我只是对我的cygwin集成有一个问题需要解决,而且这个问题(或任何类似的问题)一般不会出现。这个答案很好:(1)它回答了这个问题,(2)它在不同的解决方案路径上有一些延迟,(3)它有适当、简短但相当复杂的代码。而且它是有效的!:-)我希望我能让它成为公认的答案。。。