En "realmente edite el búfer", ¿emacs ha ejecutado ediff-current-file automáticamente?

11

Contexto

Cuando emacs detecta que se modificó un archivo fuera de un búfer de edición.

Observado

emacs preguntará:

algún nombre de archivo cambiado en el disco; ¿Realmente edita el búfer? (y, n, ro Ch)

(Por cierto, a veces sucede incluso cuando no hay un cambio real, por ejemplo, un archivo remoto en un servidor con reloj derivado, pero la pregunta es interesante en todos los casos).

Deseado

emacs preguntaría:

algún nombre de archivo cambiado en el disco; ¿Realmente edita el búfer? (y, n, r, do Ch)

Presionar dmostraría la diferencia entre versiones, por ejemplo, lo ediff-current-fileque permite recorrer las diferencias de forma interactiva.

Información Adicional

Eso sería similar a lo que hace la administración de paquetes de Debian cuando detecta que un archivo de configuración personalizado localmente se actualiza por una versión más nueva de su paquete propietario. Para ver un ejemplo, consulte Una nueva versión del archivo de configuración / etc / default / grub está disponible, pero la versión instalada actualmente se ha modificado localmente - Unix & Linux Stack Exchange

Busca antes de preguntar

Por lo general, encuentro mi camino hacia las soluciones (por ejemplo, emacsclient: desde un script externo, abra un archivo y ejecute alguna expresión simple si emacs ya se está ejecutando o no, Emacs Stack Exchange ), pero después de buscar en esto no pude encontrar ninguna solución preexistente.

Consideraría ajustar esto yo mismo, pero no soy lo suficientemente competente en emacs-lisp y emacs internos.

Bosquejo de la solución

  • Presionando C-gentonces 'Mx ediff-current-file` hace el trabajo, a costa de algunas pulsaciones de teclas.
  • El objetivo aquí sería ejecutar ediff-current-fileuna pulsación de tecla en el indicador anterior.
Stéphane Gourichon
fuente
1
Relacionado: ¿Cómo ver diff cuando emacs sugiere recuperar este archivo?
Gilles 'SO- deja de ser malvado'
@Gilles gracias. Sí, relacionado y diferente. Su enlace es sobre el tiempo de apertura de archivos. Aquí se trata del tiempo para guardar archivos.
Stéphane Gourichon

Respuestas:

2

grepping para "realmente editar el búfer" en la fuente emacs encontré la función ask-user-about-supersession-threaten el archivo userlock.el.

Parece sencillo agregar una dopción para llamar ediff-current-file. Sin embargo, no lo he probado exhaustivamente (ediciones marcadas con ;;-comentarios).

(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
fuente
Parece funcionar bien en emacs 46.1 en Ubuntu 16.04. ¡Gracias!
Stéphane Gourichon