【问题标题】:Using ediff with C-x s (save-some-buffers) in Emacs?在 Emacs 中使用 ediff 和 C-x (保存一些缓冲区)?
【发布时间】:2011-02-04 08:26:18
【问题描述】:

C-x s 使用diff 来显示更改。如何改用ediff

【问题讨论】:

    标签: emacs diff emacs-ediff


    【解决方案1】:

    我可以看到几种方法来做到这一点。第一种是用修改后的代码替换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”键关联的操作。
    • 附注在我的带有 cygwin 的 windows 盒子上,第一次使用它时,我在 *ediff-errors* 缓冲区中收到“cygwin 警告:检测到 MS-DOS 样式路径”错误,但所有后续使用都按预期工作。我假设我只是对我的 cygwin 集成有一个问题需要解决,并且这个问题(或类似的问题)一般不会出现。
    • 这个答案很棒:(1) 它回答了这个问题,(2) 它详细阐述了不同的解决方案路径,(3) 它具有适当、简短但非常复杂的代码。它有效! :-) 我希望我能把它作为公认的答案......
    【解决方案2】:

    文档说,变量diff-command 是可自定义的。但是,请记住它指向外部程序,而不是 elisp 函数。 ediff 是 ediff.el 中的一个 elisp 函数。您可能需要将 diff.el 编辑为 (require 'ediff),然后在 diff.el 中到处调整以确保您没有破坏其他任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多