[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/dired-preview 4010cc9987 60/67: Implement garbage colle
From: |
ELPA Syncer |
Subject: |
[elpa] externals/dired-preview 4010cc9987 60/67: Implement garbage collection for buffer killing |
Date: |
Sat, 8 Jul 2023 15:57:55 -0400 (EDT) |
branch: externals/dired-preview
commit 4010cc99874aa5d19f2abe67717623cab3acb133
Author: Protesilaos Stavrou <info@protesilaos.com>
Commit: Protesilaos Stavrou <info@protesilaos.com>
Implement garbage collection for buffer killing
This way we avoid killing buffers too eagerly. The accumulated
buffers are still useful for bringing back up a preview shortly after
it has been removed from the preview window.
Thanks to Bruno Boal[1] for testing this with me. It was done in a
private channel and the information is shared with permission.
[1] <https://git.sr.ht/~bboal>
---
dired-preview.el | 47 ++++++++++++++++++++++++++++++++---------------
1 file changed, 32 insertions(+), 15 deletions(-)
diff --git a/dired-preview.el b/dired-preview.el
index 4ca4efd163..440eea484a 100644
--- a/dired-preview.el
+++ b/dired-preview.el
@@ -114,22 +114,39 @@ details."
"Return non-nil if WINDOW has `dired-preview-window' parameter."
(window-parameter window 'dired-preview-window))
-;; TODO 2023-07-05: We need a garbage collection function so that we
-;; do not accummulate too many buffers that exceed a given threshold.
+;; TODO 2023-07-07: This can become a user option, but let's keep it
+;; simple for now. We need to be sure this is always doing the right
+;; thing.
+(defvar dired-preview--buffers-threshold (* 1000 1024)
+ "Maximum cumulative buffer size of previews.
+When the accummulated preview buffers exceed this number and
+`dired-preview--kill-buffers' is called, it will kill buffers
+until it drops below this number.")
+
+(defun dired-preview--get-buffer-cummulative-size ()
+ "Return cummulative buffer size of `dired-preview--get-buffers'."
+ (let ((size 0))
+ (mapc
+ (lambda (buffer)
+ (setq size (+ (buffer-size buffer) size)))
+ (dired-preview--get-buffers))
+ size))
+
(defun dired-preview--kill-buffers ()
- "Kill preview buffers."
- (mapc
- (lambda (buffer)
- (let ((window (get-buffer-window buffer)))
- (cond
- ((and (dired-preview--window-parameter-p window)
- (current-buffer))
- (delete-window (get-buffer-window buffer)))
- ((dired-preview--window-parameter-p window)
- (ignore-errors
- (kill-buffer-if-not-modified buffer)
- (setq dired-preview--buffers (delq buffer
dired-preview--buffers)))))))
- (dired-preview--get-buffers)))
+ "Kill preview buffers up to `dired-preview--buffers-threshold'."
+ (let ((buffers (nreverse (dired-preview--get-buffers))))
+ (catch 'stop
+ (mapc
+ (lambda (buffer)
+ (if (and (>= (dired-preview--get-buffer-cummulative-size)
+ dired-preview--buffers-threshold))
+ (when (and (buffer-local-value 'delayed-mode-hooks buffer)
+ (not (eq buffer (current-buffer))))
+ (ignore-errors (kill-buffer-if-not-modified buffer))
+ (setq buffers (delq buffer buffers)))
+ (throw 'stop t)))
+ buffers))
+ (setq dired-preview--buffers (delq nil (nreverse buffers)))))
(defun dired-preview--get-windows ()
"Return windows that show previews."
- [elpa] externals/dired-preview 959299b18a 39/67: Add FIXME for dired-preview-return-window-size, (continued)
- [elpa] externals/dired-preview 959299b18a 39/67: Add FIXME for dired-preview-return-window-size, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 0dceaef04d 35/67: Use a function to return the display-buffer action, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview d8ba2d0884 11/67: Simplify value of dired-preview-ignored-extensions-regexp, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 6bdcc34f68 52/67: Use "below" instead of "bottom" for direction, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 22f44d083c 10/67: Clear previewed buffers after they are killed, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 91fc74d122 49/67: Stop using a side window for previews, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 24bf5bce79 50/67: Add FIXME for dired-preview-display-action-alist-dwim, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 53ebf5d655 51/67: Change how window size is determined (fix 24bf5bc), ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 0fa9aab1df 53/67: Add FIXME for how/why window parameters are unset, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview ea643a8912 54/67: Simplify dired-preview-trigger, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 4010cc9987 60/67: Implement garbage collection for buffer killing,
ELPA Syncer <=
- [elpa] externals/dired-preview 4b89363599 61/67: Delete preview windows, including the selected one, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 98815455cb 65/67: Simplify README.md, pointing to the manual instead (per 33a27a6), ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 6673bb1cd3 67/67: Update to version 0.1.0, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 4da6ee04bf 12/67: Make the display-buffer action alist customisable, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview f2a720ca8f 13/67: Update dired-preview-set-up-preview-window doc to reference user option, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 04bfb749c7 22/67: Move two forms closer to where they are used, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 4857868357 33/67: Harden dired-preview--close-previews-outside-dired conditionality, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 38fab3d419 38/67: Use 'file-regular-p' instead of 'file-exists-p', ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview f6bb0e3271 44/67: Add TODO to only accummulate a fixed size of buffers, ELPA Syncer, 2023/07/08
- [elpa] externals/dired-preview 00ab2337ca 46/67: Stop adding 'no-other-window' parameter, ELPA Syncer, 2023/07/08