From: Dmitry Gutov Date: Fri, 17 Jun 2022 12:22:29 +0000 (+0300) Subject: buffer-match-p: Resolve backward compat concerns X-Git-Tag: emacs-29.0.90~1447^2~1683 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=4aca0d818f2d0b7dd7dc511907cc19f63758e482;p=emacs.git 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. --- diff --git a/doc/lispref/buffers.texi b/doc/lispref/buffers.texi index 1cbe8bc0933..aee440fe782 100644 --- a/doc/lispref/buffers.texi +++ b/doc/lispref/buffers.texi @@ -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 diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index f4d6742ed80..30f51704dca 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -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))) diff --git a/lisp/subr.el b/lisp/subr.el index 50ae357a136..c1c9759b03d 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -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)))