commands - "Diff, save or kill" cuando se eliminan buffers en Emacs
emacs exit and save (2)
Querrá escribir un código para poner en las listas kill-buffer-hooks y write-file-functions . Conceptualmente, lo que quieres hacer es
- prueba si el buffer ha sido modificado
- mostrar su mensaje y obtener una respuesta, y hacer lo que se solicitó
- luego borre la bandera modificada para que el buffer de destrucción normal no vuelva y pregunte nuevamente.
Al intentar eliminar un búfer que contiene cambios en Emacs, se muestra el mensaje: "Buffer [buffer] modified; kill anyway? (Yes or no)".
En lugar de esto, me gustaría que Emacs me pregunte si quiero: 1. Ver una diferencia de lo que cambió, 2. Guardar el búfer, 3. Eliminar el búfer.
¿Cómo?
La respuesta está en usar consejos , ya que los ganchos normalmente se ejecutan cuando se eliminan los almacenamientos intermedios después del aviso "buffer modificado" que desea cambiar.
El siguiente consejo hace lo que quiere (creo). Un par de notas:
- Cuando ejecuta el diff, el buffer original se marca como no modificado, pero realmente tendrá que guardarlo.
- El otro buffer en el diff no se borra
(defadvice kill-buffer (around my-kill-buffer-check activate)
"Prompt when a buffer is about to be killed."
(let* ((buffer-file-name (buffer-file-name))
backup-file)
;; see ''backup-buffer
(if (and (buffer-modified-p)
buffer-file-name
(file-exists-p buffer-file-name)
(setq backup-file (car (find-backup-file-name buffer-file-name))))
(let ((answer (completing-read (format "Buffer modified %s, (d)iff, (s)ave, (k)ill? " (buffer-name))
''("d" "s" "k") nil t)))
(cond ((equal answer "d")
(set-buffer-modified-p nil)
(let ((orig-buffer (current-buffer))
(file-to-diff (if (file-newer-than-file-p buffer-file-name backup-file)
buffer-file-name
backup-file)))
(set-buffer (get-buffer-create (format "%s last-revision" (file-name-nondirectory file-to-diff))))
(buffer-disable-undo)
(insert-file-contents file-to-diff nil nil nil t)
(set-buffer-modified-p nil)
(setq buffer-read-only t)
(ediff-buffers (current-buffer) orig-buffer)))
((equal answer "k")
(set-buffer-modified-p nil)
ad-do-it)
(t
(save-buffer)
ad-do-it)))
ad-do-it)))