2010-03-01 10 views
9

Me gustaría que Emacs me pregunte si quiero guardar un búfer modificado, cuando ese búfer no está asociado con un archivo. Para abrir un nuevo buffer (no visitar un archivo) Tengo la siguiente función en mi archivo .emacs:Emacs - No se puede obtener buffer-offer-save trabajando

;; Creates a new empty buffer 
(defun new-empty-buffer() 
    "Opens a new empty buffer." 
    (interactive) 
    (let ((buf (generate-new-buffer "untitled"))) 
    (switch-to-buffer buf) 
    (funcall (and default-major-mode)) 
    (setq buffer-offer-save t))) 

pensé ajuste "buffer-oferta-salvar" a algo que no sería nula hecho el truco. Pero cada vez que mato el buffer con "kill-this-buffer", se mata instantáneamente sin preguntar nada.

Esto sucede en GNU Emacs 23.1.1

¿Alguna idea?

Gracias, W

+0

asociar el búfer a un archivo, en 'new-empty-buffer' resuelve el problema? – Cheeso

Respuesta

2

Editado para añadir uso de buffers-offer-save. Nota: la variable buffer-offer-save is only used upon exiting Emacs.

Puede comenzar con este código y personalizarlo a lo que quiere:

(add-to-list 'kill-buffer-query-functions 'ask-me-first) 
(defun ask-me-first() 
    "prompt when killing a buffer" 
    (if (or buffer-offer-save 
      (eq this-command 'kill-this-buffer) 
      (and (buffer-modified-p) (not (buffer-file-name)))) 
     (y-or-n-p (format "Do you want to kill %s without saving? " (buffer-name))) 
    t)) 

Tras reflexionar sobre ello, que es un poco de mano dura porque te le solicita todos tampones que pone los muertos, y a menudo hay muchos búferes temporales que usa Emacs. Si solo desea que se le pregunte cuando intente matar de forma interactiva un búfer (que no esté asociado a un archivo).

Puede utilizar este consejo que sólo se le pide cuando se está tratando de forma interactiva para matar a un búfer:

(defadvice kill-buffer (around kill-buffer-ask-first activate) 
    "if called interactively, prompt before killing" 
    (if (and (or buffer-offer-save (interactive-p)) 
      (buffer-modified-p) 
      (not (buffer-file-name))) 
     (let ((answ (completing-read 
        (format "Buffer '%s' modified and not associated with a file, what do you want to do? (k)ill (s)ave (a)bort? " (buffer-name)) 
        '("k" "s" "a") 
        nil 
        t))) 
     (when (cond ((string-match answ "k") 
        ;; kill 
        t) 
        ((string-match answ "s") 
        ;; write then kill 
        (call-interactively 'write-file) 
        t) 
        (nil)) 
      ad-do-it) 

     t) 
    ;; not prompting, just do it 
    ad-do-it)) 
+0

asociar el búfer a un archivo, en 'new-empty-buffer' resolver el problema? – Cheeso

+0

@ Cheeso Bueno, hacer eso en 'new-empty-buffer' pondría la solicitud en el lado equivocado, como cuando crea un nuevo buffer. Dicho esto, podría modificar 'new-empty-buffer' para establecer un indicador que el consejo/función podría desactivar. Supongo que me gustó una solución sin recurrir al uso de 'new-empty-buffer'. –

+0

gotcha, gracias. – Cheeso

1

Modificación 'new-empty-buffer parece que funcione como era mi intención con defadvice de Trey.

 
;; Creates a new empty buffer 
(defun new-empty-buffer() 
"Opens a new empty buffer." 
(interactive) 
(let ((buf (generate-new-buffer "untitled"))) 
    (switch-to-buffer buf) 
    (funcall (and default-major-mode)) 
    (put 'buffer-offer-save 'permanent-local t) 
    (setq buffer-offer-save t))) 

Esto hace buffer-offer-save local permanente en nuestro nuevo buffer, por lo que no conseguirá matado con el resto de las variables locales al cambiar los modos principales.

1

buffer-offer-save preguntar al salir de Emacs pero no al cerrar manualmente un búfer, no tiene sentido, entonces ¿por qué no "ampliar" sus responsabilidades?

(defadvice kill-buffer (around kill-buffer-ask activate) 
    "If `buffer-offer-save' is non-nil and a buffer is modified, 
prompt before closing." 
    (if (and buffer-offer-save (buffer-modified-p)) 
     (when (yes-or-no-p "The document isn't saved. Quit? ") 
     ad-do-it) 
    ad-do-it)) 

No aparecerá si se ha creado recientemente el buffer untitled. No se le preguntará si usa kill-buffer de Elisp. No solicitará los búferes del sistema Emacs como *Messages*. Pero le preguntará si creó un búfer vacío y escribió algo en él.

Véase también my answer on creating an empty buffer.

Cuestiones relacionadas