2008-12-01 9 views
19

Al intentar eliminar un búfer que contiene cambios en Emacs, se muestra el mensaje: "Buffer [buffer] modified; kill anyway? (Yes or no)"."Diff, save or kill" al matar búferes en Emacs

En lugar de esto me gustaría tener Emacs me pregunta si quiero: 1. Ver un diff de lo que ha cambiado, 2. Guardar el buffer, 3. eliminar el buffer.

¿Cómo?

+1

Ver también: http://stackoverflow.com/questions/626492/emacs-highlight-buffer-modifications – jmn

Respuesta

21

La respuesta está en el uso de advice, porque los ganchos normalmente se ejecutan cuando se ejecutan los tampones matando después el "buffer modificado" del sistema que desee cambiar.

El siguiente consejo hace lo que quiere (creo). Un par de notas:

  1. Al ejecutar el diff, el buffer original se marca como no modificado, pero realmente tendrá que guardarlo.
  2. El otro búfer en el diff no se borran

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

+0

Pongo esto en mi archivo init. Ahora cuando hago M-x package-list-packages, Emacs sigue dándome el mensaje "Buffer modified' * http elpa.gnu.org:80'*, diff, save, kill? ". Supongo que hay una forma de modificar el código para evitar esto, pero soy nuevo en elisp. –

5

Querrá escribir algún código para poner en las listas kill-buffer-hooks y write-file-functions. Conceptualmente, lo que quiere hacer es

  1. prueba si la memoria intermedia se ha modificado
  2. mostrar su mensaje y obtener una respuesta , y hacer lo que se solicitó
  3. continuación, desactive el indicador modificado por lo que el comando kill -buffer no vuelve y pregunta de nuevo.
+1

El kill- buffer-hooks se ejecuta después del aviso que el usuario está tratando de cambiar/evitar. –

Cuestiones relacionadas