我使用Emacs桌面模块在会话之间保存我的打开缓冲区。但是我发现这会累积比我想要的更多的缓冲区,所以我写了一个小函数来立即清理缓冲区列表,然后再保存到桌面文件中。这按预期工作,但由于奇怪的原因,.emacs.desktop偶尔会被扰乱,即它在开始时包含另一个缓冲区的一部分,然后是预期内容,然后是另一个缓冲区的结果。我没有丝毫想法,为什么会这样。以下是我的.emacs文件的摘录:
(defun kill-old-buffers ()
"Kill buffers from end of buffer list (not used recently) until no more than 50 buffers are left. Remove temporary buffers first"
(interactive)
(let* (desktop-buffer (current-buffer))
(dolist (buffer (buffer-list))
(if (or (string-match "^\*" (buffer-name buffer)) (string-match "\.hpp$" (buffer-name buffer)))
(kill-buffer buffer)
)
)
(setq all-buffers (reverse (buffer-list)))
(while (> (safe-length all-buffers) 50)
(setq buffer (pop all-buffers))
(if (not (string-equal (buffer-name buffer) (buffer-name (current-buffer))))
(kill-buffer buffer)
)
)
(switch-to-buffer desktop-buffer)
))
;; Kill old rarely-used buffers before saving
(add-hook 'desktop-save-hook
'(lambda () (kill-old-buffers)))
任何帮助都将不胜感激。
答案 0 :(得分:1)
我不确定你的功能是否真的是导致问题的原因。如果是这种情况,scottfrazer指出的let*
的错误用法可能是原因。但你根本不需要let*
(和switch-to-buffer
),因为
save-excursion
和 OTOH,您应该在函数的下半部分使用let
而不是setq
,因为setq
将从封闭的词法范围中更改变量。在这种情况下,你很可能已经从正在执行buffer
的函数中踩过desktop-save-hook
变量,这是导致问题的另一个可能原因。
但是你不需要那些let
,因为你可以用另一个dolist
进行第二次循环。你可以摆脱那些你不希望用nthcdr
循环的前50个缓冲区。
以下是kill-old-buffers
的改进版本:
(defun kill-old-buffers ()
"Kill buffers from end of buffer list (not used recently) until
no more than 50 buffers are left. Remove temporary buffers first."
(interactive)
(save-excursion
(dolist (buffer (buffer-list))
(if (or (string-match "^\*" (buffer-name buffer))
(string-match "\.hpp$" (buffer-name buffer)))
(kill-buffer buffer)))
(dolist (buffer (reverse (nthcdr 50 (buffer-list))))
(unless (eq buffer (current-buffer))
(kill-buffer buffer)))))
答案 1 :(得分:0)
它可能无法解决您的所有问题,但对于初学者而言,您需要在let*
声明中围绕变量另外设置一些parens
(let* ((desktop-buffer (current-buffer)))