叫我瘸腿,但我厌倦了我潜意识的C-x C-s
神经抽搐。我经常切换缓冲区,我想我想在切换到另一个缓冲区后立即保存某个缓冲区。我还没有时间学习 Emacs-Lisp 基础知识。
关于如何做到这一点或更好的解决方案的任何提示?
(在相关说明中,我发现了一种自动保存解决方法,可以在您空闲一段时间后立即保存当前缓冲区。)
(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)
不过这有点烦人,因为它是在每个缓冲区之后调用的(比如从头开始)。因此,请将此答案视为提示。
当你想禁用它时,你需要调用:
(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now)
(ad-activate 'switch-to-buffer)
几个想法。
首先,如果您发现自己以足够高的频率调用像 save 这样的命令,您可能会考虑为该命令使用更短的键绑定。例如,我也发现自己有同样的“抽搐”,所以现在我使用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 手册建议建议不要用于键绑定。我不太清楚为什么会这样,但这就是手册建议的仅供参考。