称我Call脚,但我已经厌倦了我的潜意识C-x C-s
紧张的抽搐。我经常切换缓冲区,我想我想在切换到另一个缓冲区后立即保存一个缓冲区。我还没有时间学习Emacs-Lisp基础知识。
关于如何执行此操作的任何提示,或者更好的解决方案?
(在相关说明中,我发现autosave workaround可以在您闲置给定时间后立即保存当前缓冲区。)
(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
)。
我对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)
一些想法。
首先,如果您发现自己以足够高的频率调用诸如保存之类的命令,则可以考虑使用较短的键绑定。例如,我还发现自己具有相同的“抽搐”,因此现在我使用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)
现在,讨论主要问题。您可以尝试这样的操作(注意已调用[C0]):
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)
对于使用建议有一个很好的主意,但是我注意到ELisp手册建议使用@seth。我不太确定为什么会这样,但这就是手册所建议的。