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

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