Pregunta

Llámame cojo, pero estoy cansado de mi nerviosismo subconsciente C-x C-s . Estoy cambiando los búferes con la frecuencia suficiente y creo que me gustaría guardar un cierto búfer tan pronto como me cambie a otro. Todavía no he tenido tiempo de aprender los conceptos básicos de Emacs-Lisp.

¿Alguna pista sobre cómo hacer esto, o mejores soluciones?

(En una nota relacionada, encontré una solución de autoguardado que puede guardar el búfer actual como tan pronto como esté inactivo durante un período de tiempo determinado).

¿Fue útil?

Solución

Para ampliar en Seth 's respuesta , haría 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)))

La comprobación de buffer-file-name evita guardar buffers sin archivos. Debe averiguar todos los puntos de entrada que utiliza para cambiar los búferes que le interesan (también recomendaría other-window ).

Otros consejos

Soy algo nuevo en emacs, pero esto funciona en mis pruebas:

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

(ad-activate 'switch-to-buffer)

Sin embargo, es un poco molesto porque se llama después de CADA búfer (como scratch ). Entonces, considere esta respuesta como una pista.

Cuando desee deshabilitarlo, deberá llamar:

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

Un par de ideas.

Primero, si se encuentra invocando un comando como guardar con una frecuencia suficientemente alta, podría considerar una combinación de teclas más corta para el comando. Por ejemplo, también me encontré teniendo la misma "contracción". así que ahora uso f2 en lugar de C-x C-s para guardar las ediciones.

La función que yo ato a f2 guarda cada búfer sin guardar incondicionalmente. Puede resultarle útil:

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

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

Ahora, al tema principal. Podría intentar algo como esto (observe que se llama a force-save-all ):

(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 puede vincular la funcionalidad del búfer de conmutación a otra tecla, como una tecla de función, para que sea una operación de una sola pulsación.

Pensé que @seth tenía una gran idea sobre el uso de consejos, pero noté que el manual de ELisp sugiere que < a href = "http://www.gnu.org/software/emacs/manual/html_mono/elisp.html.gz#Advising-Functions" rel = "nofollow noreferrer"> el consejo no se debe utilizar para las combinaciones de teclas . No estoy muy seguro de por qué este es el caso, pero eso es lo que el manual sugiere para su información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top