Codebase list ibuffer-projectile / 33119cc
Update upstream source from tag 'upstream/0.3' Update to upstream version '0.3' with Debian dir 5462059493407d4264628e7f1fcfd95067a7fb2f Lev Lamberov 4 years ago
2 changed file(s) with 89 addition(s) and 13 deletion(s). Raw diff Collapse all Expand all
00 [![Melpa Status](http://melpa.org/packages/ibuffer-projectile-badge.svg)](http://melpa.org/#/ibuffer-projectile)
11 [![Melpa Stable Status](http://stable.melpa.org/packages/ibuffer-projectile-badge.svg)](http://stable.melpa.org/#/ibuffer-projectile)
2 <a href="https://www.patreon.com/sanityinc"><img alt="Support me" src="https://img.shields.io/badge/Support%20Me-%F0%9F%92%97-ff69b4.svg"></a>
23
34 # ibuffer-projectile: Group buffers in ibuffer list by projectile project #
45
1314 call `ibuffer-projectile-set-filter-groups`. To have this function
1415 called when you open ibuffer, add this hook to your configuration:
1516
16 ```
17 ```el
1718 (add-hook 'ibuffer-hook
1819 (lambda ()
1920 (ibuffer-projectile-set-filter-groups)
2425 Alternatively, use `ibuffer-projectile-generate-filter-groups'
2526 to programmatically obtain a list of filter groups that you can
2627 combine with your own custom groups.
28
29 To display filenames relative to the project root, use project-relative-file
30 in `ibuffer-formats`, e.g.:
31
32 ```el
33 (setq ibuffer-formats
34 '((mark modified read-only " "
35 (name 18 18 :left :elide)
36 " "
37 (size 9 -1 :right)
38 " "
39 (mode 16 16 :left :elide)
40 " "
41 project-relative-file)))
42 ```
2743
2844 I personally use [ibuffer-vc](https://github.com/purcell/ibuffer-vc)
2945 because I prefer its grouping behaviour, but I thought this would be
0 ;;; ibuffer-projectile.el --- Group ibuffer's list by projectile root
0 ;;; ibuffer-projectile.el --- Group ibuffer's list by projectile root -*- lexical-binding: t -*-
11 ;;
22 ;; Copyright (C) 2011-2014 Steve Purcell
33 ;;
44 ;; Author: Steve Purcell <steve@sanityinc.com>
5 ;; Keywords: themes
6 ;; Package-Requires: ((projectile "0.11.0"))
5 ;; Keywords: convenience
6 ;; Package-Requires: ((projectile "0.11.0") (emacs "24.1"))
77 ;; URL: http://github.com/purcell/ibuffer-projectile
88 ;; Package-Version: 0
99 ;;
4343 ;; to programmatically obtain a list of filter groups that you can
4444 ;; combine with your own custom groups.
4545 ;;
46 ;; To display filenames relative to the project root, use project-relative-file
47 ;; in `ibuffer-formats', e.g.:
48 ;;
49 ;; (setq ibuffer-formats
50 ;; '((mark modified read-only " "
51 ;; (name 18 18 :left :elide)
52 ;; " "
53 ;; (size 9 -1 :right)
54 ;; " "
55 ;; (mode 16 16 :left :elide)
56 ;; " "
57 ;; project-relative-file)))
58
4659 ;;; Code:
4760
4861 (require 'ibuffer)
7083 :type 'function
7184 :group 'ibuffer-projectile)
7285
86 (defcustom ibuffer-projectile-prefix "Projectile:"
87 "Prefix string for generated filter groups."
88 :type 'string
89 :group 'ibuffer-projectile)
90
91 (defcustom ibuffer-projectile-group-name-function 'ibuffer-projectile-default-group-name
92 "Function used to produce the name for a group.
93 The function is passed two arguments: the projectile project
94 name, and the root directory path."
95 :type 'function
96 :group 'ibuffer-projectile)
97
98 (defun ibuffer-projectile-default-group-name (project-name root-dir)
99 "Produce an ibuffer group name string for PROJECT-NAME and ROOT-DIR."
100 (format "%s%s" ibuffer-projectile-prefix project-name))
101
73102 (defun ibuffer-projectile--include-file-p (file)
74103 "Return t iff FILE should be included in ibuffer-projectile's filtering."
75104 (and file
78107 (funcall ibuffer-projectile-include-function file)))
79108
80109 (defun ibuffer-projectile-root (buf)
81 "Return root-dir for BUF.
110 "Return a cons cell (project-name . root-dir) for BUF.
82111 If the file is not in a project, then nil is returned instead."
83112 (with-current-buffer buf
84 (let ((file-name (or buffer-file-name default-directory)))
85 (when (ibuffer-projectile--include-file-p file-name)
86 (let ((projectile-require-project-root nil))
87 (projectile-project-root))))))
113 (let ((file-name (ibuffer-buffer-file-name))
114 (root (ignore-errors (projectile-project-root))))
115 (when (and file-name
116 root
117 (ibuffer-projectile--include-file-p file-name))
118 (cons (projectile-project-name) root)))))
88119
89120 (define-ibuffer-filter projectile-root
90121 "Toggle current view to buffers with projectile root dir QUALIFIER."
91122 (:description "projectile root dir"
92 :reader (read-from-minibuffer "Filter by projectile root dir (regexp): "))
123 :reader (read-regexp "Filter by projectile root dir (regexp): "))
93124 (ibuffer-awhen (ibuffer-projectile-root buf)
94 (equal qualifier it)))
125 (if (stringp qualifier)
126 (or (string-match-p qualifier (car it))
127 (string-match-p qualifier (cdr-safe it)))
128 (equal qualifier it))))
129
130 ;;;###autoload (autoload 'ibuffer-make-column-project-name "ibuffer-projectile")
131 (define-ibuffer-column project-name
132 (:name "Project")
133 (projectile-project-name))
134
135 ;;;###autoload (autoload 'ibuffer-do-sort-by-project-name "ibuffer-projectile")
136 (define-ibuffer-sorter project-name
137 "Sort the buffers by their project name."
138 (:description "project")
139 (let ((project1 (with-current-buffer (car a)
140 (projectile-project-name)))
141 (project2 (with-current-buffer (car b)
142 (projectile-project-name))))
143 (if (and project1 project2)
144 (string-lessp project1 project2)
145 (not (null project1)))))
146
147 ;;;###autoload (autoload 'ibuffer-make-column-project-relative-file "ibuffer-projectile")
148 (define-ibuffer-column project-relative-file
149 (:name "Filename")
150 (when buffer-file-name
151 (let ((root (cdr (ibuffer-projectile-root buffer))))
152 (if root
153 (file-relative-name buffer-file-name root)
154 (abbreviate-file-name buffer-file-name)))))
95155
96156 ;;;###autoload
97157 (defun ibuffer-projectile-generate-filter-groups ()
99159 (let ((roots (ibuffer-remove-duplicates
100160 (delq nil (mapcar 'ibuffer-projectile-root (buffer-list))))))
101161 (mapcar (lambda (root)
102 (cons (abbreviate-file-name root)
162 (cons (funcall ibuffer-projectile-group-name-function (car root) (cdr root))
103163 `((projectile-root . ,root))))
104164 roots)))
105165
106166 ;;;###autoload
107167 (defun ibuffer-projectile-set-filter-groups ()
108 "Set the current filter groups to filter by vc root dir."
168 "Set the current filter groups to filter by projectile root dir."
109169 (interactive)
110170 (setq ibuffer-filter-groups (ibuffer-projectile-generate-filter-groups))
111171 (message "ibuffer-projectile: groups set")