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

时间:2011-02-21 13:52:49

标签: emacs dot-emacs

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

我不确定你的功能是否真的是导致问题的原因。如果是这种情况,scottfrazer指出的let*的错误用法可能是原因。但你根本不需要let*(和switch-to-buffer),因为

  1. 使用Emacs内置的save-excursion
  2. 可以更好地完成您要做的事情
  3. 你实际上并没有切换缓冲区。
  4. 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)))