]> code.delx.au - dotemacs/blobdiff - lisp/my-gui.el
more text utility functions with key bindings
[dotemacs] / lisp / my-gui.el
index 7376d1bf246d91bdf68d2dc12ad6522db4c5d85f..3ee090028a0aad4f86cd0695f067a5e0d05b9cf7 100644 (file)
 (add-to-list 'post-command-hook #'my/terminal-update-title)
 
 (defalias 'yes-or-no-p 'y-or-n-p)
+
+
+(defun my/frame-initial-frame-p (frame)
+  "Returns true if the given frame is the magic 'initial frame' that always exists in GUI emacs sessions"
+  (equal "initial_terminal" (terminal-name frame)))
+
+(defun my/frame-list-ignoring-initial-frame ()
+  "Returns all frames except the magic 'initial frame' that always exists in GUI emacs sessions"
+  (filtered-frame-list (lambda (frame) (not (my/frame-initial-frame-p frame)))))
+
+(defun my/generate-frame-title ()
+  "Returns a string like 'filename (dirname) - Emacs'"
+  (if (buffer-file-name)
+      (concat
+       (file-name-nondirectory (buffer-file-name))
+       (if (buffer-modified-p)
+           " +")
+       " ("
+       (abbreviate-file-name (substring (file-name-directory (buffer-file-name)) 0 -1))
+       ") - Emacs"
+       )
+    (concat
+     (buffer-name)
+     (if (buffer-modified-p)
+         " +")
+     " - Emacs")))
+
+(defun my/kill-buffer-safely (buffer)
+  "Kill the buffer if it is not special or modified"
+  (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 my/kill-buffers-if-deleting-last-frame (frame)
+  "Kill all buffers when closing the last frame"
+  (when (equal (list frame) (my/frame-list-ignoring-initial-frame))
+    (dolist (buffer (buffer-list))
+      (my/kill-buffer-safely buffer))))
+
+(defun my/kill-buffers-not-in-frame ()
+  "Kill buffers which are not loaded into some frame"
+  (interactive)
+  (let ((kill-count 0))
+    (dolist (buffer (buffer-list))
+      (let* ((window (get-buffer-window buffer t))
+             (frame (window-frame window)))
+        (if (or (null frame) (not (window-live-p window)) (my/frame-initial-frame-p frame))
+            (if (my/kill-buffer-safely buffer)
+                (cl-incf kill-count)))))
+    (message "Killed %d buffers" kill-count)))
+
+(defun my/terminal-update-title ()
+  "If using a terminal frame then sends the escape codes to update the title."
+  (if (terminal-parameter (frame-terminal) 'terminal-initted)
+      (send-string-to-terminal (concat "\033]0;" (my/generate-frame-title) "\007"))))