题
叫我跛脚,但我厌倦了我的潜意识 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
可避免保存缓冲区w / out文件。你需要找出你用来切换你关心的缓冲区的所有入口点(我还建议 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)
现在,关于主要问题。您可以尝试这样的事情(注意 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手册建议< a href =“http://www.gnu.org/software/emacs/manual/html_mono/elisp.html.gz#Advising-Functions”rel =“nofollow noreferrer”>建议不能用于密钥绑定 。我不太确定为什么会这样,但这就是手册建议FYI。