emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [patch] Re: regexp repacement, how to present replacement to user?


From: Paul Pogonyshev
Subject: Re: [patch] Re: regexp repacement, how to present replacement to user?
Date: Fri, 2 Nov 2007 22:58:54 +0200
User-agent: KMail/1.7.2

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  <address@hidden>

        * searching.texi (Replacing Match): Describe new
        `match-substitute-replacement' and
        `match-substitute-replacement-no-properties'.

doc/emacs/ChangeLog:
2007-11-02  Paul Pogonyshev  <address@hidden>

        * search.texi (Query Replace): Mention
        `query-replace-show-replacement'.

lisp/ChangeLog:
2007-11-02  Paul Pogonyshev  <address@hidden>

        * 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  <address@hidden>

        * 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
 
address@hidden 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 @address@hidden or @samp{\&} substituted with
+matched groups.  Arguments @var{replacement} and optional
address@hidden, @var{literal}, @var{string} and @var{subexp} have the
+same meaning as for @code{replace-match}.
address@hidden 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
address@hidden@var{n}} unexpanded, customize
address@hidden 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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]