На «действительно редактировать буфер», emacs автоматически запускает ediff-current-file?

11

контекст

Когда emacs обнаруживает, что файл был изменен вне буфера редактирования.

Наблюдаемый

Emacs спросит:

изменено некоторое имя файла на диске; действительно редактировать буфер? (y, n, r или Ch)

(Между прочим, иногда это происходит, даже когда нет реальных изменений, например, удаленного файла на сервере с измененными часами, но вопрос интересен во всех случаях.)

Хотела

Emacs спросит:

изменено некоторое имя файла на диске; действительно редактировать буфер? (y, n, r, d или Ch)

Нажатие dпокажет разницу между версиями, например, ediff-current-fileкоторая позволяет интерактивно просматривать различия.

Дополнительная информация

Это было бы аналогично тому, что делает управление пакетами Debian, когда обнаруживает, что локально настроенный файл конфигурации обновляется более новой версией его собственного пакета. Пример см. В разделе Доступна новая версия файла конфигурации / etc / default / grub, но установленная в настоящее время версия была изменена локально - Unix & Linux Stack Exchange

Поиск, прежде чем спросить

Я обычно нахожу свой путь к решениям (например, emacsclient - из внешнего скрипта откройте файл и запустите какое-нибудь простое выражение, независимо от того, запущен emacs или нет - Emacs Stack Exchange ), но после поиска по этому вопросу я не смог найти какое-либо ранее существующее решение.

Я бы подумал о том, чтобы настроить это сам, но я не достаточно опытен во внутренностях emacs-lisp и emacs.

Эскиз решения

  • Нажатие C-gзатем «Mx ediff-current-file» делает работу за счет нескольких нажатий клавиш.
  • Целью здесь будет запускать ediff-current-fileнажатие одной клавиши в приведенной выше подсказке.
Стефан Гурихон
источник
1
Связанный: Как просмотреть diff, когда emacs предлагает восстановить этот файл?
Жиль "ТАК ... перестать быть злым"
@ Жиль, спасибо. Да, связанные и разные. Ваша ссылка о времени открытия файла. Здесь речь идет о времени сохранения файла.
Стефан Гурихон

Ответы:

2

grepping для "действительно редактировать буфер" в источнике emacs Я нашел функцию ask-user-about-supersession-threatв файле userlock.el.

Кажется простым добавить dвыбор для звонка ediff-current-file. Я не проверял это, хотя (правки, отмеченные ;;-комментариями).

(defun ask-user-about-supersession-threat (fn)
  "Ask a user who is about to modify an obsolete buffer what to do.
This function has two choices: it can return, in which case the modification
of the buffer will proceed, or it can (signal 'file-supersession (file)),
in which case the proposed buffer modification will not be made.

You can rewrite this to use any criterion you like to choose which one to do.
The buffer in question is current when this function is called."
  (discard-input)
  (save-window-excursion
    (let ((prompt
       (format "%s changed on disk; \
really edit the buffer? (y, n, r, d or C-h) " ;;- changed
           (file-name-nondirectory fn)))
      (choices '(?y ?n ?r ?d ?? ?\C-h))       ;;- changed
      answer)
      (while (null answer)
    (setq answer (read-char-choice prompt choices))
    (cond ((memq answer '(?? ?\C-h))
           (ask-user-about-supersession-help)
           (setq answer nil))
          ((eq answer ?r)
           ;; Ask for confirmation if buffer modified
           (revert-buffer nil (not (buffer-modified-p)))
           (signal 'file-supersession
               (list "File reverted" fn)))
          ((eq answer ?d)                     ;;- added
           (ediff-current-file))              ;;- added
          ((eq answer ?n)
           (signal 'file-supersession
               (list "File changed on disk" fn)))))
      (message
       "File on disk now will become a backup file if you save these changes.")
      (setq buffer-backed-up nil))))
JeanPierre
источник
Кажется, хорошо работает на Emacs 46.1 на Ubuntu 16.04. Спасибо!
Стефан Гурихон