project-ibuffer

an Emacs package to filter buffers in ibuffer by project root
git clone https://git.trogloxene.org/project-ibuffer.git
Log | Files | Refs

commit 69eb1c2b5f47d474b583846589ea9b8bfa480409
parent 2a05c31001b2be7de7aab1531b8a108c38b78db2
Author: andsy10 <andsy1016@gmail.com>
Date:   Sun, 27 Sep 2026 21:35:09 +0800

Use default ibuffer predicates with prefix arg

Diffstat:
Mproject-ibuffer.el | 62++++++++++++++++++++++++++++++++------------------------------
1 file changed, 32 insertions(+), 30 deletions(-)

diff --git a/project-ibuffer.el b/project-ibuffer.el @@ -1,4 +1,4 @@ -;;; project-ibuffer.el --- IBuffer integration for project.el -*- lexical-binding: t; -*- +;;; project-ibuffer.el --- Ibuffer integration for project.el -*- lexical-binding: t; -*- ;;; Commentary: @@ -9,49 +9,51 @@ ;; ;; M-x project-ibuffer ;; -;; With a prefix argument, prompt for a project. Otherwise, use the -;; current project. +;; With a prefix argument, use the standard value of +;; `ibuffer-maybe-show-predicates' instead of the customized one. ;;; Code: (require 'project) +(require 'ibuf-ext) + +(define-ibuffer-filter project-files + "Limit current view to buffers belonging to a given project." + (:description "project root dir" + :reader (read-directory-name "Project root: " + (when-let* ((pr (project-current))) + (project-root pr)))) + (with-current-buffer buf + (and (or buffer-file-name + dired-directory + list-buffers-directory) + (let ((file-name (or buffer-file-name + dired-directory + list-buffers-directory))) + (file-in-directory-p file-name qualifier))))) -(with-eval-after-load 'ibuffer - (require 'ibuf-ext nil t) - (define-ibuffer-filter project-files - "Show Ibuffer with all buffers in the current project." - (:description "project root dir" - :reader (read-directory-name "Project root: " - (when-let* ((pr (project-current))) - (project-root pr)))) - (with-current-buffer buf - (and (or buffer-file-name - dired-directory - list-buffers-directory) - (let ((file-name (or buffer-file-name - dired-directory - list-buffers-directory))) - (file-in-directory-p file-name qualifier)))))) - -;;;###autoload (defun project-ibuffer-by-project (project-root) - "Open an IBuffer window showing all buffers in PROJECT-ROOT." - (require 'ibuf-ext nil t) + "Open an Ibuffer window showing all buffers in PROJECT-ROOT." (let ((project-name (file-name-nondirectory (directory-file-name project-root)))) (ibuffer nil (format "*%s Buffers*" project-name) (list (cons 'project-files project-root))))) ;;;###autoload -(defun project-ibuffer (prompt-for-project) - "Open an IBuffer window showing all buffers in the current project. +(defun project-ibuffer (default-pred) + "Open an Ibuffer window showing all buffers in the current project. -Let user choose another project when PROMPT-FOR-PROJECT is supplied." +Use the standard value of `ibuffer-maybe-show-predicates' when +DEFAULT-PRED is supplied." (interactive "P") - (let ((project-root (if prompt-for-project - (project-prompt-project-dir) - (project-root (project-current t))))) - (project-ibuffer-by-project project-root))) + (let ((project-root (project-root (project-current t)))) + (if (not default-pred) + (project-ibuffer-by-project project-root) + (let ((ibuffer-maybe-show-predicates + (ignore-errors + (eval (car (get 'ibuffer-maybe-show-predicates + 'standard-value)))))) + (project-ibuffer-by-project project-root))))) (provide 'project-ibuffer) ;;; project-ibuffer.el ends here