Использовать ediff с Cx s (save-some-buffers) в Emacs? - PullRequest
2 голосов
/ 04 февраля 2011

Cx s использует diff для отображения изменений.Как я могу использовать ediff вместо?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Я вижу пару подходов к этому.Первый - заменить переменную save-some-buffers-action-alist измененным кодом, что более просто.Второй - советовать 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))))

Моя попытка использовать совет ошибочна (это нарушает поведение Cr , которое также вызывает 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))
1 голос
/ 04 февраля 2011

Переменная diff-command настраивается, говорится в документации. Однако помните, что он указывает на внешнюю программу, а не на функцию elisp. ediff - это функция elisp, которая есть в ediff.el. Возможно, вам придется отредактировать diff.el в (require 'ediff), а затем настроить его в diff.el, чтобы увидеть, что вы больше ничего не ломаете.

...