Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Emacs中使用带有C-x s(保存一些缓冲区)的ediff?_Emacs_Diff_Emacs Ediff - Fatal编程技术网

在Emacs中使用带有C-x s(保存一些缓冲区)的ediff?

在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操作变量,这更简单。第二种方法是建议保存一些缓冲区,并重新定义这些操作调用的函数,但这有点棘手 我

C-x s使用
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)它有适当、简短但相当复杂的代码。而且它是有效的!:-)我希望我能让它成为公认的答案。。。