GNU bug report logs - #8161
24.0.50; query-replace-regexp fails with interactive replacement text

Previous Next

Package: emacs;

Reported by: Suvayu Ali <fatkasuvayu+linux <at> gmail.com>

Date: Thu, 3 Mar 2011 09:00:03 UTC

Severity: normal

Found in version 24.0.50

Done: Chong Yidong <cyd <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Lawrence Mitchell <wence <at> gmx.li>
To: bug-gnu-emacs <at> gnu.org
Subject: bug#8161: 24.0.50; query-replace-regexp fails with interactive replacement text
Date: Thu, 03 Mar 2011 16:21:47 +0000
Suvayu Ali wrote:
> Hi Emacs devs,

> I wanted to replace interactively all numbers in the text of an document
> with the number in words, so I tried:

> `C-M-% [0-9]+ RET \? RET'

> But this gives me an error like this:

>> Debugger entered--Lisp error: (error "Invalid use of `\\' in
>> replacement text") replace-match("\\?" nil nil #("1" 0 1 (fontified
>> t)) nil) match-substitute-replacement("\\?" nil nil)
>>   perform-replace("[0-9]+" "\\?" t t nil nil nil nil nil)
>>   query-replace-regexp("[0-9]+" "\\?" nil nil nil)
>>   call-interactively(query-replace-regexp nil nil)

> Since the doc string of `query-replace-regexp' says the following:

This has been broken since

Author: Juri Linkov <juri <at> jurta.org>
Date:   Sat Nov 10 21:48:46 2007 +0000

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

replace-match (used by match-substitute-replacement) doesn't know
about \? and therefore barfs.

This patch just passes \\? unchanged through replace-match.  I'm
not sure if this is a reasonable fix, although minimal testing
suggests it all works correctly.

diff --git a/src/search.c b/src/search.c
index 1e2036f..c9fd71b 100644
--- a/src/search.c
+++ b/src/search.c
@@ -2373,6 +2373,7 @@ Otherwise treat `\\' as special:
   `\\N' means substitute what matched the Nth `\\(...\\)'.
        If Nth parens didn't match, substitute nothing.
   `\\\\' means insert one `\\'.
+  `\\?' (as in `query-replace-regexp') is passed through unchanged.
 Case conversion does not apply to these substitutions.
 
 FIXEDCASE and LITERAL are optional arguments.
@@ -2575,6 +2576,8 @@ since only regular expressions have distinguished subexpressions.  */)
 		    }
 		  else if (c == '\\')
 		    delbackslash = 1;
+                  else if (c == '?')
+                      ;         /* do nothing (dealt with at lisp level) */
 		  else
 		    error ("Invalid use of `\\' in replacement text");
 		}

Lawrence
-- 
Lawrence Mitchell <wence <at> gmx.li>





This bug report was last modified 12 years and 295 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.