2009-09-12 19 views
8

Rufen Sie mich lahm, aber ich bin müde von meinem Unterbewusstsein C-x C-s nervös zucken. Ich wechsle Puffer oft genug und ich denke, ich möchte einen bestimmten Puffer speichern, sobald ich zu einem anderen auswechsle. Ich hatte noch nicht die Zeit Emacs-Lisp Grundlagen zu lernen.Emacs automatisch speichern auf Schalter Puffer

Irgendwelche Hinweise, wie man das macht, oder bessere Lösungen?

(Über einen entsprechenden Hinweis, fand ich eine autosave workaround, die sofort den aktuellen Puffer speichern können, wie Sie für eine bestimmte Zeit untätig sind.)

Antwort

16

erweitern auf Seth ‚s answer, würde ich dies tun:

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

Die Prüfung auf buffer-file-name vermeidet Puffer w/out-Dateien zu speichern. Sie müssen alle Einstiegspunkte herausfinden, die Sie für den Wechsel von Puffern verwenden, die Ihnen wichtig sind (ich würde auch other-window empfehlen).

+0

+1 von mir ... vergessen Puffer-Datei -name – seth

+1

Perfekt! Danke :) 6 Jahre später und immer noch eine gute Antwort –

6

ich irgendwie neu bin, mich zu Emacs Lisp, aber diese arbeitet in meinem Test:

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

(ad-activate 'switch-to-buffer) 

es ist allerdings Art ärgerlich, weil es nach jedem Puffer aufgerufen wird (wie kratzen). Betrachten Sie diese Antwort als Hinweis.

Wenn Sie es deaktivieren möchten, müssen Sie rufen:

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

Ein paar Ideen.

Erstens, wenn Sie einen Befehl wie save mit einer ausreichend hohen Frequenz aufrufen, könnten Sie eine kürzere Tastenanbindung für den Befehl betrachten. Zum Beispiel fand ich mich auch mit dem gleichen "Zucken", also verwende ich jetzt f2 anstelle von C-x C-s zum Speichern von Änderungen.

Die Funktion, die ich an f2 binde, speichert jeden nicht gespeicherten Puffer bedingungslos. Sie könnten es nützlich finden:

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

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

Jetzt, auf das Hauptproblem. Man könnte so etwas wie dies versucht (man beachte, dass force-save-all genannt wird):

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

Natürlich können Sie auch die Schalter Puffer Funktionalität auf einem anderen Schlüssel binden, wie eine Funktionstaste, so dass es sich um einen Pressvorgang ist.

Ich dachte, dass @seth hatte eine großartige Idee über die Verwendung von Beratung, aber ich bemerkte, dass die ELisp Handbuch schlägt vor, dass advice not be used for key bindings. Ich bin nicht ganz sicher, warum das der Fall ist, aber das ist, was das Handbuch FYI schlägt.

+0

Interessant. Habe diesen Teil über Tastaturbelegungen nicht gesehen, als ich das Handbuch gelesen habe. Vielen Dank. – seth

+0

Das einzige Problem mit dieser Lösung ist, wenn Sie z.B. Starten Sie 'ido-switch-buffer', müssen Sie auch die Änderungen in Ihrer Funktion aufspüren. –

+0

Das ist wahr, ich nehme an, Sie könnten das Schalter-zu-Puffer-Symbol an diese neue Funktion binden (das Original in einem anderen Symbol speichern, zB orig-save-to-buffer) –

Verwandte Themen