From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Tino Calancha Newsgroups: gmane.emacs.bugs Subject: bug#25942: 26.0.50; dired-mark-extension prepend '.' to suffix if not present Date: Tue, 28 Mar 2017 10:23:32 +0900 Message-ID: <87vaqu42jv.fsf@calancha-pc> References: <87d1dzjadq.fsf@calancha-pc> <87bmsn1x2d.fsf@localhost> <83r31j8n0e.fsf@gnu.org> <87zig7jna1.fsf@calancha-pc> <87h92e9w77.fsf@localhost> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1490664266 15281 195.159.176.226 (28 Mar 2017 01:24:26 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 28 Mar 2017 01:24:26 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) Cc: 25942@debbugs.gnu.org, tino.calancha@gmail.com To: Juri Linkov Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Mar 28 03:24:16 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1csfrn-0002LS-9d for geb-bug-gnu-emacs@m.gmane.org; Tue, 28 Mar 2017 03:24:11 +0200 Original-Received: from localhost ([::1]:49481 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1csfrp-0008EV-Td for geb-bug-gnu-emacs@m.gmane.org; Mon, 27 Mar 2017 21:24:13 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:52652) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1csfrj-0008EN-Mh for bug-gnu-emacs@gnu.org; Mon, 27 Mar 2017 21:24:09 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1csfre-0001hK-KJ for bug-gnu-emacs@gnu.org; Mon, 27 Mar 2017 21:24:07 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:49857) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1csfre-0001hB-GH for bug-gnu-emacs@gnu.org; Mon, 27 Mar 2017 21:24:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1csfre-0002xe-9I for bug-gnu-emacs@gnu.org; Mon, 27 Mar 2017 21:24: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: Tue, 28 Mar 2017 01:24:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 25942 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 25942-submit@debbugs.gnu.org id=B25942.149066422611357 (code B ref 25942); Tue, 28 Mar 2017 01:24:02 +0000 Original-Received: (at 25942) by debbugs.gnu.org; 28 Mar 2017 01:23:46 +0000 Original-Received: from localhost ([127.0.0.1]:48056 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1csfrN-0002x7-Vb for submit@debbugs.gnu.org; Mon, 27 Mar 2017 21:23:46 -0400 Original-Received: from mail-pg0-f49.google.com ([74.125.83.49]:34199) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1csfrL-0002wr-Tm for 25942@debbugs.gnu.org; Mon, 27 Mar 2017 21:23:44 -0400 Original-Received: by mail-pg0-f49.google.com with SMTP id 21so56740399pgg.1 for <25942@debbugs.gnu.org>; Mon, 27 Mar 2017 18:23:43 -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=sCAXaQxhvYJIQ5yzhlLvJlEQFHhVaV2m4m1q/uj5XEA=; b=CH9oYk7t6+lLCGI6jBfr+fQ3mHg3RUTS1KL07OzL5ZGlWzuk5pNaKML5FlSgXhsxRo mbK/5XjgvtXCLnpQW1JepWgVF5xH9iX/T8B4DDSse3Xpby94VPUw9+k/3VqOm9xlNGmL 2xLh6gLLOZ8a3HXPiyMRVcXHat+ZXNpxqhUyZQ8kVCDXHREzHlRk7mxDbc7XSyjqiEmT tG1LpuzOlGKKiuqyulpsGAm9fJ6KTxgJqYUpXi6OEO0X0geMogVKAWQrIGRUqZ/tLU6m Y6jjC8gYQoHa2AQPW+6xrf0bbrDHVmB8NhMc6qRsNcdNA2y4Y8EqcgKY1kdXTe0O7K13 g+zQ== 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=sCAXaQxhvYJIQ5yzhlLvJlEQFHhVaV2m4m1q/uj5XEA=; b=mNXNaZS1kJgtGqs77w8TbOZ19Yscqkt0/cynngTxB5T2kWD5eoViaecNQXBAAOsuKn 4k9G4XYdMcP6zs8GEp3HAkp+kl8ZPanaYiKAvY3qCH+SBMzG9kMkKskOKOrFaXm42xSu Z9RBWMrmXZLdfZl88x1JXKV423s9qj1FqSb2cUqCI+rqMiqAdcUgKJ+++nSb8Tju2sX9 UQH1UUZU1d08JWWn8w0JE5Dt0k06YMY54nXfbpmz10i2w/ME60ArRDnbPfb0lB2QIzD2 ONzdoxVdr4NouvlJ5sVeghsuLCDMtXH4rhqWPwFJygt1RYBt6QRMi2sByWR1PwCCHLXx C6+g== X-Gm-Message-State: AFeK/H0MRZiWm+ZviRWkVFwv118JxvKyeAKtTGaFYVdWaXmH8h+58Jpyw0BOkMA366CPLg== X-Received: by 10.98.139.195 with SMTP id e64mr28893880pfl.86.1490664217966; Mon, 27 Mar 2017 18:23:37 -0700 (PDT) Original-Received: from calancha-pc (234.204.100.220.dy.bbexcite.jp. [220.100.204.234]) by smtp.gmail.com with ESMTPSA id a5sm3341301pfh.124.2017.03.27.18.23.35 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 27 Mar 2017 18:23:37 -0700 (PDT) In-Reply-To: <87h92e9w77.fsf@localhost> (Juri Linkov's message of "Tue, 28 Mar 2017 01:44:12 +0300") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 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.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:131024 Archived-At: Juri Linkov writes: >> diff --git a/etc/NEWS b/etc/NEWS >> index cd98f53399..3839439a32 100644 >> --- a/etc/NEWS >> +++ b/etc/NEWS >> @@ -474,6 +474,11 @@ where to place point after C-c M-r and C-c M-s. >> ** Dired >> >> +++ >> +*** Command 'dired-mark-extension' now automatically prepends a '.' to the >> +extension when not present. The new command 'dired-mark-suffix' behaves >> +similarly but it doesn't prepend a '.'. >> + >> ++++ >> *** A new option 'dired-always-read-filesystem' default to nil. >> If non-nil, buffers visiting files are reverted before search them; >> for instance, in 'dired-mark-files-containing-regexp' a non-nil value > > There is a special section in etc/NEWS for Incompatible Changes > that would be a more likely place to find this change. That's right. Thanks. Here is the updated patch: --8<-----------------------------cut here---------------start------------->8--- >From 268eae94cdaf43bfd44c3b8d5cb74a32d26556c3 Mon Sep 17 00:00:00 2001 From: Tino Calancha Date: Tue, 28 Mar 2017 10:18:59 +0900 Subject: [PATCH] dired-mark-suffix: New command Now dired-mark-extension prepends '.' to extension when not present. Add command dired-mark-suffix to preserve the previous behaviour (Bug#25942). * lisp/dired-x.el (dired-mark-suffix): New command; mark files ending in a given suffix. (dired--mark-suffix-interactive-spec): New defun. (dired-mark-extension, dired-mark-suffix): Use it. * doc/misc/dired-x.texi (Advanced Mark Commands): Update manual. * test/lisp/dired-x-tests.el: New test suite; add test for these features. ; * etc/NEWS (Incompatible Lisp Changes in Emacs 26.1): ; Mention these changes. --- doc/misc/dired-x.texi | 18 ++++++++-- etc/NEWS | 7 ++-- lisp/dired-x.el | 85 ++++++++++++++++++++++++++++++---------------- test/lisp/dired-x-tests.el | 48 ++++++++++++++++++++++++++ 4 files changed, 124 insertions(+), 34 deletions(-) create mode 100644 test/lisp/dired-x-tests.el diff --git a/doc/misc/dired-x.texi b/doc/misc/dired-x.texi index 1e6f4b03bb..bf103256f2 100644 --- a/doc/misc/dired-x.texi +++ b/doc/misc/dired-x.texi @@ -721,15 +721,27 @@ Advanced Mark Commands @item dired-mark-extension @findex dired-mark-extension Mark all files with a certain extension for use in later commands. A @samp{.} -is not automatically prepended to the string entered, you must type it -explicitly. -If invoked with prefix argument @kbd{C-u}, this command unmark files instead. +is automatically prepended to the string entered when not present. +If invoked with prefix argument @kbd{C-u}, this command unmarks files instead. If called with the @kbd{C-u C-u} prefix, asks for a character to use as the marker, and marks files with it. When called from Lisp, @var{extension} may also be a list of extensions and an optional argument @var{marker-char} specifies the marker used. +@item dired-mark-suffix +@findex dired-mark-suffix +Mark all files with a certain suffix for use in later commands. A @samp{.} +is not automatically prepended to the string entered, you must type it +explicitly. This is different from @var{dired-mark-extension} which prepends +a @samp{.} if not present. +If invoked with prefix argument @kbd{C-u}, this command unmarks files instead. +If called with the @kbd{C-u C-u} prefix, asks for a character to use +as the marker, and marks files with it. + +When called from Lisp, @var{suffix} may also be a list of suffixes +and an optional argument @var{marker-char} specifies the marker used. + @item dired-flag-extension @findex dired-flag-extension Flag all files with a certain extension for deletion. A @samp{.} is diff --git a/etc/NEWS b/etc/NEWS index cd98f53399..bfd7d2bd32 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -471,8 +471,6 @@ where to place point after C-c M-r and C-c M-s. --- *** Messages from CMake are now recognized. -** Dired - +++ *** A new option 'dired-always-read-filesystem' default to nil. If non-nil, buffers visiting files are reverted before search them; @@ -759,6 +757,11 @@ processes on exit. * Incompatible Lisp Changes in Emacs 26.1 +++ +*** Command 'dired-mark-extension' now automatically prepends a '.' to the +extension when not present. The new command 'dired-mark-suffix' behaves +similarly but it doesn't prepend a '.'. + ++++ ** Certain cond/pcase/cl-case forms are now compiled using a faster jump table implementation. This uses a new bytecode op `switch', which isn't compatible with previous Emacs versions. This functionality can be disabled diff --git a/lisp/dired-x.el b/lisp/dired-x.el index 6c8fb0e7da..527685acf3 100644 --- a/lisp/dired-x.el +++ b/lisp/dired-x.el @@ -332,46 +332,73 @@ dired-extra-startup ;;; EXTENSION MARKING FUNCTIONS. +(defun dired--mark-suffix-interactive-spec () + (let* ((default + (let ((file (dired-get-filename nil t))) + (when file + (file-name-extension file)))) + (suffix + (read-string (format "%s extension%s: " + (if (equal current-prefix-arg '(4)) + "UNmarking" + "Marking") + (if default + (format " (default %s)" default) + "")) nil nil default)) + (marker + (pcase current-prefix-arg + ('(4) ?\s) + ('(16) + (let* ((dflt (char-to-string dired-marker-char)) + (input (read-string + (format + "Marker character to use (default %s): " dflt) + nil nil dflt))) + (aref input 0))) + (_ dired-marker-char)))) + (list suffix marker))) + ;; Mark files with some extension. (defun dired-mark-extension (extension &optional marker-char) "Mark all files with a certain EXTENSION for use in later commands. -A `.' is *not* automatically prepended to the string entered. +A `.' is automatically prepended to EXTENSION when not present. EXTENSION may also be a list of extensions instead of a single one. Optional MARKER-CHAR is marker to use. Interactively, ask for EXTENSION. Prefixed with one C-u, unmark files instead. Prefixed with two C-u's, prompt for MARKER-CHAR and mark files with it." - (interactive - (let* ((default - (let ((file (dired-get-filename nil t))) - (when file - (file-name-extension file)))) - (suffix - (read-string (format "%s extension%s: " - (if (equal current-prefix-arg '(4)) - "UNmarking" - "Marking") - (if default - (format " (default %s)" default) - "")) nil nil default)) - (marker - (pcase current-prefix-arg - ('(4) ?\s) - ('(16) - (let* ((dflt (char-to-string dired-marker-char)) - (input (read-string - (format - "Marker character to use (default %s): " dflt) - nil nil dflt))) - (aref input 0))) - (_ dired-marker-char)))) - (list suffix marker))) - (or (listp extension) - (setq extension (list extension))) + (interactive (dired--mark-suffix-interactive-spec)) + (unless (listp extension) + (setq extension (list extension))) + (dired-mark-files-regexp + (concat ".";; don't match names with nothing but an extension + "\\(" + (mapconcat + (lambda (x) + (regexp-quote + (if (string-prefix-p "." x) x (concat "." x)))) + extension "\\|") + "\\)$") + marker-char)) + +;; Mark files ending with some suffix. +(defun dired-mark-suffix (suffix &optional marker-char) + "Mark all files with a certain SUFFIX for use in later commands. +A `.' is *not* automatically prepended to the string entered; see +also `dired-mark-extension', which is similar but automatically +prepends `.' when not present. +SUFFIX may also be a list of suffixes instead of a single one. +Optional MARKER-CHAR is marker to use. +Interactively, ask for SUFFIX. +Prefixed with one C-u, unmark files instead. +Prefixed with two C-u's, prompt for MARKER-CHAR and mark files with it." + (interactive (dired--mark-suffix-interactive-spec)) + (unless (listp suffix) + (setq suffix (list suffix))) (dired-mark-files-regexp (concat ".";; don't match names with nothing but an extension "\\(" - (mapconcat 'regexp-quote extension "\\|") + (mapconcat 'regexp-quote suffix "\\|") "\\)$") marker-char)) diff --git a/test/lisp/dired-x-tests.el b/test/lisp/dired-x-tests.el new file mode 100644 index 0000000000..b11c440834 --- /dev/null +++ b/test/lisp/dired-x-tests.el @@ -0,0 +1,48 @@ +;;; dired-x-tests.el --- Test suite for dired-x. -*- lexical-binding: t -*- + +;; Copyright (C) 2017 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Code: +(require 'ert) +(require 'dired-x) + + +(ert-deftest dired-test-bug25942 () + "Test for http://debbugs.gnu.org/25942 ." + (let ((dirs '("Public" "Music")) + (files '(".bashrc" "bar.c" "foo.c" "c" ".c")) + (dir (make-temp-file "Bug25942" 'dir)) + (extension "c")) + (unwind-protect + (progn + (dolist (d dirs) + (make-directory (expand-file-name d dir))) + (dolist (f files) + (write-region nil nil (expand-file-name f dir))) + (dired dir) + (dired-mark-extension extension) + (should (= (length '("foo.c" "bar.c")) + (length (dired-get-marked-files)))) + (dired-unmark-all-marks) + (dired-mark-suffix extension) + (should (= (length (delete "c" (append dirs files))) + (length (dired-get-marked-files))))) + (delete-directory dir 'recursive)))) + +(provide 'dired-x-tests) +;; dired-x-tests.el ends here -- 2.11.0 --8<-----------------------------cut here---------------end--------------->8--- In GNU Emacs 26.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.9) of 2017-03-27 Repository revision: a62437d4b933825a92ac3836836edbca3540fa1c