]> code.delx.au - dotemacs/commitdiff
improved buffer killing
authorJames Bunton <jamesbunton@delx.net.au>
Wed, 20 Jul 2016 14:14:12 +0000 (00:14 +1000)
committerJames Bunton <jamesbunton@delx.net.au>
Wed, 20 Jul 2016 14:21:08 +0000 (00:21 +1000)
lisp/my-defuns.el
lisp/my-gui.el

index a4097383bafe57718cf39819a32425408ad55f1e..d58e9b0d6110078ad1b232a9988b1172a2ad4c27 100644 (file)
@@ -7,26 +7,39 @@
                   (line-beginning-position (+ 1 arg)))
   (message "%d line%s copied" arg (if (= 1 arg) "" "s")))
 
-(add-to-list 'delete-frame-functions #'kill-buffers-if-deleting-last-frame)
+(defun frame-initial-frame-p (frame)
+  (equal "initial_terminal" (terminal-name frame)))
 
 (defun frame-list-ignoring-initial-frame ()
-  (filtered-frame-list
-   (lambda (frame)
-     (not (equal "initial_terminal" (terminal-name frame))))))
+  (filtered-frame-list (lambda (frame) (not (frame-initial-frame-p frame)))))
+
+(defun kill-buffer-safely (buffer)
+  "Kill the buffer if it is not special or modified"
+  (message "Considering %s" (buffer-name buffer))
+  (if (and
+       (not (string-match "^ " (buffer-name buffer)))
+       (not (equal "*Messages*" (buffer-name buffer)))
+       (or
+        (not (buffer-modified-p buffer))
+        (null (buffer-file-name buffer))))
+      (kill-buffer buffer)))
 
 (defun kill-buffers-if-deleting-last-frame (frame)
+  "Kill all buffers when closing the last frame"
   (when (equal (list frame) (frame-list-ignoring-initial-frame))
     (dolist (buffer (buffer-list))
-      (kill-buffer-if-not-modified buffer) buffer)))
+      (kill-buffer-safely buffer))))
 
 (defun kill-buffers-not-in-frame ()
-  "Kill buffers which are not loaded into some frame"
+  "Kill buffers which are not loaded into some frame"
   (interactive)
   (let ((kill-count 0))
     (dolist (buffer (buffer-list))
-      (if (not (get-buffer-window buffer t))
-          (if (kill-buffer-if-not-modified buffer)
-              (cl-incf kill-count))))
+      (let* ((window (get-buffer-window buffer t))
+             (frame (window-frame window)))
+        (if (or (null frame) (not (window-live-p window)) (frame-initial-frame-p frame))
+            (if (kill-buffer-safely buffer)
+                (cl-incf kill-count)))))
     (message "Killed %d buffers" kill-count)))
 
 (defun open-line-above ()
index 4f005ffe523423f283eb63bd45e77f881f5b0228..c15dd20c3fe035cf8e4480cfb96bcaddb8c52328 100644 (file)
@@ -20,6 +20,8 @@
 (setq uniquify-strip-common-suffix t)
 (setq uniquify-buffer-name-style 'post-forward)
 
+(add-to-list 'delete-frame-functions #'kill-buffers-if-deleting-last-frame)
+
 (setq frame-title-format
       '((:eval (if (buffer-file-name)
                    (concat