Domanda

Chiamami zoppo, ma sono stanco del mio subconscio C-x C-s contrazione nervosa. Sto cambiando buffer abbastanza spesso e penso che vorrei salvare un certo buffer non appena passo a un altro. Non ho ancora avuto il tempo di imparare le basi di Emacs-Lisp.

Qualche suggerimento su come farlo o soluzioni migliori?

(In una nota correlata, ho trovato un soluzione alternativa autosave che può salvare il buffer corrente come non appena sei inattivo per un determinato periodo di tempo.)

È stato utile?

Soluzione

Per espandere su Seth 's rispondi , lo farei:

(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 buffer senza file. Devi capire tutti i punti di ingresso che usi per cambiare i buffer che ti interessano (ti consiglierei anche other-window ).

Altri suggerimenti

Sono un po 'nuovo di Emacs Lisp, ma questo funziona nei miei test:

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

(ad-activate 'switch-to-buffer)

È un po 'noioso perché è chiamato dopo OGNI buffer (come scratch ). Quindi, considera questa risposta un suggerimento.

Quando si desidera disabilitarlo, è necessario chiamare:

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

Un paio di idee.

Per prima cosa, se ti accorgi di invocare un comando come save con una frequenza sufficientemente alta, potresti prendere in considerazione un'associazione di tasti più breve per il comando. Ad esempio, mi sono anche trovato con la stessa "contrazione", " 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, passiamo al problema principale. Potresti provare qualcosa del genere (nota che si chiama 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)

Naturalmente, puoi anche associare la funzionalità switch buffer a un altro tasto, come un tasto funzione, in modo che si tratti di un'operazione con una pressione.

Ho pensato che @seth aveva una grande idea sull'uso dei consigli, ma ho notato che il manuale ELisp suggerisce che < a href = "http://www.gnu.org/software/emacs/manual/html_mono/elisp.html.gz#Advising-Functions" rel = "nofollow noreferrer"> avviso da non utilizzare per le associazioni di tasti . Non sono del tutto sicuro del perché questo sia il caso, ma è quello che suggerisce il manuale FYI.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top