Файл.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) вообще, потому что

  1. то, что вы пытаетесь сделать, лучше сделать с помощью встроенного в Emacs save-excursion, а также
  2. на самом деле вы никогда не переключаете буфер.

Ото, вы должны были использовать 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)))
Другие вопросы по тегам