diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index ac278edd40..b55c245368 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -352,15 +352,28 @@ project--remote-file-names (concat remote-id file)) local-files)))) +(defun project-includes-buffer-p (buffer dir) + "Return non-nil if the `default-directory' of BUFFER is below DIR." + (file-in-directory-p + (buffer-local-value 'default-directory buffer) + dir)) + +(defcustom project-buffer-conditions + '(and (or buffer-file-name + (derived-mode . compilation-mode) + (derived-mode . dired-mode) + (derived-mode . diff-mode) + (derived-mode . comint-mode) + (derived-mode . eshell-mode) + (derived-mode . change-log-mode)) + project-includes-buffer-p) + "A buffer predicate for matching what buffers belong to a project." + :type 'buffer-predicate) + (cl-defgeneric project-buffers (project) "Return the list of all live buffers that belong to PROJECT." - (let ((root (expand-file-name (file-name-as-directory (project-root project)))) - bufs) - (dolist (buf (buffer-list)) - (when (string-prefix-p root (expand-file-name - (buffer-local-value 'default-directory buf))) - (push buf bufs))) - (nreverse bufs))) + (let ((root (expand-file-name (file-name-as-directory (project-root project))))) + (match-buffers project-buffer-conditions nil root))) (defgroup project-vc nil "Project implementation based on the VC package." @@ -679,7 +692,7 @@ project-buffers (project--git-submodules)))) dd bufs) - (dolist (buf (buffer-list)) + (dolist (buf (cl-call-next-method)) (setq dd (expand-file-name (buffer-local-value 'default-directory buf))) (when (and (string-prefix-p root dd) (not (cl-find-if (lambda (module) (string-prefix-p module dd))