Emacs自动保存在交换机缓冲区上

时间:2009-09-12 00:21:38

标签: emacs elisp autosave

叫我跛脚,但我厌倦了我的潜意识C-x C-s紧张的抽搐。我经常切换缓冲区,我想我一旦切换到另一个就想保存一个缓冲区。我还没来得及学习Emacs-Lisp的基础知识。

有关如何执行此操作或更好解决方案的任何提示?

(在相关的说明中,我发现autosave workaround可以在您闲置一段时间后立即保存当前缓冲区。)

3 个答案:

答案 0 :(得分: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可以避免保存缓冲区w / out文件。您需要找出用于切换您关注的缓冲区的所有入口点(我还建议other-window)。

答案 1 :(得分:6)

我自己是emacs lisp的新手,但这在我的测试中有用:

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

(ad-activate 'switch-to-buffer)

虽然因为它是在每个缓冲区(如 scratch )之后调用的,但它有点烦人。所以,请考虑这个答案。

如果要禁用它,则需要致电:

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

答案 2 :(得分: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。