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*そのスコットフレイザーが指摘した間違った使い方が原因かもしれません。let*しかし、それ(およびswitch-to-buffer)はまったく必要ありません。

  1. あなたがやろうとしていることは、Emacsのビルトインでよりよく行われsave-excursion、そして
  2. 実際にバッファを切り替えることはありません。

OTOH、関数の下半分でsのlet代わりに使用する必要があります。そうしないと、変数を囲んでいる字句スコープから変更するためです。この場合、問題のもう1つの潜在的な原因である、実行中の関数から変数を踏み越えた可能性があります。setqsetqbufferdesktop-save-hook

letただし、別ので2番目のループを実行できるため、これらも必要ありません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 に答える