Sur "vraiment éditer le tampon", emacs a-t-il exécuté ediff-current-file automatiquement?


11

Le contexte

Quand emacs détecte qu'un fichier a été modifié en dehors d'un tampon d'édition.

Observé

emacs demandera:

un nom de fichier a changé sur le disque; vraiment éditer le tampon? (y, n, r ou Ch)

(Par ailleurs, cela arrive parfois même en l'absence de changement réel, par exemple un fichier distant sur un serveur avec une horloge dérivée, mais la question est intéressante dans tous les cas.)

Souhaité

emacs demanderait:

un nom de fichier a changé sur le disque; vraiment éditer le tampon? (y, n, r, d ou Ch)

En appuyant sur d, vous verrez la différence entre les versions, par exemple, ediff-current-filece qui permet de parcourir les différences de manière interactive.

Information additionnelle

Ce serait similaire à ce que fait la gestion des paquets Debian lorsqu'elle détecte qu'un fichier de configuration localement personnalisé est mis à jour par une version plus récente de son paquet propriétaire. Pour un exemple, voir Une nouvelle version du fichier de configuration / etc / default / grub est disponible, mais la version installée actuellement a été modifiée localement - Unix & Linux Stack Exchange

Recherchez avant de demander

Je trouve généralement mon chemin vers des solutions (par exemple, emacsclient - À partir d'un script externe, ouvrez un fichier et exécutez une expression simple, que emacs soit déjà en cours d'exécution ou non - Emacs Stack Exchange ) mais après avoir recherché cela, je n'ai trouvé aucune solution préexistante.

J'envisagerais de régler cela moi-même, mais je ne suis pas assez compétent dans les internes emacs-lisp et emacs.

Esquisse de solution

  • Appuyer C-gensuite sur «Mx ediff-current-file» fait l'affaire, au prix de quelques frappes.
  • Le but ici serait d'exécuter ediff-current-filesur une touche à l'invite ci-dessus.


Merci @Gilles. Oui, liés et différents. Votre lien concerne l'heure d'ouverture des fichiers. Ici, il s'agit de gagner du temps.
Stéphane Gourichon

Réponses:


2

en cherchant "vraiment éditer le tampon" dans la source emacs j'ai trouvé la fonction ask-user-about-supersession-threatdans le fichier userlock.el.

Il semble simple d'ajouter un dchoix pour appeler ediff-current-file. Cependant, je n'ai pas testé cela de manière approfondie (modifications marquées de ;;-commentaires).

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

Semble bien fonctionner sur emacs 46.1 sur Ubuntu 16.04. Merci!
Stéphane Gourichon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.