Czy w programie „naprawdę edytuj bufor” emacs automatycznie uruchamia plik ediff-current-file?

12

Kontekst

Gdy emacs wykryje, że plik został zmieniony poza buforem edycji.

Zauważony

emacs zapyta:

nazwa pliku zmieniona na dysku; naprawdę edytować bufor? (y, n, r lub Ch)

(Nawiasem mówiąc, czasami zdarza się to nawet wtedy, gdy nie ma rzeczywistej zmiany, np. Plik zdalny na serwerze z dryfowanym zegarem, ale pytanie jest interesujące we wszystkich przypadkach.)

Chciałem

emacs zapyta:

nazwa pliku zmieniona na dysku; naprawdę edytować bufor? (y, n, r, d lub Ch)

Naciśnięcie dpokazałoby różnicę między wersjami, np. ediff-current-fileCo pozwala na interaktywne przejście różnic.

Dodatkowe informacje

Byłoby to podobne do tego, co robi zarządzanie pakietami Debiana, gdy wykryje, że lokalnie dostosowany plik konfiguracyjny jest aktualizowany przez nowszą wersję własnego pakietu. Na przykład patrz Nowa wersja pliku konfiguracyjnego / etc / default / grub jest dostępna, ale obecnie zainstalowana wersja została zmodyfikowana lokalnie - Unix i Linux Stack Exchange

Wyszukaj zanim zapytasz

Zwykle znajduję drogę do rozwiązań (np. Emacsclient - z zewnętrznego skryptu otwórz plik i uruchom proste wyrażenie, niezależnie od tego, czy emacs już działa, czy nie - Emacs Stack Exchange ), ale po wyszukaniu tego nie mogłem znaleźć żadnego wcześniej istniejącego rozwiązania.

Zastanowiłbym się nad tym, ale nie jestem wystarczająco biegły w emacs-lisp i emacs internals.

Szkic rozwiązania

  • Naciśnięcie C-gnastępnie „Mx ediff-current-file” wykonuje zadanie, kosztem niektórych naciśnięć klawiszy.
  • Celem byłoby tutaj ediff-current-filenaciśnięcie jednego klawisza w powyższym monicie.
Stéphane Gourichon
źródło
1
Powiązane: Jak wyświetlić diff, gdy emacs sugeruje odzyskanie tego pliku?
Gilles „SO- przestań być zły”
@Gilles dziękuję. Tak, powiązane i różne. Twój link dotyczy czasu otwarcia pliku. Tutaj chodzi o czas oszczędzania plików.
Stéphane Gourichon

Odpowiedzi:

2

grepping dla „naprawdę edytuj bufor” w źródle emacsa Znalazłem funkcję ask-user-about-supersession-threatw pliku userlock.el.

Wydaje się proste, aby dodać dopcję dzwonienia ediff-current-file. Jednak nie testowałem tego szeroko (zmiany oznaczone ;;-komentarzami).

(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))))
Jean Pierre
źródło
Wydaje się, że działa dobrze na emacs 46.1 na Ubuntu 16.04. Dzięki!
Stéphane Gourichon