emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/dired-preview 9e2cd8190a 3/6: Add dired-preview-kill-bu


From: ELPA Syncer
Subject: [elpa] externals/dired-preview 9e2cd8190a 3/6: Add dired-preview-kill-buffers-method on how to clean up preview buffers
Date: Sun, 8 Dec 2024 03:57:54 -0500 (EST)

branch: externals/dired-preview
commit 9e2cd8190a3f271b950d6f1a88235db5425c172c
Author: Protesilaos Stavrou <info@protesilaos.com>
Commit: Protesilaos Stavrou <info@protesilaos.com>

    Add dired-preview-kill-buffers-method on how to clean up preview buffers
    
    The idea to kill buffers up to a certain number is from artelse. We
    discussed this in issue 20: 
<https://github.com/protesilaos/dired-preview/issues/20>.
---
 README.org       |   7 ++++
 dired-preview.el | 114 ++++++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 86 insertions(+), 35 deletions(-)

diff --git a/README.org b/README.org
index 3b2baf9a6e..20d72fb051 100644
--- a/README.org
+++ b/README.org
@@ -101,6 +101,13 @@ Preview buffers have a prefix to their name to make them 
stand out.
 This is controlled by the user option ~dired-preview-buffer-name-indicator~.
 [ This is part of {{{development-version}}}. ]
 
+#+vindex: dired-preview-kill-buffers-method
+While using Dired, preview buffers are killed according to the user
+option ~dired-preview-kill-buffers-method~. The default method is to
+kill buffers that exceed a combined size. An alternative is to kill
+buffers that exceed a certain number. Else to not kill any buffers.
+Buffers are always killed upon exiting Dired.
+
 [ In the near future, we may find ways to quickly preview any file
   type without affecting the performance of Emacs. ]
 
diff --git a/dired-preview.el b/dired-preview.el
index 752a0902ea..831e141721 100644
--- a/dired-preview.el
+++ b/dired-preview.el
@@ -103,6 +103,31 @@ user option."
   :group 'dired-preview
   :type 'natnum)
 
+(defcustom dired-preview-kill-buffers-method (cons 'combined-size (* 1000 
1024))
+  "Determine whether to periodically kill preview buffers while in Dired.
+When the value is nil, do not kill any preview buffer.
+
+When the value is a cons cell of the form (SYMBOL . NATURAL-NUMBER),
+check if symbol is one of the following to derive the meaning of its
+NATURAL-NUMBER.
+
+- `buffer-number' means to kill the number of preview buffers that
+  exceed the NATURAL-NUMBER.
+
+- `combined-size' means to kill buffers until their combined size does
+  not exceed the NATURAL-NUMBER.
+
+Whatever the SYMBOL, buffers are killed from oldest to newest.
+
+Buffers are always killed when exiting Dired."
+  :type '(choice
+          (cons (choice (const :tag "Maximum number of buffers" buffer-number)
+                        (const :tag "Maximum cumulative buffer size" 
combined-size))
+                natnum)
+          (const :tag "Do not kill any preview buffers" nil))
+  :package-version '(dired-preview . "0.4.0")
+  :group 'dired-preview)
+
 (define-obsolete-variable-alias
   'dired-preview-display-action-alist-function
   'dired-preview-display-action-alist
@@ -161,37 +186,53 @@ implementation details."
   "Return buffers that show previews."
   (seq-filter #'buffer-live-p dired-preview--buffers))
 
-;; 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 accumulated 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-cumulative-size ()
-  "Return cumulative buffer size of `dired-preview--get-buffers'."
+(defun dired-preview--get-buffer-cumulative-size (buffers)
+  "Return cumulative size of BUFFERS."
   (let ((size 0))
-    (mapc
-     (lambda (buffer)
-       (setq size (+ (buffer-size buffer) size)))
-     (dired-preview--get-buffers))
+    (dolist (buffer buffers)
+      (setq size (+ (buffer-size buffer) size)))
     size))
 
-(defun dired-preview--kill-buffers ()
-  "Kill preview buffers up to `dired-preview--buffers-threshold'."
+(defun dired-preview--kill-buffers-by-size (buffers max-combined-size)
+  "Kill BUFFERS to not exceed MAX-COMBINED-SIZE."
+  (dolist (buffer buffers)
+    (when (and (>= (dired-preview--get-buffer-cumulative-size buffers) 
max-combined-size)
+               (not (eq buffer (current-buffer))))
+      (ignore-errors (kill-buffer-if-not-modified buffer))
+      (setq buffers (delq buffer buffers))))
+  (setq dired-preview--buffers (delq nil (nreverse buffers))))
+
+(defun dired-preview--kill-buffers-by-length (buffers max-length)
+  "Kill BUFFERS up to MAX-LENGTH."
+  (let ((length (length buffers)))
+    (dolist (buffer buffers)
+      (when (> length max-length)
+        (ignore-errors (kill-buffer-if-not-modified buffer))
+        (setq length (1- length))
+        (setq buffers (delq buffer buffers)))))
+  (setq dired-preview--buffers (delq nil (nreverse buffers))))
+
+(defun dired-preview--kill-buffers-unconditionally (buffers)
+  "Kill all BUFFERS."
+  (dolist (buffer buffers)
+    (ignore-errors (kill-buffer-if-not-modified buffer))
+    (setq buffers (delq buffer buffers)))
+  (setq dired-preview--buffers (delq nil (nreverse buffers))))
+
+(defun dired-preview--kill-buffers (&optional kill-all)
+  "Implement `dired-preview-kill-buffers-method'.
+With optional KILL-ALL, kill all buffers regardless of the
+aforementioned user option."
   (let ((buffers (nreverse (dired-preview--get-buffers))))
-    (catch 'stop
-      (mapc
-       (lambda (buffer)
-         (when (and (>= (dired-preview--get-buffer-cumulative-size) 
dired-preview--buffers-threshold)
-                    (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)))))
+    (cond
+     (kill-all
+      (dired-preview--kill-buffers-unconditionally buffers))
+     (dired-preview-kill-buffers-method
+      (pcase-let ((`(,method . ,number) dired-preview-kill-buffers-method))
+        (pcase method
+          ('combined-size (dired-preview--kill-buffers-by-size buffers number))
+          ('buffer-number (dired-preview--kill-buffers-by-length buffers 
number))
+          (_ (error "The `%s' in `dired-preview-kill-buffers-method' is 
unknown" method))))))))
 
 (defun dired-preview--kill-large-buffers ()
   "Kill buffers previewing large files."
@@ -477,16 +518,19 @@ The size of the leading chunk is specified by
    (find-file-noselect file :nowarn)))
 
 (defun dired-preview--add-to-previews (file)
-  "Add FILE to `dired-preview--buffers', if not already in a buffer.
+  "Add FILE buffer to `dired-preview--buffers', if not already in a buffer.
+Before adding to the list of preview buffers, make sure to clean up the
+list to be of maximum `dired-preview-max-preview-buffers' length.
+
 Always return FILE buffer."
   (cl-letf (((symbol-function 'recentf-track-opened-file) #'ignore))
     (let ((buffer (find-buffer-visiting file)))
-      (if (buffer-live-p buffer)
-          buffer
-        (setq buffer (dired-preview--get-buffer (dired-preview--infer-type 
file))))
-      (with-current-buffer buffer
-        (add-hook 'post-command-hook #'dired-preview--clean-up-window nil 
:local))
-      (add-to-list 'dired-preview--buffers buffer)
+      (unless (buffer-live-p buffer)
+        (setq buffer (dired-preview--get-buffer (dired-preview--infer-type 
file)))
+        (with-current-buffer buffer
+          (add-hook 'post-command-hook #'dired-preview--clean-up-window nil 
:local))
+        (dired-preview--kill-buffers)
+        (add-to-list 'dired-preview--buffers buffer))
       buffer)))
 
 (defun dired-preview--get-preview-buffer (file)
@@ -552,7 +596,7 @@ aforementioned user option."
   "Kill preview buffers and delete their windows."
   (dired-preview--cancel-timer)
   (dired-preview--delete-windows)
-  (dired-preview--kill-buffers)
+  (dired-preview--kill-buffers :kill-all)
   (dired-preview--kill-large-buffers)
   (dired-preview--kill-placeholder-buffers))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]