project-ibuffer

a 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 (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