叫我跛脚,但我厌倦了我的潜意识C-x C-s
紧张的抽搐。我经常切换缓冲区,我想我一旦切换到另一个就想保存一个缓冲区。我还没来得及学习Emacs-Lisp的基础知识。
有关如何执行此操作或更好解决方案的任何提示?
(在相关的说明中,我发现autosave workaround可以在您闲置一段时间后立即保存当前缓冲区。)
答案 0 :(得分:16)
(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。