Credo che l'approccio più ovvio sarebbe una funzione che uccide il contenuto del buffer corrente e quindi chiama insert-file
per leggere il contenuto corrente dal file.
Se le modifiche apportate al file includevano modifiche alla codifica dei caratteri, potrebbero esserci dei problemi? Non l'ho provato.
Ecco il mio tentativo corrente. È un po 'IMO peloso, ma funziona bene.
;; Allow buffer reverts to be undone
(defun my-revert-buffer (&optional ignore-auto noconfirm preserve-modes)
"Revert buffer from file in an undo-able manner."
(interactive)
(when (buffer-file-name)
;; Based upon `delphi-save-state':
;; Ensure that any buffer modifications do not have any side
;; effects beyond the actual content changes.
(let ((buffer-read-only nil)
(inhibit-read-only t)
(before-change-functions nil)
(after-change-functions nil))
(unwind-protect
(progn
;; Prevent triggering `ask-user-about-supersession-threat'
(set-visited-file-modtime)
;; Kill buffer contents and insert from associated file.
(widen)
(kill-region (point-min) (point-max))
(insert-file-contents (buffer-file-name))
;; Mark buffer as unmodified.
(set-buffer-modified-p nil))))))
(defadvice ask-user-about-supersession-threat
(around my-supersession-revert-buffer)
"Use my-revert-buffer in place of revert-buffer."
(let ((real-revert-buffer (symbol-function 'revert-buffer)))
(fset 'revert-buffer 'my-revert-buffer)
;; Note that `ask-user-about-supersession-threat' calls
;; (signal 'file-supersession ...), so we need to handle
;; the error in order to restore revert-buffer.
(unwind-protect
ad-do-it
(fset 'revert-buffer real-revert-buffer))))
(ad-activate 'ask-user-about-supersession-threat)
Fastidiosamente, ho appena notato tutte le informazioni rilevanti per la ricerca nelle revert-buffer
documenti, quindi non c'è probabilmente un molto modo più semplice per fare questo.
Se il valore di revert-buffer-function
non è pari a zero, è chiamata a fare tutto il lavoro per questo comando. In caso contrario, i ganci before-revert-hook
e after-revert-hook
vengono eseguiti all'inizio e alla fine e se revert-buffer-insert-file-contents-function
è non nullo, viene chiamato invece di rileggere il contenuto del file visitato.
Penso che questo sia un ottimo approccio. Ho intenzione di provare a modificarlo da solo. Grazie! – Sarah
Prego. Ho trovato le soluzioni ad alcuni problemi con quel codice e ho aggiornato la risposta: ora imposta il buffer aggiornato come non modificato, e ho trovato che '(set-visited-file-modtime)' era il modo per impedire che si problema. Ciò significa che se annulli il ripristino, non ti farà più la domanda se tenti di modificare nuovamente il file, che è decisamente più in linea con la funzionalità originale. Se trovi una soluzione migliore, ti preghiamo di inviare una nuova risposta qui. – phils