aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiap Tran <txgvnn@gmail.com>2021-05-22 20:40:27 +0700
committerGiap Tran <txgvnn@gmail.com>2021-05-22 20:42:16 +0700
commit7f426e66a3d5eee9f9e03b1c7bff4d2d34ce65dd (patch)
treef7fa710e3d8cc50d186d8506214a4f0f87e5735f
parentdd2a380ac71edf1321a6462f14668baf99879e80 (diff)
Add persp-ibuffer-set-filter-groups
-rw-r--r--README.md13
-rw-r--r--perspective.el45
2 files changed, 58 insertions, 0 deletions
diff --git a/README.md b/README.md
index 8e96ecf..d0823f7 100644
--- a/README.md
+++ b/README.md
@@ -199,6 +199,19 @@ list of buffers in all perspectives.
buffers filtered by the current perspective. With a prefix argument, it shows a
list of buffers in all perspectives.
+If you want group buffers by persp-name in ibuffer buffer:
+
+`M-x persp-ibuffer-set-filter-groups`
+
+Or, make this the default:
+```
+(add-hook 'ibuffer-hook
+ (lambda ()
+ (persp-ibuffer-set-filter-groups)
+ (unless (eq ibuffer-sorting-mode 'alphabetic)
+ (ibuffer-do-sort-by-alphabetic))))
+```
+
**Helm**: Perspective ships with buffer-listing advice for Helm, so Helm's
buffer listing code should be automatically Perspective-aware when `persp-mode`
is enabled. (Older versions of Helm relied on the machinery of `ido-mode` for
diff --git a/perspective.el b/perspective.el
index 284f406..25994af 100644
--- a/perspective.el
+++ b/perspective.el
@@ -1633,6 +1633,51 @@ restored."
(defalias 'persp-state-restore 'persp-state-load)
+ ;;; --- ibuffer
+(with-eval-after-load 'ibuffer
+ (defvar ibuffer-filtering-alist nil)
+ (define-ibuffer-filter persp-name
+ "Toggle current view to buffers with persp name QUALIFIER."
+ (:description "persp-name"
+ :reader (read-regexp "Filter by persp name (regexp): "))
+ (ibuffer-awhen (persp-ibuffer-name buf)
+ (if (stringp qualifier)
+ (or (string-match-p qualifier (car it))
+ (string-match-p qualifier (cdr-safe it)))
+ (equal qualifier it)))))
+
+(defun persp-ibuffer-default-group-name (persp-name)
+ "Produce an ibuffer group name string for PERSP-NAME."
+ (format "%s" persp-name))
+
+(defun persp-ibuffer-name (buf)
+ "Return a PERSP-NAME of BUF."
+ (let ((persp-names (cl-loop for persp-name in (persp-all-names)
+ if (memq buf (persp-all-get persp-name nil))
+ collect persp-name)))
+ (list (car persp-names))))
+
+;;;###autoload
+(defun persp-ibuffer-generate-filter-groups ()
+ "Create a set of ibuffer filter groups based on the persp name of buffers."
+ (let ((persp-names (ibuffer-remove-duplicates
+ (delq nil (mapcar 'persp-ibuffer-name (buffer-list))))))
+ (mapcar (lambda (persp-name)
+ (cons (persp-ibuffer-default-group-name (car persp-name))
+ `((persp-name . ,persp-name))))
+ persp-names)))
+
+;;;###autoload
+(defun persp-ibuffer-set-filter-groups ()
+ "Set the current filter groups to filter by persp name."
+ (interactive)
+ (setq ibuffer-filter-groups (persp-ibuffer-generate-filter-groups))
+ (message "persp-ibuffer: groups set")
+ (let ((ibuf (get-buffer "*Ibuffer*")))
+ (when ibuf
+ (with-current-buffer ibuf
+ (pop-to-buffer ibuf)
+ (ibuffer-update nil t)))))
;;; --- done