.emacs.desktop文件被自定义函数销毁

.emacs.desktop文件被自定义函数销毁,emacs,dot-emacs,Emacs,Dot Emacs,我使用Emacs桌面模块在会话之间保存打开的缓冲区。但是,我发现这会积累比我想要的更多的缓冲区,所以我编写了一个小函数,在保存到桌面文件之前立即清理缓冲区列表。这正如预期的那样工作,但出于奇怪的原因,.emacs.desktop偶尔会被置乱,即它在开始时包含另一个缓冲区的一部分,然后是预期的内容,然后是另一个缓冲区的结果。我一点也不知道为什么会这样。以下是我的.emacs文件的摘录: (defun kill-old-buffers () "Kill buffers from end of b

我使用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)))

任何帮助都将不胜感激。

它可能无法解决您所有的问题,但对于初学者,您需要在
let*
语句中围绕变量使用另一组参数

(let* ((desktop-buffer (current-buffer)))

我不确定你的功能是否真的是问题的原因。如果是这样的话,scottfrazer指出的
let*
的错误用法可能就是原因。但是你甚至根本不需要
让*
(和
切换到buffer
),因为

  • 您要做的是更好地使用Emacs内置的
    保存游览
    ,以及
  • 实际上,您从未切换过缓冲区
  • OTOH,您应该在函数的下半部分使用
    let
    而不是
    setq
    s,因为
    setq
    将改变封闭词法范围中的变量。在这种情况下,您很可能在执行
    桌面保存钩子的函数中踩踏了
    缓冲区
    变量,这是问题的另一个潜在原因

    但是您也不需要这些
    let
    s,因为您可以使用另一个
    dolist
    执行第二个循环。您可以去掉前50个不想循环使用的缓冲区
    nthcdr

    这是我改进的
    杀死旧缓冲区的版本:

    (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)))))
    

    谢谢。正如您可能已经猜到的,Lisp不是我的主要编程语言;-)我已经用你的版本替换了我的版本,但只有时间会告诉我,如果这结束了我偶尔的问题。如果在一两周内再次发生这种情况,我会报告。在使用您的解决方案三周后,我只需做一个简短的更新:它现在似乎可以正常工作,但我仍然不明白最初的问题是什么原因造成的。再次非常感谢。