2009-09-12 10 views
8

Chiamami zoppo, ma sono stanco del mio subconscio nervoso C-x C-s. Sto cambiando i buffer abbastanza spesso e penso che mi piacerebbe salvare un certo buffer non appena passo a un altro. Non ho ancora avuto il tempo di imparare le basi di Emacs-Lisp.Emacs salva automaticamente sul buffer di commutazione

Eventuali suggerimenti su come eseguire questa operazione o soluzioni migliori?

(In una nota correlata, ho trovato un autosave workaround che può salvare il buffer corrente, non appena si è inattivo per un determinato periodo di tempo.)

risposta

16

Per espandere il Seth s' answer, farei questo:

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

Il controllo per buffer-file-name evita di salvare i buffer dei file w/out. Hai bisogno di capire tutti i punti di ingresso che usi per cambiare i buffer che ti interessano (ti consiglio anche di other-window).

+0

+1 da me ... ho dimenticato il buffer-file -name – seth

+1

Perfetto! Grazie :) 6 anni dopo e ancora un'ottima risposta –

6

Sono un po 'nuova per Emacs Lisp me stesso, ma questo lavora nel mio test:

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

(ad-activate 'switch-to-buffer) 

'un po' fastidioso, però, perché si chiama dopo ogni tampone (come graffiare). Quindi, considera questa risposta un suggerimento.

Quando si desidera disattivarlo, è necessario chiamare:

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

Un paio di idee.

Per prima cosa, se ti trovi a invocare un comando come save con una frequenza sufficientemente alta, potresti prendere in considerazione un binding di tasti più breve per il comando. Per esempio, mi sono ritrovato ad avere lo stesso "twitch", quindi ora uso f2 invece di C-x C-s per salvare le modifiche.

La funzione che associo a f2 salva incondizionatamente ogni buffer non salvato. Potresti trovarlo utile:

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

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

Ora, sul problema principale. Si potrebbe provare qualcosa di simile (si noti che force-save-all si chiama):

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

Naturalmente, si potrebbe anche legare la funzionalità di buffer passaggio a un altro tasto, come un tasto funzione, in modo che sia un'operazione di una macchina da stampa.

Ho pensato che l'@seth avesse una grande idea sull'uso dei consigli, ma ho notato che il manuale ELisp suggerisce che advice not be used for key bindings. Non sono del tutto sicuro del motivo per cui questo è il caso, ma questo è ciò che il manuale suggerisce FYI.

+0

Interessante. Non ho visto quella parte sulle associazioni di tasti quando stavo leggendo il manuale. Grazie. – seth

+0

L'unico problema con questa soluzione è quando ad es. inizia a usare 'ido-switch-buffer', devi anche rintracciare le modifiche nella tua funzione. –

+0

È vero, suppongo che tu possa riassociare il simbolo del passaggio al buffer con questa nuova funzione (salvando l'originale in un altro simbolo, ad es. Orig-save-to-buffer) –

Problemi correlati