2009-09-12 165 views
8

給我打電話跛腳,但我厭倦了我的潛意識C-x C-s緊張抽搐。我經常切換緩衝區,我想我會在切換到另一個時立即保存某個緩衝區。我還沒有時間學習Emacs-Lisp基礎知識。Emacs自動保存在切換緩衝區

任何提示如何做到這一點,或更好的解決方案?

(與此相關的,我發現了一個autosave workaround可以,只要你有空閒的給定時間內保存當前的緩衝區。)

回答

16

要擴大Sethanswer,我應該這樣做:

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

buffer-file-name支票避免保存緩衝區瓦特/輸出文件。你需要弄清楚你用來切換你所關心的緩衝區的所有入口點(我也建議other-window)。

+0

+1從我那裏...忘了關於緩衝區文件-name – seth 2009-09-12 21:15:48

+1

完美!謝謝:) 6年後,仍然是一個很好的答案 – 2016-03-02 11:50:42

6

我有點新的Emacs Lisp自己,但此在我的測試工作:

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

(ad-activate 'switch-to-buffer) 

這是一種惱人的,但因爲它的每一個緩衝後調用(如劃傷)。所以,考慮這個答案是一個提示。

當你想關閉它,你需要撥打:

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

一對夫婦的想法。首先,如果你發現自己調用了一個頻率足夠高的保存命令,你可能會考慮使用一個較短的鍵綁定命令。例如,我也發現自己有相同的「抽搐」,所以現在我使用f2而不是C-x C-s來保存編輯。

我綁定到f2的函數會無條件地保存每個未保存的緩衝區。您可能會覺得它很有用:

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

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

現在,就主要問題。你可以嘗試這樣的事情(注意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) 

當然,你也可以在開關緩衝功能綁定到另一個關鍵,就像一個功能鍵,所以它是一個一個按下操作。

我認爲@seth關於使用建議有一個好主意,但我注意到ELisp手冊建議advice not be used for key bindings。我不太清楚爲什麼會出現這種情況,但這是手冊中提供的FYI的說明。

+0

有趣。當我閱讀手冊時沒有看到關於鍵盤綁定的那部分內容。謝謝。 – seth 2009-09-12 05:02:23

+0

這個解決方案的唯一問題是當你例如開始使用'ido-switch-buffer',你必須跟蹤你的函數的變化。 – 2009-09-15 10:08:56

+0

這是真的,我想你可以將切換到緩衝區符號重新綁定到這個新函數(將原始文件保存在另一個符號中,例如原始保存到緩衝區) – 2009-09-15 21:11:04