diff options
| -rw-r--r-- | README.md | 13 | ||||
| -rw-r--r-- | perspective.el | 45 |
2 files changed, 58 insertions, 0 deletions
@@ -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 |
