Файл .emacs.desktop уничтожен пользовательской функцией - PullRequest
0 голосов
/ 21 февраля 2011

Я использую настольный модуль 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 ]

1 голос
/ 21 февраля 2011

Я не уверен, что ваша функция действительно является причиной вашей проблемы. В таком случае причиной может быть неправильное использование let*, на которое указал скотфразер. Но вам даже не нужно это let*switch-to-buffer) вообще, потому что

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

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)))))
0 голосов
/ 21 февраля 2011

Возможно, это не решит все ваши проблемы, но для начала вам понадобится еще один набор скобок вокруг переменной в вашем let* выражении

(let* ((desktop-buffer (current-buffer)))
...