project-ibuffer.el (2018B)
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, prompt for a project. Otherwise, use the 13 ;; current project. 14 15 ;;; Code: 16 17 (require 'project) 18 19 (with-eval-after-load 'ibuffer 20 (require 'ibuf-ext nil t) 21 (define-ibuffer-filter project-files 22 "Show Ibuffer with all buffers in the current project." 23 (:description "project root dir" 24 :reader (read-directory-name "Project root: " 25 (when-let* ((pr (project-current))) 26 (project-root pr)))) 27 (with-current-buffer buf 28 (and (or buffer-file-name 29 dired-directory 30 list-buffers-directory) 31 (let ((file-name (or buffer-file-name 32 dired-directory 33 list-buffers-directory))) 34 (file-in-directory-p file-name qualifier)))))) 35 36 ;;;###autoload 37 (defun project-ibuffer-by-project (project-root) 38 "Open an IBuffer window showing all buffers in PROJECT-ROOT." 39 (require 'ibuf-ext nil t) 40 (let ((project-name (file-name-nondirectory 41 (directory-file-name project-root)))) 42 (ibuffer nil (format "*%s Buffers*" project-name) 43 (list (cons 'project-files project-root))))) 44 45 ;;;###autoload 46 (defun project-ibuffer (prompt-for-project) 47 "Open an IBuffer window showing all buffers in the current project. 48 49 Let user choose another project when PROMPT-FOR-PROJECT is supplied." 50 (interactive "P") 51 (let ((project-root (if prompt-for-project 52 (project-prompt-project-dir) 53 (project-root (project-current t))))) 54 (project-ibuffer-by-project project-root))) 55 56 (provide 'project-ibuffer) 57 ;;; project-ibuffer.el ends here