Я не уверен, что ваша функция действительно является причиной вашей проблемы. В таком случае причиной может быть неправильное использование let*
, на которое указал скотфразер. Но вам даже не нужно это let*
(и switch-to-buffer
) вообще, потому что
- то, что вы пытаетесь сделать, лучше сделать с помощью встроенных в Emacs
save-excursion
и
- вы на самом деле не переключаете буфер никогда.
OTOH, вы должны были использовать let
вместо setq
s в нижней половине вашей функции, потому что setq
в противном случае изменит переменную из окружающего лексического контекста. В этом случае вы вполне могли бы растоптать переменную buffer
из функции, которая выполняет desktop-save-hook
, что является еще одной потенциальной причиной вашей проблемы.
Но эти let
вам также не нужны, потому что вы можете сделать второй цикл с другим 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)))))