2009-09-12 163 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