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