branch: externals/bufferlo
commit ef456aacb329645f0ae67fb9d4e88dfa90063f83
Author: shipmints <shipmi...@gmail.com>
Commit: shipmints <shipmi...@gmail.com>

    Enhance bufferlo-kill-modified-buffers-policy and bufferlo--kill-buffer
    
    - Rename 'ignore-modified to 'retain-modified
    - Add 'retain-modified-kill-without-file-name
---
 bufferlo.el | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/bufferlo.el b/bufferlo.el
index 6e8a87b8dc..68fb144f48 100644
--- a/bufferlo.el
+++ b/bufferlo.el
@@ -135,13 +135,18 @@ are active in a bufferlo-controlled frame or tab.
 nil means default Emacs behavior which may prompt. This may have
 side effects when killing frames.
 
-\\='ignore-modified means bufferlo will leave modified buffers as
+\\='retain-modified means bufferlo will leave modified buffers as
 is.
 
+\\='retain-modified-kill-without-file-name will leave modified buffers
+as is BUT will kill buffers that have no file name; this includes shell,
+hidden, and special buffers that can not normally be saved.
+
 \\='kill-modified instructs bufferlo to kill modified buffers
 without remorse including those with running processes such as
 `shell-mode' buffers."
-  :type '(radio (const :tag "Do not kill modified buffers" ignore-modified)
+  :type '(radio (const :tag "Retain modified buffers" retain-modified)
+                (const :tag "Retain modified buffers BUT kill buffers without 
file names" retain-modified-kill-without-file-name)
                 (const :tag "Kill modified buffers without prompting" 
kill-modified)
                 (const :tag "Default Emacs behavior (will prompt)" nil)))
 
@@ -1311,17 +1316,25 @@ If INVERT is non-nil, return the non-exclusive buffers 
instead."
                   (lambda (b) (not (memq b other-bufs))))
                 this-bufs)))
 
+(defun bufferlo--kill-buffer-forced (buffer)
+  (let ((kill-buffer-query-functions nil))
+    (with-current-buffer buffer
+      (set-buffer-modified-p nil)
+      (kill-buffer))))
+
 (defun bufferlo--kill-buffer (buffer)
   "Kill BUFFER respecting `bufferlo-kill-modified-buffers-policy'."
   (pcase bufferlo-kill-modified-buffers-policy
-    ('ignore-modified
+    ('retain-modified
      (unless (buffer-modified-p buffer)
        (kill-buffer buffer)))
+    ('retain-modified-kill-without-file-name
+     (if (not (buffer-file-name buffer))
+         (bufferlo--kill-buffer-forced buffer)
+       (unless (buffer-modified-p buffer)
+         (kill-buffer buffer))))
     ('kill-modified
-     (let ((kill-buffer-query-functions nil))
-       (with-current-buffer buffer
-       (set-buffer-modified-p nil)
-       (kill-buffer))))
+     (bufferlo--kill-buffer-forced buffer))
     (_ (kill-buffer buffer))))
 
 (defun bufferlo-kill-buffers (&optional killall frame tabnum internal-too)

Reply via email to