From 7c177ecb8407633e624cd7e12a0c0d12b8990c32 Mon Sep 17 00:00:00 2001 From: Philip K Date: Thu, 18 Jun 2020 04:00:38 +0300 Subject: [PATCH] New command: project-kill-buffers * lisp/progmodes/project.el (project-kill-buffers-skip-conditions): New variable. (project--buffer-list): New function. (project-kill-buffers): New command (bug#41868). --- lisp/progmodes/project.el | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index e772570b9e1..e24d81c1b43 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -785,6 +785,47 @@ Arguments the same as in `compile'." (when-let ((file (buffer-file-name (cdr buffer)))) (file-in-directory-p file root))))))) +(defcustom project-kill-buffers-skip-conditions + '("\\*Help\\*") + "Conditions for buffers `project-kill-buffers' should not kill. +Each condition is either a regular expression matching a buffer +name, or a predicate function that takes a buffer object as +argument and returns non-nil if it matches. Buffers that match +any of the conditions will not be killed." + :type '(repeat (choice regexp function)) + :version "28.1") + +(defun project--buffer-list (pr) + "Return the list of all buffers in project PR." + (let ((root (project-root pr)) + bufs) + (dolist (buf (buffer-list)) + (let ((filename (or (buffer-file-name buf) + (buffer-local-value 'default-directory buf)))) + (when (and filename (file-in-directory-p filename root)) + (push buf bufs)))) + (nreverse bufs))) + +;;;###autoload +(defun project-kill-buffers () + "Kill all live buffers belonging to the current project. +Certain buffers may be ignored, depending on the value of +`project-kill-buffers-skip-conditions'." + (interactive) + (let ((pr (project-current t)) bufs) + (dolist (buf (project--buffer-list pr)) + (unless (seq-some + (lambda (c) + (cond ((stringp c) + (string-match-p c (buffer-name buf))) + ((functionp c) + (funcall c buf)))) + project-kill-buffers-skip-conditions) + (push buf bufs))) + (when (yes-or-no-p (format "Kill %d buffers in %s? " + (length bufs) (project-root pr))) + (mapc #'kill-buffer bufs)))) + ;;; Project list -- 2.39.5