Якщо "дійсно редагувати буфер", чи emacs автоматично запускає ediff-current-файл?


12

Контекст

Коли 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 Stack Exchange ), але після пошуку в цьому я не зміг знайти жодного попереднього рішення.

Я б подумав про те, щоб налаштувати це самостійно, але я недостатньо досвідчений у внутрішніх справах emacs-lisp та emacs.

Ескіз розчину

  • Якщо натиснути, C-gто "Mx ediff-current-file" виконує цю роботу ціною деяких натискань клавіш.
  • Ціллю тут було б запуститись ediff-current-fileодним натисканням клавіші у вказаному вище підказці.


@Gilles дякую Так, споріднені та різні. Ви посилаєтесь про час відкриття файлів. Тут мова йде про економію файлів часу.
Стефан Гурішон

Відповіді:


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))))

Здається, добре працює над emacs 46.1 на Ubuntu 16.04. Дякую!
Стефан Гурішон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.