From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Tino Calancha Newsgroups: gmane.emacs.bugs Subject: bug#46374: 28.0.50; Ask me to save buffers only if they are under callers dir Date: Sun, 14 Mar 2021 13:17:05 +0100 Message-ID: <87mtv6yloe.fsf@gmail.com> References: <878s7z4ihk.fsf@gmail.com> <87a6sdzeh6.fsf@mail.linkov.net> <87ft16g0u2.fsf@gmail.com> <87tupmisel.fsf@mail.linkov.net> <1952f2d9-51b6-a4ba-6c9e-98594222f017@gmail.com> <87r1kpemnr.fsf@mail.linkov.net> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="30905"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: 46374@debbugs.gnu.org, stefan monnier , =?UTF-8?Q?Qu=C3=A1ch_?= =?UTF-8?Q?M=E1=BB=B9_?= =?UTF-8?Q?Uy=C3=AAn?= Nhi To: Juri Linkov Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Mar 14 13:19:11 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lLPiA-0007sf-BH for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 14 Mar 2021 13:19:10 +0100 Original-Received: from localhost ([::1]:35870 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lLPi9-0007Ae-CQ for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 14 Mar 2021 08:19:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:55082) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lLPh6-0006nd-1J for bug-gnu-emacs@gnu.org; Sun, 14 Mar 2021 08:18:05 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:49742) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lLPh4-0001rX-Ln for bug-gnu-emacs@gnu.org; Sun, 14 Mar 2021 08:18:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lLPh4-00030y-HD for bug-gnu-emacs@gnu.org; Sun, 14 Mar 2021 08:18:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Tino Calancha Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Mar 2021 12:18:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 46374 X-GNU-PR-Package: emacs Original-Received: via spool by 46374-submit@debbugs.gnu.org id=B46374.161572423411517 (code B ref 46374); Sun, 14 Mar 2021 12:18:02 +0000 Original-Received: (at 46374) by debbugs.gnu.org; 14 Mar 2021 12:17:14 +0000 Original-Received: from localhost ([127.0.0.1]:33052 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lLPgI-0002zg-AV for submit@debbugs.gnu.org; Sun, 14 Mar 2021 08:17:14 -0400 Original-Received: from mail-ed1-f45.google.com ([209.85.208.45]:37550) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lLPgH-0002zU-1S for 46374@debbugs.gnu.org; Sun, 14 Mar 2021 08:17:13 -0400 Original-Received: by mail-ed1-f45.google.com with SMTP id x21so14036042eds.4 for <46374@debbugs.gnu.org>; Sun, 14 Mar 2021 05:17:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=anMgpLTNd3NtfHCE6CQjqz8mDhipIV/KMRrb/36lDL0=; b=Z2GjPBuYS2MoFcxiBD1OwPISY+R06LYZJdxUhRhfajU71VYCJAuGzZPSKTs/umhtoF vjOvQOXKvxSEtmO5pi6ox2lNcAKbCLF/Hz5pzXZ82SWY0UPVDw36PbeImGproe/Bzfgs COZjWahNrkLED2wRVy5gFlImgGTNlWav14/tkKwwN/WY5IkckDIeTzgJTRdStB+pX6+u k90Tb3eaH16J34p06/kQlif9rlJp8N54swmm7QsLpOsTope0HFwZdJY6nrn/d7ZkQQjE D7ASAz0pxRf6oWOIiXmkiq4szhIQ4HYft9+aTH1waCRhBo2mXXmtqDGvgY+tTfngA4sl JsrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=anMgpLTNd3NtfHCE6CQjqz8mDhipIV/KMRrb/36lDL0=; b=lgBABd6SoOLVLJyTdt+Hbm7a1sp0dO1vaWCAyz8Y4lwhttXkinVVoWGFEfg8HWb1j3 4cPUaOAbDVguvKJCqXr0BOkKP275AonRvrzZPUlG+QE0rmLORhxm3FoKbKWq2GoF1W/w 8qRyFkxEnc4kah0XgQCQTtzTbMni6po7snPhTKMBrWi5qkBYfdrLlcPQlYpySXsy6UJQ T2ZCg4NPh0D7UsN6of33UH1Yj6diL/hcNKvaIwA8qOfkro4mbIvQRCDPmToARaidDMOR o0jrifuNFzKaBxRsrLhK+5AZDhM6PmCkEEmsgh1dW0AaJ8KYsXJPcpWjHFSxdO8bQd8z AXtg== X-Gm-Message-State: AOAM530mdsG1j2rWFxIPWjlRlPGDwwfzsDcQD88We2IHPutjUSHlaOe/ PMhwauQ9mLQ+BpU68ChVJdk= X-Google-Smtp-Source: ABdhPJyHHdiPzSj6wAgRnv5nZXCFKiC9yLzxMG4cpQ1y6YASZ3/L2qnrNU1dlBwYN3J/cM0d0H3hoQ== X-Received: by 2002:a05:6402:646:: with SMTP id u6mr25142198edx.250.1615724227219; Sun, 14 Mar 2021 05:17:07 -0700 (PDT) Original-Received: from localhost.example.com ([31.7.242.222]) by smtp.gmail.com with ESMTPSA id 90sm6615814edr.69.2021.03.14.05.17.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 Mar 2021 05:17:06 -0700 (PDT) In-Reply-To: <87r1kpemnr.fsf@mail.linkov.net> (Juri Linkov's message of "Mon, 08 Mar 2021 19:28:00 +0200") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:202365 Archived-At: Juri Linkov writes: > This means reusing the existing save-some-buffers-default-predicate > would be still preferable that guarantees backward-compatibility. > When it's customized to a predicate to filter out non-current subdirs, > then such call '(save-some-buffers t (lambda () (derived-mode-p 'org-mode)))' > still overrides the customized value. This is the right thing to do. OK, back to my original implementation (i.e., adding a new option to `save-some-buffers-default-predicate`). I have been playing with the followig patch this morning. - it only adds a new option 'project-root - in case there is not a root there, then `default-directory` is taken (this is a requirement from the OP, that ie me :-) - this patch doesn't interfere with the 2nd argument of `save-some-buffers'. Please, try it: --8<-----------------------------cut here---------------start------------->8--- diff --git a/lisp/files.el b/lisp/files.el index dada69c145..d890e5b7b7 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -5517,7 +5517,9 @@ save-some-buffers-default-predicate :group 'auto-save ;; FIXME nil should not be a valid option, let alone the default, ;; eg so that add-function can be used. - :type '(choice (const :tag "Default" nil) function) + :type '(choice (const :tag "Default" nil) + (const :tag "Project root" project-root) + function) :version "26.1") (defun save-some-buffers (&optional arg pred) @@ -5546,9 +5548,22 @@ save-some-buffers See `save-some-buffers-action-alist' if you want to change the additional actions you can take on files." (interactive "P") - (unless pred - (setq pred save-some-buffers-default-predicate)) - (let* ((switched-buffer nil) + (let* ((project-dir (or (and (project-current) (project-root (project-current))) + default-directory)) + (effective-pred + (or pred + (if (eq 'project-root save-some-buffers-default-predicate) + (lambda () (file-in-directory-p default-directory project-dir)) + save-some-buffers-default-predicate))) + (switched-buffer nil) + (non-visiting-buffers-ok (not (null pred))) + (buffer-name-matches-filename-p + (lambda (buffer) + "Return non-nil if BUFFER name is similar to its file name." + (let ((file-basename (file-name-nondirectory (buffer-file-name buffer)))) + (or (equal (buffer-name buffer) file-basename) + (string-match-p (format "\\<%s<[^>]*>\\'" (regexp-quote file-basename)) + (buffer-name buffer)))))) (save-some-buffers--switch-window-callback (lambda (buffer) (setq switched-buffer buffer))) @@ -5578,36 +5593,19 @@ save-some-buffers (buffer-file-name buffer) (with-current-buffer buffer (or (eq buffer-offer-save 'always) - (and pred buffer-offer-save - (> (buffer-size) 0))))) - (or (not (functionp pred)) - (with-current-buffer buffer (funcall pred))) + (and non-visiting-buffers-ok buffer-offer-save (> (buffer-size) 0))))) + (or (not (functionp effective-pred)) + (with-current-buffer buffer (funcall effective-pred))) (if arg t (setq queried t) - (if (buffer-file-name buffer) - (if (or - (equal (buffer-name buffer) - (file-name-nondirectory - (buffer-file-name buffer))) - (string-match - (concat "\\<" - (regexp-quote - (file-name-nondirectory - (buffer-file-name buffer))) - "<[^>]*>\\'") - (buffer-name buffer))) - ;; The buffer name is similar to the - ;; file name. - (format "Save file %s? " - (buffer-file-name buffer)) - ;; The buffer and file names are - ;; dissimilar; display both. - (format "Save file %s (buffer %s)? " - (buffer-file-name buffer) - (buffer-name buffer))) - ;; No file name - (format "Save buffer %s? " (buffer-name buffer)))))) + (cond ((null (buffer-file-name buffer)) + (format "Save buffer %s? " (buffer-name buffer))) + ((funcall buffer-name-matches-filename-p buffer) + (format "Save file %s? " (buffer-file-name buffer))) + (t (format "Save file %s (buffer %s)? " + (buffer-file-name buffer) + (buffer-name buffer))))))) (lambda (buffer) (with-current-buffer buffer (save-buffer))) --8<-----------------------------cut here---------------end--------------->8---