2009-09-12 11 views
8

Llámame cojo, pero estoy cansado de mi subconsciente C-x C-s nervioso twitch. Estoy cambiando los búferes con la frecuencia suficiente y creo que me gustaría guardar un cierto búfer tan pronto como cambie a otro. Todavía no he tenido tiempo de aprender los fundamentos de Emacs-Lisp.Emacs guardado automático en el buffer del interruptor

¿Alguna sugerencia de cómo hacer esto o mejores soluciones?

(En una nota relacionada, he encontrado un autosave workaround que puede salvar el búfer en uso tan pronto como usted está inactivo durante un período determinado de tiempo.)

Respuesta

16

Para ampliar Seth 's answer, me gustaría hacer esto:

(defadvice switch-to-buffer (before save-buffer-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-window (before other-window-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-frame (before other-frame-now activate) 
    (when buffer-file-name (save-buffer))) 

El cheque por buffer-file-name Evita ahorro de tampones archivos w/out. Necesita averiguar todos los puntos de entrada que utiliza para cambiar los búferes que le interesan (también le aconsejaría other-window).

+0

+1 de mí ... se olvidó de buffer-file -name – seth

+1

¡Perfecto! Gracias :) 6 años después y sigue siendo una gran respuesta –

6

Soy una especie de nuevo a Emacs Lisp mí mismo, pero esta trabaja en mis pruebas:

(defadvice switch-to-buffer (before save-buffer-now) 
    (save-buffer)) 

(ad-activate 'switch-to-buffer) 

es un poco molesto, porque aunque se llama después de CADA memoria intermedia (como se rascan ). Por lo tanto, considere esta respuesta como una pista.

Cuando se desea desactivarlo, tendrá que llamar:

(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now) 
(ad-activate 'switch-to-buffer) 
2

Un par de ideas.

En primer lugar, si se encuentra invocando un comando como guardar con una frecuencia suficientemente alta, puede considerar un enlace de tecla más corto para el comando. Por ejemplo, también me encontré con el mismo "tic", así que ahora uso f2 en lugar de C-x C-s para guardar ediciones.

La función que vinculo a f2 guarda todos los almacenamientos intermedios no guardados incondicionalmente. Puede que le resulte útil:

(defun force-save-all() 
    "Unconditionally saves all unsaved buffers." 
    (interactive) 
    (save-some-buffers t)) 

(global-set-key [f2] 'force-save-all) 

Ahora, vamos al problema principal. Usted podría intentar algo como esto (observe que force-save-all se llama):

(defun my-switch-to-buffer (buffer) 
    (interactive (list (read-buffer "Switch to buffer: " (cadr buffer-name-history) nil))) 
    (force-save-all) 
    (switch-to-buffer buffer)) 

(global-set-key "\C-xb" 'my-switch-to-buffer) 

Por supuesto, también se puede obligar a la funcionalidad búfer alternativo a otra tecla, como una tecla de función, por lo que es una operación de una prensa.

Pensé que @seth tenía una gran idea sobre el uso de consejos, pero me di cuenta de que el manual ELisp sugiere que advice not be used for key bindings. No estoy seguro de por qué este es el caso, pero eso es lo que el manual sugiere para su información.

+0

Interesante. No vi esa parte sobre las combinaciones de teclas cuando estaba leyendo el manual. Gracias. – seth

+0

El único problema con esta solución es cuando, por ejemplo, comienza a usar 'ido-switch-buffer', también debes rastrear los cambios en tu función. –

+0

Eso es cierto, supongo que podría volver a vincular el símbolo de cambiar a buffer a esta nueva función (guardar el original en otro símbolo, por ejemplo, orig-save-to-buffer) –

Cuestiones relacionadas