From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Thierry Volpiatto Newsgroups: gmane.emacs.bugs Subject: bug#25482: 26.0.50; Allow setting `query-replace-from-to-separator` to nil Date: Sat, 21 Jan 2017 11:05:59 +0100 Message-ID: <87a8akiv7c.fsf@gmail.com> References: <871svzzcn4.fsf@gmail.com> <83lgu76nuf.fsf@gnu.org> <87vatac0a2.fsf@gmail.com> <83a8am6u6q.fsf@gnu.org> <87y3y6ezge.fsf@gmail.com> <8337gd7udo.fsf@gnu.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1484993237 28977 195.159.176.226 (21 Jan 2017 10:07:17 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 21 Jan 2017 10:07:17 +0000 (UTC) User-Agent: mu4e 0.9.19; emacs 26.0.50.2 Cc: 25482@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Jan 21 11:07:12 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 1cUsZh-0006vg-WB for geb-bug-gnu-emacs@m.gmane.org; Sat, 21 Jan 2017 11:07:10 +0100 Original-Received: from localhost ([::1]:59458 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cUsZm-0002kT-Rt for geb-bug-gnu-emacs@m.gmane.org; Sat, 21 Jan 2017 05:07:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:51952) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cUsZf-0002kL-KM for bug-gnu-emacs@gnu.org; Sat, 21 Jan 2017 05:07:09 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cUsZa-0006Ir-D1 for bug-gnu-emacs@gnu.org; Sat, 21 Jan 2017 05:07:07 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:38678) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cUsZa-0006Il-8j for bug-gnu-emacs@gnu.org; Sat, 21 Jan 2017 05:07:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1cUsZZ-0001xd-SK for bug-gnu-emacs@gnu.org; Sat, 21 Jan 2017 05:07:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Thierry Volpiatto Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 21 Jan 2017 10:07:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 25482 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 25482-submit@debbugs.gnu.org id=B25482.14849931767485 (code B ref 25482); Sat, 21 Jan 2017 10:07:01 +0000 Original-Received: (at 25482) by debbugs.gnu.org; 21 Jan 2017 10:06:16 +0000 Original-Received: from localhost ([127.0.0.1]:36877 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cUsYp-0001we-M7 for submit@debbugs.gnu.org; Sat, 21 Jan 2017 05:06:16 -0500 Original-Received: from mail-wm0-f49.google.com ([74.125.82.49]:38025) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cUsYn-0001wR-Nb for 25482@debbugs.gnu.org; Sat, 21 Jan 2017 05:06:14 -0500 Original-Received: by mail-wm0-f49.google.com with SMTP id r144so80526900wme.1 for <25482@debbugs.gnu.org>; Sat, 21 Jan 2017 02:06:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=references:user-agent:from:to:cc:subject:in-reply-to:date :message-id:mime-version:content-transfer-encoding; bh=YfzCpBqZOzgRPgTqfjYvxZ72fpdjBfRZUFMd5kmdWm0=; b=GZexevG4Kq0wioETdN8sjzFavlaEiH1J+irpCbX/XwKZKcBDsuOom4bC9CkeDJUBhq VL75BPgicOBM9iPsKMdovmOJWZA7AmCOM2h3ASD9SJVCYwRBOOvl09nQUFQULAUSw3N+ fFY+nBsV3F0WJOyLuxXzBGEKQ+Pt/ge0w/GvccJuuOvWAXdKc7mu1sP3mqniCjMZdObe mFrf1NTt2itcRWI3kMv0/Zecl+pCMc1wvDAf0+Sz4MhPBqz8a8zceUSFI0vMFezVBIzh agq3FqG3bSTIAecNbrUv8aryue2NeNa6gWp4KSXaYVQmUQ5Fl99WRnx5JdXIvIdEqfzM stMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:references:user-agent:from:to:cc:subject :in-reply-to:date:message-id:mime-version:content-transfer-encoding; bh=YfzCpBqZOzgRPgTqfjYvxZ72fpdjBfRZUFMd5kmdWm0=; b=TDkkoAP/fWgq42oA4MCC7SaSbV+WqUvJn1rNeYpa9jx2vcLnFzBjZasEj3ud7mLinI 6a4sGsHeRQAGhyCs++sHehXFF68hCrC83MDstMOfeHFIGmA9UUcHrgeqgqKgKBO0+eme fUbGuwW4DLwe5XLJ7z1cbI+CJNvRtv2IoZoQboebC4nLYtf1b7aTffYPRDxQFhAVlKSW vIOL0aAU8dSLRKwDkCPgpxAYjErAEMr+ttYryspYuxELV0kjuGMYBhi8UGZdvbFMgika uEUsZiH4BZjdE4E8n5WNy0cnYQ2rqPWmQ46g3IPhvTEK12RMtE8UZ5vZ2+3NJBfa2e3e FP3Q== X-Gm-Message-State: AIkVDXI/bS9ocFMK0k3fbdDJgHFUFJmR1i+pRup754sqyrimlLUPh/W1yKjhB1sCQENQsA== X-Received: by 10.28.188.213 with SMTP id m204mr6476673wmf.0.1484993167465; Sat, 21 Jan 2017 02:06:07 -0800 (PST) Original-Received: from dell-14z ([37.168.21.33]) by smtp.gmail.com with ESMTPSA id g40sm3700190wrg.19.2017.01.21.02.06.02 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Sat, 21 Jan 2017 02:06:06 -0800 (PST) In-reply-to: <8337gd7udo.fsf@gnu.org> 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:128288 Archived-At: Eli Zaretskii writes: > I'm asking whether the (fixed) behavior, whereby using setq to change > the value to " -> " would add the ASCII string " -> " to the > minibuffer history, would be acceptable. If not, please tell why. Here the patch updated adding the plain string to history when it is an ascii string. 1 file changed, 92 insertions(+), 74 deletions(-) lisp/replace.el | 166 +++++++++++++++++++++++++++++++------------------------- modified lisp/replace.el @@ -79,15 +79,17 @@ That becomes the \"string to replace\".") to the minibuffer that reads the string to replace, or invoke replacements from Isearch by using a key sequence like `C-s C-s M-%'." "24.3") -(defcustom query-replace-from-to-separator - (propertize (if (char-displayable-p ?→) " → " " -> ") - 'face 'minibuffer-prompt) - "String that separates FROM and TO in the history of replacement pairs." - ;; Avoids error when attempt to autoload char-displayable-p fails - ;; while preparing to dump, also stops customize-rogue listing this. - :initialize 'custom-initialize-delay +(defcustom query-replace-from-to-separator " → " + "String that separates FROM and TO in the history of replacement pairs. +When non-nil, the pair (FROM TO) will be added to `query-replace-history' as +a string \"FROMTO\". +When nil the default separator \" -> \" will be used as a plain string +and the pair will not be added to `query-replace-history' +\(Same behavior as in emacs 24.5)." :group 'matching - :type '(choice string (sexp :tag "Display specification")) + :type '(choice + (const :tag "Disabled" nil) + string) :version "25.1") (defcustom query-replace-from-history-variable 'query-replace-history @@ -150,14 +152,20 @@ See `replace-regexp' and `query-replace-regexp-eval'.") (mapconcat 'isearch-text-char-description string "")) (defun query-replace--split-string (string) - "Split string STRING at a character with property `separator'" + "Split string STRING at `query-replace-from-to-separator'. +Split at a character with property `separator' or at place matching regexp +`query-replace-from-to-separator'." (let* ((length (length string)) (split-pos (text-property-any 0 length 'separator t string))) - (if (not split-pos) - (substring-no-properties string) - (cl-assert (not (text-property-any (1+ split-pos) length 'separator t string))) - (cons (substring-no-properties string 0 split-pos) - (substring-no-properties string (1+ split-pos) length))))) + (cond (split-pos + (cl-assert (not (text-property-any + (1+ split-pos) length 'separator t string))) + (cons (substring-no-properties string 0 split-pos) + (substring-no-properties string (1+ split-pos) length))) + ((string-match query-replace-from-to-separator string) + (cons (substring-no-properties string 0 (match-beginning 0)) + (substring-no-properties string (match-end 0) length))) + (t (substring-no-properties string))))) (defun query-replace-read-from (prompt regexp-flag) "Query and return the `from' argument of a query-replace operation. @@ -165,66 +173,76 @@ The return value can also be a pair (FROM . TO) indicating that the user wants to replace FROM with TO." (if query-replace-interactive (car (if regexp-flag regexp-search-ring search-ring)) - ;; Reevaluating will check char-displayable-p that is - ;; unavailable while preparing to dump. - (custom-reevaluate-setting 'query-replace-from-to-separator) - (let* ((history-add-new-input nil) - (separator - (when query-replace-from-to-separator - (propertize "\0" - 'display query-replace-from-to-separator - 'separator t))) - (minibuffer-history - (append - (when separator - (mapcar (lambda (from-to) - (concat (query-replace-descr (car from-to)) - separator - (query-replace-descr (cdr from-to)))) - query-replace-defaults)) - (symbol-value query-replace-from-history-variable))) - (minibuffer-allow-text-properties t) ; separator uses text-properties - (prompt - (if (and query-replace-defaults separator) - (format "%s (default %s): " prompt (car minibuffer-history)) - (format "%s: " prompt))) - (from - ;; The save-excursion here is in case the user marks and copies - ;; a region in order to specify the minibuffer input. - ;; That should not clobber the region for the query-replace itself. - (save-excursion - (minibuffer-with-setup-hook - (lambda () - (setq-local text-property-default-nonsticky - (cons '(separator . t) text-property-default-nonsticky))) - (if regexp-flag - (read-regexp prompt nil 'minibuffer-history) - (read-from-minibuffer - prompt nil nil nil nil - (car (if regexp-flag regexp-search-ring search-ring)) t))))) - (to)) - (if (and (zerop (length from)) query-replace-defaults) - (cons (caar query-replace-defaults) - (query-replace-compile-replacement - (cdar query-replace-defaults) regexp-flag)) - (setq from (query-replace--split-string from)) - (when (consp from) (setq to (cdr from) from (car from))) - (add-to-history query-replace-from-history-variable from nil t) - ;; Warn if user types \n or \t, but don't reject the input. - (and regexp-flag - (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\[nt]\\)" from) - (let ((match (match-string 3 from))) - (cond - ((string= match "\\n") - (message "Note: `\\n' here doesn't match a newline; to do that, type C-q C-j instead")) - ((string= match "\\t") - (message "Note: `\\t' here doesn't match a tab; to do that, just type TAB"))) - (sit-for 2))) - (if (not to) - from - (add-to-history query-replace-to-history-variable to nil t) - (add-to-history 'query-replace-defaults (cons from to) nil t) - (cons from (query-replace-compile-replacement to regexp-flag))))))) + (let ((sep-char (replace-regexp-in-string + " " "" query-replace-from-to-separator))) + (when (stringp query-replace-from-to-separator) + (setq query-replace-from-to-separator + (propertize (if (char-displayable-p (string-to-char sep-char)) + query-replace-from-to-separator + " -> ") + 'face 'minibuffer-prompt))) + (let* ((history-add-new-input nil) + (separator + (if (and query-replace-from-to-separator + (> (string-bytes sep-char) (length sep-char))) + (propertize "\0" + 'display query-replace-from-to-separator + 'separator t) + (propertize query-replace-from-to-separator 'separator t))) + (minibuffer-history + (append + (when separator + (mapcar (lambda (from-to) + (concat (query-replace-descr (car from-to)) + separator + (query-replace-descr (cdr from-to)))) + query-replace-defaults)) + (symbol-value query-replace-from-history-variable))) + (minibuffer-allow-text-properties t) ; separator uses text-properties + (prompt + (cond ((and query-replace-defaults separator) + (format "%s (default %s): " prompt (car minibuffer-history))) + (query-replace-defaults + (format "%s (default %s -> %s): " prompt + (query-replace-descr (caar query-replace-defaults)) + (query-replace-descr (cdar query-replace-defaults)))) + (t (format "%s: " prompt)))) + (from + ;; The save-excursion here is in case the user marks and copies + ;; a region in order to specify the minibuffer input. + ;; That should not clobber the region for the query-replace itself. + (save-excursion + (minibuffer-with-setup-hook + (lambda () + (setq-local text-property-default-nonsticky + (cons '(separator . t) text-property-default-nonsticky))) + (if regexp-flag + (read-regexp prompt nil 'minibuffer-history) + (read-from-minibuffer + prompt nil nil nil nil (car search-ring) t))))) + (to)) + (if (and (zerop (length from)) query-replace-defaults) + (cons (caar query-replace-defaults) + (query-replace-compile-replacement + (cdar query-replace-defaults) regexp-flag)) + (setq from (query-replace--split-string from)) + (when (consp from) (setq to (cdr from) from (car from))) + (add-to-history query-replace-from-history-variable from nil t) + ;; Warn if user types \n or \t, but don't reject the input. + (and regexp-flag + (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\(\\\\[nt]\\)" from) + (let ((match (match-string 3 from))) + (cond + ((string= match "\\n") + (message "Note: `\\n' here doesn't match a newline; to do that, type C-q C-j instead")) + ((string= match "\\t") + (message "Note: `\\t' here doesn't match a tab; to do that, just type TAB"))) + (sit-for 2))) + (if (not to) + from + (add-to-history query-replace-to-history-variable to nil t) + (add-to-history 'query-replace-defaults (cons from to) nil t) + (cons from (query-replace-compile-replacement to regexp-flag)))))))) (defun query-replace-compile-replacement (to regexp-flag) "Maybe convert a regexp replacement TO to Lisp. -- Thierry