project-ibuffer.el (2123B)
1 ;;; project-ibuffer.el --- Ibuffer integration for project.el -*- lexical-binding: t; -*- 2 3 ;;; Commentary: 4 5 ;; This package provides an ibuffer filter that allows viewing buffers 6 ;; belonging to a specific project.el project. 7 8 ;; Usage: 9 ;; 10 ;; M-x project-ibuffer 11 ;; 12 ;; With a prefix argument, use the standard value of 13 ;; `ibuffer-maybe-show-predicates' instead of the customized one. 14 15 ;;; Code: 16 17 (require 'project) 18 (require 'ibuf-ext) 19 20 (define-ibuffer-filter project-files 21 "Limit current view to buffers belonging to a given project." 22 (:description "project root dir" 23 :reader (read-directory-name "Project root: " 24 (when-let* ((pr (project-current))) 25 (project-root pr)))) 26 (with-current-buffer buf 27 (and (or buffer-file-name 28 dired-directory 29 list-buffers-directory) 30 (let ((file-name (or buffer-file-name 31 dired-directory 32 list-buffers-directory))) 33 (file-in-directory-p file-name qualifier))))) 34 35 (defun project-ibuffer-by-project (project-root) 36 "Open an Ibuffer window showing all buffers in PROJECT-ROOT." 37 (let ((project-name (file-name-nondirectory 38 (directory-file-name project-root)))) 39 (ibuffer nil (format "*%s Buffers*" project-name) 40 (list (cons 'project-files project-root))))) 41 42 ;;;###autoload 43 (defun project-ibuffer (default-pred) 44 "Open an Ibuffer window showing all buffers in the current project. 45 46 Use the standard value of `ibuffer-maybe-show-predicates' when 47 DEFAULT-PRED is supplied." 48 (interactive "P") 49 (let ((project-root (project-root (project-current t)))) 50 (if (not default-pred) 51 (project-ibuffer-by-project project-root) 52 (let ((ibuffer-maybe-show-predicates 53 (ignore-errors 54 (eval (car (get 'ibuffer-maybe-show-predicates 55 'standard-value)))))) 56 (project-ibuffer-by-project project-root))))) 57 58 (provide 'project-ibuffer) 59 ;;; project-ibuffer.el ends here