[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/bufferlo 93154c1bc1 05/37: Add interactive auxiliary fu
|
From: |
ELPA Syncer |
|
Subject: |
[elpa] externals/bufferlo 93154c1bc1 05/37: Add interactive auxiliary functions |
|
Date: |
Sun, 5 Nov 2023 09:57:31 -0500 (EST) |
branch: externals/bufferlo
commit 93154c1bc157e07afbfab43161bc109960bca4f0
Author: Florian Rommel <mail@florommel.de>
Commit: Florian Rommel <mail@florommel.de>
Add interactive auxiliary functions
---
bufferlo.el | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 106 insertions(+), 11 deletions(-)
diff --git a/bufferlo.el b/bufferlo.el
index eefad71ab1..0d291f542f 100644
--- a/bufferlo.el
+++ b/bufferlo.el
@@ -115,6 +115,13 @@ This gets overridden by `bufferlo-include-buffer-filters.'"
:group 'bufferlo
:type '(repeat string))
+(defcustom bufferlo-kill-buffers-exclude-filters
+ '(" .*" "\\*Messages\\*" "\\*scratch\\*")
+ "Buffers that should not be killed by `bufferlo-kill-buffers'.
+This is a list of regular expressions that match buffer names."
+ :group 'bufferlo
+ :type '(repeat string))
+
(defvar bufferlo--desktop-advice-active nil)
;;;###autoload
@@ -171,15 +178,18 @@ This gets overridden by
`bufferlo-include-buffer-filters.'"
(when (eq (frame-parameter frame 'buffer-predicate)
#'bufferlo-local-buffer-p)
(set-frame-parameter frame 'buffer-predicate nil)))
+(defun bufferlo--merge-regexp-list (regexp-list)
+ "Merge a list of regular expressions."
+ (mapconcat (lambda (x)
+ (concat "\\(?:^" x "$\\)"))
+ regexp-list "\\|"))
+
(defun bufferlo--include-exclude-buffers (frame)
"Include and exclude buffers into the buffer list of FRAME."
- (let* ((merge-regexp-list (lambda (li)
- (mapconcat (lambda (x) (concat "\\(?:" x "\\)"))
- li "\\|")))
- (include (funcall merge-regexp-list
- (append '("a^") bufferlo-include-buffer-filters)))
- (exclude (funcall merge-regexp-list
- (append '("a^") bufferlo-exclude-buffer-filters)))
+ (let* ((include (bufferlo--merge-regexp-list
+ (append '("a^") bufferlo-include-buffer-filters)))
+ (exclude (bufferlo--merge-regexp-list
+ (append '("a^") bufferlo-exclude-buffer-filters)))
(buffers (frame-parameter frame 'buffer-list))
(buffers (seq-filter (lambda (b)
(not (string-match-p exclude (buffer-name b))))
@@ -195,6 +205,14 @@ This gets overridden by `bufferlo-include-buffer-filters.'"
(ignore ignore)
(bufferlo--include-exclude-buffers nil))
+(defun bufferlo--get-tab-buffers (tab)
+ "Extract buffers from the given tab structure"
+ (or
+ (cdr (assq 'wc-bl tab))
+ ;; fallback to bufferlo-buffer-list, managed by bufferlo--window-state-*
+ (mapcar 'get-buffer
+ (car (cdr (assq 'bufferlo-buffer-list (assq 'ws tab)))))))
+
(defun bufferlo-buffer-list (&optional frame tabnum)
"Return a list of all live buffers associated with the current frame and tab.
A non-nil value of FRAME selects a specific frame instead of the current one.
@@ -205,10 +223,7 @@ a tab index in the given frame."
(let ((tab (nth tabnum (frame-parameter frame 'tabs))))
(if (eq 'current-tab (car tab))
(frame-parameter frame 'buffer-list)
- (or
- (cdr (assq 'wc-bl tab))
- (mapcar 'get-buffer
- (car (cdr (assq #'bufferlo-buffer-list (assq 'ws
tab))))))))
+ (bufferlo--get-tab-buffers tab)))
(frame-parameter frame 'buffer-list))))
(seq-filter #'buffer-live-p list)))
@@ -268,6 +283,86 @@ If FRAME is nil, use the current frame."
(delete (get-buffer buffer) (frame-parameter nil 'buffer-list))
(bury-buffer buffer-or-name)))
+(defun bufferlo--get-captured-buffers (&optional exclude-frame)
+ "Get all buffers that are in a local list of at least one frame or tab.
+If EXCLUDE-FRAME is a frame, exclude the local buffer list of this frame."
+ (let* ((flatten (lambda (list)
+ (apply #'append (append list '(nil)))))
+ (get-inactive-tabs-buffers (lambda (f)
+ (funcall flatten
+ (mapcar
+ #'bufferlo--get-tab-buffers
+ (frame-parameter f 'tabs)))))
+ (get-frames-buffers (lambda ()
+ (funcall flatten
+ (mapcar
+ (lambda (f)
+ (unless (eq f exclude-frame)
+ (frame-parameter f 'buffer-list)))
+ (frame-list))))))
+ (seq-uniq
+ (funcall flatten
+ (list
+ (funcall flatten (mapcar get-inactive-tabs-buffers
(frame-list)))
+ (funcall get-frames-buffers))))))
+
+(defun bufferlo--get-orphan-buffers ()
+ "Get all buffers that are not in any local list of a frame or tab."
+ (seq-filter (lambda (b)
+ (not (memq b (bufferlo--get-captured-buffers))))
+ (buffer-list)))
+
+(defun bufferlo--get-exclusive-buffers (&optional frame)
+ "Get all buffers that are exclusive for this frame and tab.
+If frame is nil, use the current frame."
+ (let ((other-bufs (bufferlo--get-captured-buffers (or frame
(selected-frame))))
+ (this-bufs (frame-parameter frame 'buffer-list)))
+ (seq-filter (lambda (b)
+ (not (memq b other-bufs)))
+ this-bufs)))
+
+(defun bufferlo-kill-buffers (&optional killall frame)
+ "Kill the buffers of the frame/tab-local buffer list.
+By default, this will only kill buffers that are exclusive to the frame/tab.
+If KILLALL (prefix argument) is given then buffers that are also present in the
+local lists of other frames and tabs are killed too.
+Buffers matching `bufferlo-kill-buffers-exclude-filters' are never killed.
+If FRAME is nil, use the current frame."
+ (interactive "P")
+ (let ((exclude (bufferlo--merge-regexp-list
+ (append '("a^") bufferlo-kill-buffers-exclude-filters)))
+ (kill-list (if killall
+ (frame-parameter frame 'buffer-list)
+ (bufferlo--get-exclusive-buffers frame))))
+ (dolist (buffer kill-list)
+ (unless (string-match-p exclude (buffer-name buffer))
+ (kill-buffer buffer)))))
+
+(defun bufferlo-kill-orphan-buffers ()
+ "Kill all buffers that are not in any local list of a frame or tab.
+Buffers matching `bufferlo-kill-buffers-exclude-filters' are never killed."
+ (interactive)
+ (let ((exclude (bufferlo--merge-regexp-list
+ (append '("a^") bufferlo-kill-buffers-exclude-filters))))
+ (dolist (buffer (bufferlo--get-orphan-buffers))
+ (unless (string-match-p exclude (buffer-name buffer))
+ (kill-buffer buffer)))))
+
+(defun bufferlo-delete-frame-kill-buffers (&optional frame)
+ "Delete a frame and kill all the local buffers according to
+`bufferlo-kill-buffers'.
+If FRAME is nil, kill the current frame."
+ (interactive)
+ (bufferlo-kill-buffers frame)
+ (delete-frame))
+
+(defun bufferlo-tab-close-kill-buffers (&optional killall)
+ "Close the current tab and kill all the local buffers according to
+ `bufferlo-kill-buffers'."
+ (interactive "P")
+ (bufferlo-kill-buffers killall)
+ (tab-bar-close-tab))
+
(defun bufferlo-switch-to-buffer (buffer &optional norecord force-same-window)
"Display the local buffer BUFFER in the selected window.
This is the frame/tab-local equivilant to `switch-to-buffer'.
- [elpa] externals/bufferlo 83586af819 07/37: Fix empty buffer list, (continued)
- [elpa] externals/bufferlo 83586af819 07/37: Fix empty buffer list, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo d74f2c1ece 21/37: Add bufferlo-remove-non-exclusive-buffers, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 2fc945a81b 10/37: Update README, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 79eba76029 06/37: Include buried buffers, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo ecae697601 18/37: Fix local ibuffer buffer name, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 2bcbde24be 29/37: Update documentation, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 6d27fbd704 37/37: Add COPYING to elpaignore, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 1c16e19694 25/37: Fix frame predicate to include hidden buffers, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 795ef9e937 13/37: Fix README, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 1660b52975 24/37: Cleanup documentation, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 93154c1bc1 05/37: Add interactive auxiliary functions,
ELPA Syncer <=
- [elpa] externals/bufferlo ef806d7155 19/37: Fix bug when switching to a tab with empty local buffer list, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo a777218a3c 34/37: Stylistic improvements, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 521339ae25 20/37: Fix window-state-put, ELPA Syncer, 2023/11/05
- [elpa] externals/bufferlo 43e03ee793 33/37: Add .elpaignore, ELPA Syncer, 2023/11/05