Su "davvero modificare il buffer", emacs esegue automaticamente ediff-current-file?


11

Contesto

Quando emacs rileva che un file è stato modificato al di fuori di un buffer di modifica.

osservato

emacs chiederà:

somefilename è stato modificato nel disco; davvero modificare il buffer? (y, n, r o Ch)

(Per inciso, a volte succede anche quando non ci sono cambiamenti effettivi, ad esempio file remoto su un server con orologio alla deriva, ma la domanda è interessante in tutti i casi.)

desiderato

emacs chiederebbe:

somefilename è stato modificato nel disco; davvero modificare il buffer? (y, n, r, d o Ch)

Premendo dsi mostrerebbe la differenza tra le versioni, ad esempio ediff-current-fileche consente di camminare interattivamente sulle differenze.

Informazioni aggiuntive

Sarebbe simile a quello che fa la gestione dei pacchetti Debian quando rileva che un file di configurazione personalizzato localmente viene aggiornato da una versione più recente del suo pacchetto proprietario. Per un esempio vedere Una nuova versione del file di configurazione / etc / default / grub è disponibile, ma la versione installata attualmente è stata modificata localmente - Unix & Linux Stack Exchange

Cerca prima di chiedere

Di solito trovo la mia strada verso soluzioni (ad esempio emacsclient - da uno script esterno, apri file ed eseguo una semplice espressione sia che emacs sia già in esecuzione - Emacs Stack Exchange ) ma dopo aver cercato su questo non sono riuscito a trovare alcuna soluzione preesistente.

Prenderei in considerazione la possibilità di adattarmi da solo, ma non sono abbastanza esperto negli interni di emacs-lisp ed emacs.

Schizzo di soluzione

  • Premendo C-gquindi 'Mx ediff-current-file` fa il lavoro, a scapito di alcuni tasti.
  • L'obiettivo qui sarebbe quello di eseguire ediff-current-filesu un tasto premuto al prompt di cui sopra.


@Gilles grazie. Sì, correlati e diversi. Il tuo link riguarda il tempo di apertura dei file. Qui si tratta del tempo di salvataggio dei file.
Stéphane Gourichon,

Risposte:


2

grepping per "davvero modificare il buffer" nella fonte emacs ho trovato la funzione ask-user-about-supersession-threatnel file userlock.el.

Sembra semplice aggiungere una dscelta per chiamare ediff-current-file. Non l'ho ancora ampiamente testato (modifiche contrassegnate con ;;-commenti).

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

Sembra funzionare bene su Emacs 46.1 su Ubuntu 16.04. Grazie!
Stéphane Gourichon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.