[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))
- [elpa] externals/dired-preview updated (9b4f92597a -> a74ed53d22), ELPA Syncer, 2024/12/08
- [elpa] externals/dired-preview 80549c7aba 2/6: Add dired-preview-buffer-name-indicator prefix to the name of buffers, ELPA Syncer, 2024/12/08
- [elpa] externals/dired-preview 14f7a4cab9 4/6: Change dired-preview-hexl-toggle binding to not clash with wdired, ELPA Syncer, 2024/12/08
- [elpa] externals/dired-preview a74ed53d22 6/6: Make sure to not kill more buffers than necessary, ELPA Syncer, 2024/12/08
- [elpa] externals/dired-preview b9f735b60b 1/6: Make Emacs 28 the minimum requirement, ELPA Syncer, 2024/12/08
- [elpa] externals/dired-preview 6ed2a68c64 5/6: Change the default value of dired-preview-kill-buffers-method, ELPA Syncer, 2024/12/08
- [elpa] externals/dired-preview 9e2cd8190a 3/6: Add dired-preview-kill-buffers-method on how to clean up preview buffers,
ELPA Syncer <=