buffer-match-p: Resolve backward compat concerns

* doc/lispref/buffers.texi (Buffer List): Document 'major-mode'
and 'derived-mode' predicates.  Fix some typos.

* lisp/subr.el (buffer-match-p): Use the structure initially
pioneered by project-kill-buffer-conditions as-is (bug#54296).

* lisp/progmodes/project.el (project-kill-buffer-conditions)
(project--buffer-check): Revert the latest change.
(project--buffer-check): Add support for lambda predicates.
This commit is contained in:
Dmitry Gutov 2022-06-17 15:22:29 +03:00
parent 5e567af8e0
commit 4aca0d818f
3 changed files with 33 additions and 31 deletions

View file

@ -981,13 +981,18 @@ of
Satisfied if @var{expr} doesn't satisfy @code{buffer-match-p} with
the same buffer and @code{arg}.
@item or
Satisfied if @var{oper} is a list and @emph{any} condition if
Satisfied if @var{expr} is a list and @emph{any} condition in
@var{expr} satisfies @code{buffer-match-p}, with the same buffer and
@code{arg}.
@item and
Satisfied if @var{oper} is a list and @emph{all} condition if
@var{expr} satisfies @code{buffer-match-p}, with the same buffer and
Satisfied if @var{expr} is a list and @emph{all} conditions in
@var{expr} satisfy @code{buffer-match-p}, with the same buffer and
@code{arg}.
@item derived-mode
Satisfied if the buffer's major mode derives from @var{expr}.
@item major-mode
Satisfied if the buffer's major mode is equal to @var{expr}. Prefer
using @code{derived-mode} instead when both can work.
@end table
@end itemize
@end defun

View file

@ -1221,22 +1221,18 @@ displayed."
(display-buffer-other-frame buffer-or-name))
(defcustom project-kill-buffer-conditions
`(buffer-file-name ; All file-visiting buffers are included.
'(buffer-file-name ; All file-visiting buffers are included.
;; Most of the temp buffers in the background:
,(lambda (buf)
(not (eq (buffer-local-value 'major-mode buf)
'fundamental-mode)))
(major-mode . fundamental-mode)
;; non-text buffer such as xref, occur, vc, log, ...
(and (major-mode . special-mode)
,(lambda (buf)
(not (eq (buffer-local-value 'major-mode buf)
'help-mode))))
(major-mode . compilation-mode)
(major-mode . dired-mode)
(major-mode . diff-mode)
(major-mode . comint-mode)
(major-mode . eshell-mode)
(major-mode . change-log-mode))
(and (derived-mode . special-mode)
(not (major-mode . help-mode)))
(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))
"List of conditions to kill buffers related to a project.
This list is used by `project-kill-buffers'.
Each condition is either:
@ -1246,11 +1242,9 @@ Each condition is either:
- a cons-cell, where the car describes how to interpret the cdr.
The car can be one of the following:
* `major-mode': the buffer is killed if the buffer's major
mode is derived from the major mode denoted by the cons-cell's
cdr.
mode is eq to the cons-cell's cdr.
* `derived-mode': the buffer is killed if the buffer's major
mode is eq to the cons-cell's cdr (this is deprecated and will
result in a warning if used).
mode is derived from the major mode in the cons-cell's cdr.
* `not': the cdr is interpreted as a negation of a condition.
* `and': the cdr is a list of recursive conditions, that all have
to be met.
@ -1308,15 +1302,12 @@ form of CONDITIONS."
(when (cond
((stringp c)
(string-match-p c (buffer-name buf)))
((symbolp c)
((functionp c)
(funcall c buf))
((eq (car-safe c) 'derived-mode)
(warn "The use of `derived-mode' in \
`project--buffer-check' is deprecated.")
(provided-mode-derived-p
(buffer-local-value 'major-mode buf)
(cdr c)))
((eq (car-safe c) 'major-mode)
(eq (buffer-local-value 'major-mode buf)
(cdr c)))
((eq (car-safe c) 'derived-mode)
(provided-mode-derived-p
(buffer-local-value 'major-mode buf)
(cdr c)))

View file

@ -6855,9 +6855,11 @@ CONDITION is either:
arguments, and returns non-nil if the buffer matches,
- a cons-cell, where the car describes how to interpret the cdr.
The car can be one of the following:
* `major-mode': the buffer matches if the buffer's major
mode is derived from the major mode denoted by the cons-cell's
cdr
* `derived-mode': the buffer matches if the buffer's major mode
is derived from the major mode in the cons-cell's cdr.
* `major-mode': the buffer matches if the buffer's major mode
is eq to the cons-cell's cdr. Prefer using `derived-mode'
instead when both can work.
* `not': the cdr is interpreted as a negation of a condition.
* `and': the cdr is a list of recursive conditions, that all have
to be met.
@ -6877,6 +6879,10 @@ CONDITION is either:
(funcall condition buffer)
(funcall condition buffer arg)))
((eq (car-safe condition) 'major-mode)
(eq
(buffer-local-value 'major-mode buffer)
(cdr condition)))
((eq (car-safe condition) 'derived-mode)
(provided-mode-derived-p
(buffer-local-value 'major-mode buffer)
(cdr condition)))