Subject: Re: bug#58839: [Patch] Re: bug#58839: 29.0.50; project-kill-buffer fails when Eglot is running

From: Dmitry Gutov <[email-masked]>
Date: Tue, 1 Nov 2022 17:26:26 +0200

On 01.11.2022 13:27, Philip Kaludercic wrote:

> I am biased, but I believe that the language could even find more use in
> project.el, by having `project-buffers' just call `match-buffers' with a
> special `buffer-match-p' predicate.  Here is a sketch of how that could
> look like (I haven't tested it yet):

Sure, but only after we're ready to drop project.el support for Emacs 
older than 29.

> 
> 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))

Not an optimal name, given that we have made project-buffers a generic 
function, so that a custom project backend can define their own 
buffer-listing strategy. And this one implies that matching by 
default-directory is universal.

> +(defcustom project-buffer-conditions

Why not keep considering unknown buffers as part of project by default?

We'll just stop killing them on cleanup.

Otherwise, we'll really need an extensible mechanism for major modes all 
around the ecosystem to tag themselves as project-visible.

> +  '(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)

Let's not forget Xref, Occur, VC-Dir, Log-View. Maybe some others.