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: Wed, 31 Oct 2007 23:39:07 +0200
User-agent: KMail/1.7.2

Richard Stallman wrote:
>     I agree that a key to toggle between the two modes is not necessary,
>     but we should have an option to turn this feature off for users who
>     like the old behavior.
> 
> I have no objection to that option.

OK, here is a stab at making a patch.  I'm ommiting doc changes, since
this is most likely not going to be final version anyway.

I changed the new function to accept all arguments `replace-match'
does and removed the `-no-properties' variant, as Juri Linkov suggested.

It probably makes sense to make the replacement text in the
`query-regexp-replace' prompt stand out, by using quotes or a text
property.  However, I didn't implement this as current implementation
doesn't.

Paul

2007-10-31  Paul Pogonyshev  <address@hidden>

        * replace.el (query-replace-substitute-replacement): New
        defcustom.
        (perform-replace): Use `match-substitute-replacement' if
        `query-replace-substitute-replacement' is non-nil.

2007-10-31  David Kastrup  <address@hidden>

        * subr.el (match-substitute-replacement): New functions.


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     31 Oct 2007 21:17:37 -0000
@@ -69,6 +69,12 @@
   :group 'matching
   :version "22.1")
 
+(defcustom query-replace-substitute-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-substitute-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        31 Oct 2007 21:17:37 -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]