Haben Emacs bei "Puffer wirklich bearbeiten" die Ediff-Current-Datei automatisch ausgeführt?

11

Kontext

Wenn emacs erkennt, dass eine Datei außerhalb eines Bearbeitungspuffers geändert wurde.

Beobachteten

Emacs werden fragen:

Ein Dateiname wurde auf der Festplatte geändert. Puffer wirklich bearbeiten? (y, n, r oder Ch)

(Übrigens passiert es manchmal sogar, wenn es keine tatsächliche Änderung gibt, z. B. eine entfernte Datei auf einem Server mit verschobener Uhr, aber die Frage ist in allen Fällen interessant.)

Gewünscht

Emacs würde fragen:

Ein Dateiname wurde auf der Festplatte geändert. Puffer wirklich bearbeiten? (y, n, r, d oder Ch)

Durch Drücken von wird dder Unterschied zwischen den Versionen angezeigt, z. B. ediff-current-filewodurch die Unterschiede interaktiv ausgeführt werden können.

Zusätzliche Information

Dies ähnelt der Verwaltung von Debian-Paketen, wenn festgestellt wird, dass eine lokal angepasste Konfigurationsdatei von einer neueren Version ihres eigenen Pakets aktualisiert wird. Ein Beispiel finden Sie unter Eine neue Version der Konfigurationsdatei / etc / default / grub ist verfügbar, die derzeit installierte Version wurde jedoch lokal geändert - Unix & Linux Stack Exchange

Suchen Sie, bevor Sie fragen

Normalerweise finde ich den Weg zu Lösungen (z. B. emacsclient - Öffnen Sie in einem externen Skript eine Datei und führen Sie einen einfachen Ausdruck aus, unabhängig davon, ob Emacs bereits ausgeführt werden oder nicht - Emacs Stack Exchange ), aber nachdem ich danach gesucht habe, konnte ich keine bereits vorhandene Lösung finden.

Ich würde in Betracht ziehen, dies selbst anzupassen, bin aber nicht in der Lage, Emacs-Lisp- und Emacs-Interna zu beherrschen.

Lösungsskizze

  • Durch Drücken von C-g'Mx ediff-current-file' wird die Aufgabe auf Kosten einiger Tastenanschläge erledigt.
  • Das Ziel hier wäre, mit ediff-current-fileeinem Tastendruck an der obigen Eingabeaufforderung zu laufen .
Stéphane Gourichon
quelle
1
Verwandte Themen: Wie wird diff angezeigt, wenn emacs vorschlägt, diese Datei wiederherzustellen?
Gilles 'SO - hör auf böse zu sein'
@ Gilles danke. Ja, verwandt und anders. Bei Ihrem Link geht es um die Öffnungszeit der Datei. Hier geht es um das Speichern von Dateien.
Stéphane Gourichon

Antworten:

2

grepping für "wirklich den Puffer bearbeiten" in der Emacs-Quelle fand ich Funktion ask-user-about-supersession-threatin der Datei userlock.el.

Es scheint unkompliziert, eine dAuswahl für den Anruf hinzuzufügen ediff-current-file. Ich habe dies jedoch nicht ausführlich getestet (Änderungen mit ;;-Kommentaren markiert ).

(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
quelle
Scheint unter Emacs 46.1 unter Ubuntu 16.04 gut zu funktionieren. Vielen Dank!
Stéphane Gourichon