From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: =?UTF-8?Q?K=C3=A9vin?= Le Gouguec Newsgroups: gmane.emacs.bugs Subject: bug#35564: [PATCH v2] Tweak dired warning about "wildcard" characters Date: Sun, 09 Jun 2019 13:08:41 +0200 Message-ID: <87wohvf22u.fsf@gmail.com> References: <87zho2cd4f.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="211931"; mail-complaints-to="usenet@blaine.gmane.org" Cc: Stefan Monnier To: 35564@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Jun 09 13:09:27 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1hZvhW-000t1E-Ep for geb-bug-gnu-emacs@m.gmane.org; Sun, 09 Jun 2019 13:09:26 +0200 Original-Received: from localhost ([::1]:34894 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hZvhU-0000mE-Il for geb-bug-gnu-emacs@m.gmane.org; Sun, 09 Jun 2019 07:09:24 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:53706) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hZvhA-0000m7-OV for bug-gnu-emacs@gnu.org; Sun, 09 Jun 2019 07:09:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hZvh9-0008Ub-00 for bug-gnu-emacs@gnu.org; Sun, 09 Jun 2019 07:09:04 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:40830) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hZvh8-0008UI-La for bug-gnu-emacs@gnu.org; Sun, 09 Jun 2019 07:09:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1hZvh8-0001nU-Dc for bug-gnu-emacs@gnu.org; Sun, 09 Jun 2019 07:09:02 -0400 X-Loop: help-debbugs@gnu.org In-Reply-To: <87zho2cd4f.fsf@gmail.com> Resent-From: =?UTF-8?Q?K=C3=A9vin?= Le Gouguec Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 09 Jun 2019 11:09:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 35564 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 35564-submit@debbugs.gnu.org id=B35564.15600785326887 (code B ref 35564); Sun, 09 Jun 2019 11:09:02 +0000 Original-Received: (at 35564) by debbugs.gnu.org; 9 Jun 2019 11:08:52 +0000 Original-Received: from localhost ([127.0.0.1]:54374 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hZvgx-0001n1-US for submit@debbugs.gnu.org; Sun, 09 Jun 2019 07:08:52 -0400 Original-Received: from mail-wm1-f48.google.com ([209.85.128.48]:51337) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hZvgv-0001ml-Nv for 35564@debbugs.gnu.org; Sun, 09 Jun 2019 07:08:50 -0400 Original-Received: by mail-wm1-f48.google.com with SMTP id 207so1026631wma.1 for <35564@debbugs.gnu.org>; Sun, 09 Jun 2019 04:08:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version; bh=hcuTuKk5ozc7mP++rUuLppfOeaAZQS4iv/G7FilvjJs=; b=W7e5n0TfYerWyu5gL9ZiCTOt99qnE1iTkHDPpYrX3TcBKUeSa74dVBI3QFLMBWIc2M WbNXxiODANjWhytsY7TKkD6ZMX/hW1iLQP+VqasJ+e7c9AI5nizwRhssodJZzmdHWvin dKFQfRpTQorkdtTWr3f28pYdoFEgvbH4b4CubGKYIQZdyuOBYvxI5yT8xrHBuAYLumuV OHm/IVk/lMsoh8psU7E+wle29bVsELMkyeW9PtWkdI+wIAqa8zWGE0zMPH7Kl7E2UACm sK9Cx/kTvm0iye/sLusGaBvPR55n7ohLIGbYUpjHdUY612Fayj9hjZ2kwNicPEXrXnl+ HIcQ== 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:date:message-id:mime-version; bh=hcuTuKk5ozc7mP++rUuLppfOeaAZQS4iv/G7FilvjJs=; b=SuHg7A7Gx+XtjNktkxD43zmHwSgT1HFXJMs/JQErJuZsWHpSMC3VrL6hBWcI7zoIav /fyUMwGHah43KlQYijvZHLfo69WpU43LvEWOvc17bUARDFWlS8pv5ZfGr9Cfxrj63dSs JMAtEcqdGy82le6wDMWRmbjAZLfDigcTgUIEBawVeh89GCKEcHGe2dZN6mQ/SdRo6QEO kHd99hIf+RoFVyBbnp5kJSdiRiP4eg02gvwxmqamSFuFoYkxKRB/e+RZkRpWI4374G51 DGELv977z+alC6QJJZJr8/E2sonTa5GUWw89+fRCKaDW+2uboZMErZJOt0FG0G5407hN J6fw== X-Gm-Message-State: APjAAAWBVfIuwDbHuK3bVE2GRswZjq3nPMFspYDfaBa7FRFkiNQSLznF FMi7AH3VQgu2i3DfqBGPJBHSH6Oi X-Google-Smtp-Source: APXvYqwVRqzv8aTiX+1S+lo2JzGSDnHDf6+2/cZzm7+HA9krTKoTXD9aS6b91RBtGkOUGNMgRXiGkA== X-Received: by 2002:a1c:9c4d:: with SMTP id f74mr9759282wme.156.1560078523505; Sun, 09 Jun 2019 04:08:43 -0700 (PDT) Original-Received: from nc10-laptop (2a01cb04010fc800bcce02c98b58d624.ipv6.abo.wanadoo.fr. [2a01:cb04:10f:c800:bcce:2c9:8b58:d624]) by smtp.gmail.com with ESMTPSA id c5sm9054246wma.19.2019.06.09.04.08.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 09 Jun 2019 04:08:42 -0700 (PDT) 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: 209.51.188.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:160271 Archived-At: --=-=-= Content-Type: text/plain Hello, Here is my second attempt at solving this issue. To recap: dired-do-shell-command warns the user about non-isolated '*' and '?' characters since the function will not substitute them. It refers to these characters as "wildcards", which can be incorrect: they may be quoted or backslash-escaped, in which case the shell will not interpret them as wildcards. My main motivation to change this warning is that it trips my brain to have to answer "yes" ("yes, I want to use wildcards") when no wildcards are involved. I could not come up with a simple, self-sufficient rephrasing for the warning, so I decided to display the command itself as part of the warning prompt, highlighting the non-isolated characters. The first patch adjusts y-or-n-p so that it preserves the prompt's text properties. The second patch changes dired-do-shell-command's prompt. --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Preserve-text-properties-in-y-or-n-p-prompts.patch >From 1719809f75183dcc743f2bdf697c919ae859b82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Le=20Gouguec?= Date: Fri, 7 Jun 2019 17:03:59 +0200 Subject: [PATCH 1/2] Preserve text properties in y-or-n-p prompts * lisp/subr.el (read--propertize-prompt): New function to append the prompt face to a string. (y-or-n-p): Use it instead of discarding potential text properties. --- lisp/subr.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index fd60ec87cc..1fcadc291c 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2334,6 +2334,9 @@ memory-limit ;;;; Input and display facilities. +(defun read--propertize-prompt (prompt) + (add-face-text-property 0 (length prompt) 'minibuffer-prompt t prompt)) + (defconst read-key-empty-map (make-sparse-keymap)) (defvar read-key-delay 0.01) ;Fast enough for 100Hz repeat rate, hopefully. @@ -2671,14 +2674,14 @@ y-or-n-p (let* ((scroll-actions '(recenter scroll-up scroll-down scroll-other-window scroll-other-window-down)) (key - (let ((cursor-in-echo-area t)) + (let ((cursor-in-echo-area t) + (prompt (if (memq answer scroll-actions) + prompt + (concat "Please answer y or n. " prompt)))) (when minibuffer-auto-raise (raise-frame (window-frame (minibuffer-window)))) - (read-key (propertize (if (memq answer scroll-actions) - prompt - (concat "Please answer y or n. " - prompt)) - 'face 'minibuffer-prompt))))) + (read--propertize-prompt prompt) + (read-key prompt)))) (setq answer (lookup-key query-replace-map (vector key) t)) (cond ((memq answer '(skip act)) nil) -- 2.20.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0002-Tweak-dired-warning-about-wildcard-characters.patch >From 69b8dfc60f8aca1a6f5358af6fdf60ce3c910cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Le=20Gouguec?= Date: Fri, 7 Jun 2019 17:19:44 +0200 Subject: [PATCH 2/2] Tweak dired warning about "wildcard" characters Non-isolated '?' and '*' characters may be quoted, or backslash-escaped; we do not know for a fact that the shell will interpret them as wildcards. Rephrase the prompt and highlight the characters so that the user sees exactly what we are talking about. * lisp/dired-aux.el (dired--isolated-char-p) (dired--highlight-nosubst-char, dired--no-subst-prompt): New functions. (dired-do-shell-command): Use them. * test/lisp/dired-aux-tests.el (dired-test-isolated-char-p) (dired-test-highlight-metachar): Test the new functions. --- lisp/dired-aux.el | 49 +++++++++++++++++++++++++++++++++--- test/lisp/dired-aux-tests.el | 27 ++++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index 51749acb21..dfb793324f 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -79,6 +79,49 @@ dired--star-or-qmark-p (funcall (if keep #'string-match-p #'string-match) x string)) regexps))) +(defun dired--isolated-char-p (command pos) + "Assert whether the character at POS is isolated within COMMAND. +A character is isolated if: +- it is surrounded by whitespace, the start of the command, or + the end of the command, +- it is surrounded by `\\=`' characters." + (let ((n (length command)) + (whitespace '(?\s ?\t))) + (or (= n 1) + (and (= pos 0) + (memq (elt command 1) whitespace)) + (and (= pos (1- n)) + (memq (elt command (1- pos)) whitespace)) + (and + (> pos 0) + (< pos (1- n)) + (let ((prev (elt command (1- pos))) + (next (elt command (1+ pos)))) + (or (and (memq prev whitespace) + (memq next whitespace)) + (and (= prev ?`) + (= next ?`)))))))) + +(defun dired--highlight-nosubst-char (command char) + "Highlight occurences of CHAR that are not isolated in COMMAND. +These occurences will not be substituted; they will be sent as-is +to the shell, which may interpret them as wildcards." + (save-match-data + (let ((highlighted (substring-no-properties command)) + (pos 0)) + (while (string-match (regexp-quote char) command pos) + (let ((start (match-beginning 0)) + (end (match-end 0))) + (unless (dired--isolated-char-p command start) + (add-face-text-property start end 'warning nil highlighted)) + (setq pos end))) + highlighted))) + +(defun dired--no-subst-prompt (command char) + (let ((highlighted-command (dired--highlight-nosubst-char command char)) + (prompt "Confirm--the highlighted characters will not be substituted:")) + (format-message "%s\n%s\nProceed?" prompt highlighted-command))) + ;;;###autoload (defun dired-diff (file &optional switches) "Compare file at point with FILE using `diff'. @@ -759,11 +802,9 @@ dired-do-shell-command (ok (cond ((not (or on-each no-subst)) (error "You can not combine `*' and `?' substitution marks")) ((need-confirm-p command "*") - (y-or-n-p (format-message - "Confirm--do you mean to use `*' as a wildcard? "))) + (y-or-n-p (dired--no-subst-prompt command "*"))) ((need-confirm-p command "?") - (y-or-n-p (format-message - "Confirm--do you mean to use `?' as a wildcard? "))) + (y-or-n-p (dired--no-subst-prompt command "?"))) (t)))) (cond ((not ok) (message "Command canceled")) (t diff --git a/test/lisp/dired-aux-tests.el b/test/lisp/dired-aux-tests.el index ccd3192792..77a4232aac 100644 --- a/test/lisp/dired-aux-tests.el +++ b/test/lisp/dired-aux-tests.el @@ -114,6 +114,33 @@ dired-test-bug30624 (mapc #'delete-file `(,file1 ,file2)) (kill-buffer buf))))) +(ert-deftest dired-test-isolated-char-p () + (should (dired--isolated-char-p "?" 0)) + (should (dired--isolated-char-p "? " 0)) + (should (dired--isolated-char-p " ?" 1)) + (should (dired--isolated-char-p " ? " 1)) + (should (dired--isolated-char-p "foo bar ? baz" 8)) + (should (dired--isolated-char-p "foo -i`?`" 7)) + (should-not (dired--isolated-char-p "foo 'bar?'" 8)) + (should-not (dired--isolated-char-p "foo bar?baz" 7)) + (should-not (dired--isolated-char-p "foo bar?" 7))) + +(ert-deftest dired-test-highlight-metachar () + "Check that non-isolated meta-characters are highlighted" + (let* ((command "sed -r -e 's/oo?/a/' -e 's/oo?/a/' ? `?`") + (result (dired--highlight-nosubst-char command "?"))) + (should-not (text-property-not-all 1 14 'face nil result)) + (should (equal 'warning (get-text-property 15 'face result))) + (should-not (text-property-not-all 16 28 'face nil result)) + (should (equal 'warning (get-text-property 29 'face result))) + (should-not (text-property-not-all 30 39 'face nil result))) + (let* ((command "sed -e 's/o*/a/' -e 's/o*/a/'") + (result (dired--highlight-nosubst-char command "*"))) + (should-not (text-property-not-all 1 10 'face nil result)) + (should (equal 'warning (get-text-property 11 'face result))) + (should-not (text-property-not-all 12 23 'face nil result)) + (should (equal 'warning (get-text-property 24 'face result))) + (should-not (text-property-not-all 25 29 'face nil result)))) (provide 'dired-aux-tests) ;; dired-aux-tests.el ends here -- 2.20.1 --=-=-= Content-Type: text/plain Sample screenshot: --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=dired-warning-highlight.png Content-Transfer-Encoding: base64 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 AElFTkSuQmCC --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable I am not sure these patches should be applied as-is. Some things I wonder about: 1. About read--propertize-prompt=E2=80=A6 1. Should the function return a copy of its argument instead of propertizing it directly? 2. Is it properly named? Does it fit in subr.el? I placed it there because I figured other users of read-char in subr.el could use it, e.g. read-char-choice. 2. dired-aux.el already contains some logic to detect isolated characters; I could not think of a way to re-use it, so I added my own functions to find *non*-isolated characters. I added unit tests for these new functions; still, there may be some redundancy there. WDYT? PS1: I am still absolutely open to simply rephrasing the prompt=E2=80=A6 I= just cannot come up with good alternatives. PS2: CC'ing Stefan to follow up on the discussion on emacs-devel. --=-=-=--