From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Paul Pogonyshev Newsgroups: gmane.emacs.devel Subject: Re: [patch] Re: regexp repacement, how to present replacement to user? Date: Fri, 2 Nov 2007 22:58:54 +0200 Message-ID: <200711022258.55262.pogonyshev@gmx.net> References: <200710131700.42100.pogonyshev@gmx.net> <200710312339.07601.pogonyshev@gmx.net> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1194035947 21945 80.91.229.12 (2 Nov 2007 20:39:07 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 2 Nov 2007 20:39:07 +0000 (UTC) Cc: juri@jurta.org To: emacs-devel@gnu.org, rms@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Nov 02 21:39:10 2007 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1Io3IK-0003fy-Af for ged-emacs-devel@m.gmane.org; Fri, 02 Nov 2007 21:39:08 +0100 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Io3IA-0007ZK-5x for ged-emacs-devel@m.gmane.org; Fri, 02 Nov 2007 16:38:58 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Io3I5-0007YJ-P7 for emacs-devel@gnu.org; Fri, 02 Nov 2007 16:38:53 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Io3I5-0007Y4-2e for emacs-devel@gnu.org; Fri, 02 Nov 2007 16:38:53 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Io3I4-0007Xy-TA for emacs-devel@gnu.org; Fri, 02 Nov 2007 16:38:52 -0400 Original-Received: from mail.gmx.net ([213.165.64.20]) by monty-python.gnu.org with smtp (Exim 4.60) (envelope-from ) id 1Io3I4-0005t4-5i for emacs-devel@gnu.org; Fri, 02 Nov 2007 16:38:52 -0400 Original-Received: (qmail invoked by alias); 02 Nov 2007 20:38:50 -0000 Original-Received: from unknown (EHLO [80.94.230.113]) [80.94.230.113] by mail.gmx.net (mp030) with SMTP; 02 Nov 2007 21:38:50 +0100 X-Authenticated: #16844820 X-Provags-ID: V01U2FsdGVkX183z0AHAWw3vxctatYI5YZ6G8nK0apjR/9F4Pxa/7 athEOs9KzA2X3X User-Agent: KMail/1.7.2 In-Reply-To: Content-Disposition: inline X-Y-GMX-Trusted: 0 X-detected-kernel: by monty-python.gnu.org: Linux 2.6, seldom 2.4 (older, 4) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:82369 Archived-At: Richard Stallman wrote: > * replace.el (query-replace-substitute-replacement): New > defcustom. > > That name is rather long, so please call it > `query-replace-show-replacement'. (That is also a clearer > description of what the feature does.) > > Other than that, it looks good to me. But please write the > changes for NEWS and the manuals before installing this. Here is a patch. I don't have CVS write access, so I'd be grateful if someone installs this. Paul /etc/NEWS: ** C-M-% now shows replacement as it would look in the buffer, with `\N' and `\&' substituted according to the match. Old behavior can be restored by customizing `query-replace-show-replacement'. ** New function `match-substitute-replacement' returns the result of `replace-match' without actually using it in the buffer. doc/lispref/ChangeLog: 2007-11-02 Paul Pogonyshev * searching.texi (Replacing Match): Describe new `match-substitute-replacement' and `match-substitute-replacement-no-properties'. doc/emacs/ChangeLog: 2007-11-02 Paul Pogonyshev * search.texi (Query Replace): Mention `query-replace-show-replacement'. lisp/ChangeLog: 2007-11-02 Paul Pogonyshev * replace.el (query-replace-show-replacement): New defcustom. (perform-replace): Use `match-substitute-replacement' if `query-replace-show-replacement' is non-nil. 2007-11-02 David Kastrup * subr.el (match-substitute-replacement): New functions. Index: doc/lispref/searching.texi =================================================================== RCS file: /cvsroot/emacs/emacs/doc/lispref/searching.texi,v retrieving revision 1.2 diff -u -r1.2 searching.texi --- doc/lispref/searching.texi 6 Sep 2007 04:27:40 -0000 1.2 +++ doc/lispref/searching.texi 2 Nov 2007 20:32:36 -0000 @@ -1260,6 +1260,16 @@ just the text that matched @samp{\(ba*r\)}. @end defun +@defun match-substitute-replacement replacement &optional fixedcase literal string subexp +This function returns the text that would be inserted into the buffer +by @code{replace-match}, but without modifying the buffer. It is +useful if you want to present the user with actual replacement result, +with constructs like @samp{\@var{n}} or @samp{\&} substituted with +matched groups. Arguments @var{replacement} and optional +@var{fixedcase}, @var{literal}, @var{string} and @var{subexp} have the +same meaning as for @code{replace-match}. +@end defun + @node Simple Match Data @subsection Simple Match Data Access Index: doc/emacs/search.texi =================================================================== RCS file: /cvsroot/emacs/emacs/doc/emacs/search.texi,v retrieving revision 1.1 diff -u -r1.1 search.texi --- doc/emacs/search.texi 6 Sep 2007 04:48:32 -0000 1.1 +++ doc/emacs/search.texi 2 Nov 2007 20:32:36 -0000 @@ -1172,7 +1172,11 @@ These commands highlight the current match using the face @code{query-replace}. They highlight other matches using @code{lazy-highlight} just like incremental search (@pxref{Incremental -Search}). +Search}). By default, @code{query-replace-regexp} will show +substituted replacement string for the current match in the +minibuffer. If you want to keep special sequences @samp{\&} and +@samp{\@var{n}} unexpanded, customize +@code{query-replace-show-replacement} variable. The characters you can type when you are shown a match for the string or regexp are: Index: lisp/replace.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/replace.el,v retrieving revision 1.259 diff -u -r1.259 replace.el --- lisp/replace.el 26 Jul 2007 05:26:32 -0000 1.259 +++ lisp/replace.el 2 Nov 2007 20:32:36 -0000 @@ -69,6 +69,12 @@ :group 'matching :version "22.1") +(defcustom query-replace-show-replacement t + "*Non-nil means to show what actual replacement text will be." + :type 'boolean + :group 'matching + :version "23.1") + (defcustom query-replace-highlight t "*Non-nil means to highlight matches during query replacement." :type 'boolean @@ -1570,10 +1576,17 @@ (or delimited-flag regexp-flag) case-fold-search) ;; Bind message-log-max so we don't fill up the message log ;; with a bunch of identical messages. - (let ((message-log-max nil)) + (let ((message-log-max nil) + (replacement-presentation + (if query-replace-show-replacement + (save-match-data + (set-match-data real-match-data) + (match-substitute-replacement next-replacement + nocasify literal)) + next-replacement))) (message message (query-replace-descr from-string) - (query-replace-descr next-replacement))) + (query-replace-descr replacement-presentation))) (setq key (read-event)) ;; Necessary in case something happens during read-event ;; that clobbers the match data. Index: lisp/subr.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/subr.el,v retrieving revision 1.565 diff -u -r1.565 subr.el --- lisp/subr.el 27 Oct 2007 09:07:15 -0000 1.565 +++ lisp/subr.el 2 Nov 2007 20:32:39 -0000 @@ -2709,6 +2709,24 @@ (buffer-substring-no-properties (match-beginning num) (match-end num))))) + +(defun match-substitute-replacement (replacement + &optional fixedcase literal string subexp) + "Return REPLACEMENT as it will be inserted by `replace-match'. +In other words, all back-references in the form `\\&' and `\\N' +are substituted with actual strings matched by the last search. +Optional FIXEDCASE, LITERAL, STRING and SUBEXP have the same +meaning as for `replace-match'." + (let ((match (match-string 0 string))) + (save-match-data + (set-match-data (mapcar (lambda (x) + (if (numberp x) + (- x (match-beginning 0)) + x)) + (match-data t))) + (replace-match replacement fixedcase literal match subexp)))) + + (defun looking-back (regexp &optional limit greedy) "Return non-nil if text before point matches regular expression REGEXP. Like `looking-at' except matches before point, and is slower.