0

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

任何帮助,将不胜感激。

4

2 回答 2

1

我不确定您的功能是否真的是您的问题的原因。如果是这样的话,let*scottfrazer 指出的错误用法可能是原因。但是你甚至根本不需要那个let*(and switch-to-buffer),因为

  1. 您尝试做的最好是使用 Emacs 内置的save-excursion, 和
  2. 你实际上并没有切换缓冲区。

OTOH,您应该在函数的下半部分使用let而不是s,否则会从封闭的词法范围更改变量。在这种情况下,您很可能已经从正在执行的函数中踩过一个变量,这是您问题的另一个潜在原因。setqsetqbufferdesktop-save-hook

但是你也不需要那些lets ,因为你可以用另一个 s 来做第二个循环dolist。你可以去掉那些你不想循环的前 50 个缓冲区nthcdr

这是我的改进版本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)))))
于 2011-02-21T16:14:27.693 回答
0

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

(let* ((desktop-buffer (current-buffer)))
于 2011-02-21T15:08:12.340 回答