unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* query-replace-regexp: Can't use \0 in TO-STRING
@ 2017-05-06  0:48 zhanghj
  2017-05-06  5:04 ` Tino Calancha
  0 siblings, 1 reply; 11+ messages in thread
From: zhanghj @ 2017-05-06  0:48 UTC (permalink / raw)
  To: emacs-devel

The doc says:
In TO-STRING, ‘\&’ or ‘\0’ stands for whatever matched the whole of
REGEXP, and ‘\N’ (where N is a digit) stands for whatever matched
the Nth ‘\(...\)’ (1-based) in REGEXP.  The ‘\(...\)’ groups are
counted from 1.

But when using \0, emacs gives the following error message: 
match-substitute-replacement: Invalid use of ‘\’ in replacement text

Using \& is OK.



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-06  0:48 query-replace-regexp: Can't use \0 in TO-STRING zhanghj
@ 2017-05-06  5:04 ` Tino Calancha
  2017-05-06  8:09   ` Eli Zaretskii
  2017-05-06 12:28   ` zhanghj
  0 siblings, 2 replies; 11+ messages in thread
From: Tino Calancha @ 2017-05-06  5:04 UTC (permalink / raw)
  To: zhanghj; +Cc: Tino Calancha, Emacs developers

[-- Attachment #1: Type: text/plain, Size: 719 bytes --]



On Sat, 6 May 2017, zhanghj wrote:

> The doc says:
> In TO-STRING, ‘\&’ or ‘\0’ stands for whatever matched the whole of
> REGEXP, and ‘\N’ (where N is a digit) stands for whatever matched
> the Nth ‘\(...\)’ (1-based) in REGEXP.  The ‘\(...\)’ groups are
> counted from 1.
>
> But when using \0, emacs gives the following error message:
> match-substitute-replacement: Invalid use of ‘\’ in replacement text
>
> Using \& is OK.
Thanks.
The docstring for `query-replace-regexp' was updated in commit 38f4b8ea615
to fix Bug#23884.
Apparently, \0 has never referred to the whole match in this command
(\& it does), so we might want to skip \0 from this docstring and the 
manual.

Regards,
Tino

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-06  5:04 ` Tino Calancha
@ 2017-05-06  8:09   ` Eli Zaretskii
  2017-05-06 10:34     ` Tino Calancha
  2017-05-07  3:48     ` zhanghj
  2017-05-06 12:28   ` zhanghj
  1 sibling, 2 replies; 11+ messages in thread
From: Eli Zaretskii @ 2017-05-06  8:09 UTC (permalink / raw)
  To: Tino Calancha; +Cc: tino.calancha, emacs-devel, netjunegg

> From: Tino Calancha <tino.calancha@gmail.com>
> Date: Sat, 6 May 2017 14:04:46 +0900 (JST)
> Cc: Tino Calancha <tino.calancha@gmail.com>,
> 	Emacs developers <emacs-devel@gnu.org>
> 
> The docstring for `query-replace-regexp' was updated in commit 38f4b8ea615
> to fix Bug#23884.
> Apparently, \0 has never referred to the whole match in this command
> (\& it does), so we might want to skip \0 from this docstring and the 
> manual.

I fixed the doc string.  the manual doesn't need fixing, AFAICT, as it
already describes the behavior correctly.

Thanks.



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-06  8:09   ` Eli Zaretskii
@ 2017-05-06 10:34     ` Tino Calancha
  2017-05-07  3:48     ` zhanghj
  1 sibling, 0 replies; 11+ messages in thread
From: Tino Calancha @ 2017-05-06 10:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: netjunegg, emacs-devel, Tino Calancha



On Sat, 6 May 2017, Eli Zaretskii wrote:

>> From: Tino Calancha <tino.calancha@gmail.com>
>> Date: Sat, 6 May 2017 14:04:46 +0900 (JST)
>> Cc: Tino Calancha <tino.calancha@gmail.com>,
>> 	Emacs developers <emacs-devel@gnu.org>
>>
>> The docstring for `query-replace-regexp' was updated in commit 38f4b8ea615
>> to fix Bug#23884.
>> Apparently, \0 has never referred to the whole match in this command
>> (\& it does), so we might want to skip \0 from this docstring and the
>> manual.
>
> I fixed the doc string.  the manual doesn't need fixing, AFAICT, as it
> already describes the behavior correctly.
Amen.
Thanks.



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-06  5:04 ` Tino Calancha
  2017-05-06  8:09   ` Eli Zaretskii
@ 2017-05-06 12:28   ` zhanghj
  2017-05-06 12:39     ` Tino Calancha
  1 sibling, 1 reply; 11+ messages in thread
From: zhanghj @ 2017-05-06 12:28 UTC (permalink / raw)
  To: Tino Calancha; +Cc: netjune, Emacs developers

Tino Calancha <tino.calancha@gmail.com> writes:

> The docstring for `query-replace-regexp' was updated in commit 38f4b8ea615
> to fix Bug#23884.
> Apparently, \0 has never referred to the whole match in this command
> (\& it does), so we might want to skip \0 from this docstring and the 
> manual.
>
> Regards,
> Tino
Why not \0? I think \0 is more intuitive and also used in vim.



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-06 12:28   ` zhanghj
@ 2017-05-06 12:39     ` Tino Calancha
  2017-05-07  3:55       ` zhanghj
  0 siblings, 1 reply; 11+ messages in thread
From: Tino Calancha @ 2017-05-06 12:39 UTC (permalink / raw)
  To: zhanghj; +Cc: netjune, Emacs developers, Tino Calancha



On Sat, 6 May 2017, zhanghj wrote:

> Tino Calancha <tino.calancha@gmail.com> writes:
>
>> The docstring for `query-replace-regexp' was updated in commit 38f4b8ea615
>> to fix Bug#23884.
>> Apparently, \0 has never referred to the whole match in this command
>> (\& it does), so we might want to skip \0 from this docstring and the
>> manual.
>>
>> Regards,
>> Tino
> Why not \0? I think \0 is more intuitive and also used in vim.
I agree is more intuitive, and it works in `replace-match', or instance:
(mapcar
  (lambda (group)
    (let ((str "foo123"))
      (when (string-match "[a-z]+\\([1-9]+\\)" str)
        (replace-match "bar" nil nil str group))))
  (list 0 1))
=> ("bar" "foobar")

Are you willing to write a patch to implement it?



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-06  8:09   ` Eli Zaretskii
  2017-05-06 10:34     ` Tino Calancha
@ 2017-05-07  3:48     ` zhanghj
  2017-05-19  8:13       ` Eli Zaretskii
  1 sibling, 1 reply; 11+ messages in thread
From: zhanghj @ 2017-05-07  3:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: netjune, emacs-devel, Tino Calancha

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Tino Calancha <tino.calancha@gmail.com>
>> Date: Sat, 6 May 2017 14:04:46 +0900 (JST)
>> Cc: Tino Calancha <tino.calancha@gmail.com>,
>> 	Emacs developers <emacs-devel@gnu.org>
>> 
>> The docstring for `query-replace-regexp' was updated in commit 38f4b8ea615
>> to fix Bug#23884.
>> Apparently, \0 has never referred to the whole match in this command
>> (\& it does), so we might want to skip \0 from this docstring and the 
>> manual.
>
> I fixed the doc string.  the manual doesn't need fixing, AFAICT, as it
> already describes the behavior correctly.
>
> Thanks.

Maybe also the doc string of query-replace-regexp-eval?




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-06 12:39     ` Tino Calancha
@ 2017-05-07  3:55       ` zhanghj
  2017-05-07 14:48         ` Eli Zaretskii
  0 siblings, 1 reply; 11+ messages in thread
From: zhanghj @ 2017-05-07  3:55 UTC (permalink / raw)
  To: Tino Calancha; +Cc: netjune, Emacs developers

Tino Calancha <tino.calancha@gmail.com> writes:

>> Why not \0? I think \0 is more intuitive and also used in vim.
> I agree is more intuitive, and it works in `replace-match', or instance:
> (mapcar
>  (lambda (group)
>    (let ((str "foo123"))
>      (when (string-match "[a-z]+\\([1-9]+\\)" str)
>        (replace-match "bar" nil nil str group))))
>  (list 0 1))
> => ("bar" "foobar")
>
> Are you willing to write a patch to implement it?

The following patch works on my machine for regexp replacing. But I
don't known if \0 should be supported in other places such as
sort-regexp-fields, occur.

diff --git a/lisp/subr.el b/lisp/subr.el
index 02e7993..c182128 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -3634,7 +3634,7 @@ match-string-no-properties
 (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'
+In other words, all back-references in the form `\\&', `\\0' 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'."
diff --git a/src/search.c b/src/search.c
index 1223cbf..86255f0 100644
--- a/src/search.c
+++ b/src/search.c
@@ -2339,7 +2339,7 @@ in the replaced text, capitalize each word in NEWTEXT.
 
 If optional third arg LITERAL is non-nil, insert NEWTEXT literally.
 Otherwise treat `\\' as special:
-  `\\&' in NEWTEXT means substitute original matched text.
+  `\\&' or `\\0' in NEWTEXT means substitute original matched text.
   `\\N' means substitute what matched the Nth `\\(...\\)'.
        If Nth parens didn't match, substitute nothing.
   `\\\\' means insert one `\\'.
@@ -2523,7 +2523,7 @@ since only regular expressions have distinguished subexpressions.  */)
 		{
 		  FETCH_STRING_CHAR_ADVANCE (c, newtext, pos, pos_byte);
 
-		  if (c == '&')
+		  if (c == '&' || c == '0')
 		    {
 		      substart = search_regs.start[sub];
 		      subend = search_regs.end[sub];
@@ -2668,7 +2668,7 @@ since only regular expressions have distinguished subexpressions.  */)
 		    MAKE_CHAR_MULTIBYTE (c);
 		}
 
-	      if (c == '&')
+	      if (c == '&' || c == '0')
 		idx = sub;
 	      else if (c >= '1' && c <= '9' && c - '0' < search_regs.num_regs)
 		{



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-07  3:55       ` zhanghj
@ 2017-05-07 14:48         ` Eli Zaretskii
  2017-05-09 22:02           ` Juri Linkov
  0 siblings, 1 reply; 11+ messages in thread
From: Eli Zaretskii @ 2017-05-07 14:48 UTC (permalink / raw)
  To: zhanghj; +Cc: netjune, emacs-devel, tino.calancha

> From: zhanghj <netjunegg@gmail.com>
> Date: Sun, 07 May 2017 11:55:15 +0800
> Cc: netjune@qq.com, Emacs developers <emacs-devel@gnu.org>
> 
> Tino Calancha <tino.calancha@gmail.com> writes:
> 
> >> Why not \0? I think \0 is more intuitive and also used in vim.
> > I agree is more intuitive, and it works in `replace-match', or instance:
> > (mapcar
> >  (lambda (group)
> >    (let ((str "foo123"))
> >      (when (string-match "[a-z]+\\([1-9]+\\)" str)
> >        (replace-match "bar" nil nil str group))))
> >  (list 0 1))
> > => ("bar" "foobar")
> >
> > Are you willing to write a patch to implement it?
> 
> The following patch works on my machine for regexp replacing. But I
> don't known if \0 should be supported in other places such as
> sort-regexp-fields, occur.

If this is accepted (and I'm not sure we should), then the user manual
should also be updated, and NEWS should have an entry about the
change.

Thanks.



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-07 14:48         ` Eli Zaretskii
@ 2017-05-09 22:02           ` Juri Linkov
  0 siblings, 0 replies; 11+ messages in thread
From: Juri Linkov @ 2017-05-09 22:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: netjune, emacs-devel, tino.calancha, zhanghj

>> >> Why not \0? I think \0 is more intuitive and also used in vim.
>> > I agree is more intuitive, and it works in `replace-match', or instance:
>> > (mapcar
>> >  (lambda (group)
>> >    (let ((str "foo123"))
>> >      (when (string-match "[a-z]+\\([1-9]+\\)" str)
>> >        (replace-match "bar" nil nil str group))))
>> >  (list 0 1))
>> > => ("bar" "foobar")
>> >
>> > Are you willing to write a patch to implement it?
>>
>> The following patch works on my machine for regexp replacing. But I
>> don't known if \0 should be supported in other places such as
>> sort-regexp-fields, occur.
>
> If this is accepted (and I'm not sure we should), then the user manual
> should also be updated, and NEWS should have an entry about the
> change.

Some other regexp engines support the \0 format as well:
http://www.regular-expressions.info/refreplacebackref.html
What is important is to clearly differentiate the whole match from
back references in the documentation (i.e. unlike back references
\0 works only in replacements, not matches).



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: query-replace-regexp: Can't use \0 in TO-STRING
  2017-05-07  3:48     ` zhanghj
@ 2017-05-19  8:13       ` Eli Zaretskii
  0 siblings, 0 replies; 11+ messages in thread
From: Eli Zaretskii @ 2017-05-19  8:13 UTC (permalink / raw)
  To: zhanghj; +Cc: netjune, emacs-devel, tino.calancha

> From: zhanghj <netjunegg@gmail.com>
> Cc: Tino Calancha <tino.calancha@gmail.com>,  emacs-devel@gnu.org
> CC: netjune@qq.com
> Date: Sun, 07 May 2017 11:48:11 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > I fixed the doc string.  the manual doesn't need fixing, AFAICT, as it
> > already describes the behavior correctly.
> >
> > Thanks.
> 
> Maybe also the doc string of query-replace-regexp-eval?

Done.



^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-05-19  8:13 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-06  0:48 query-replace-regexp: Can't use \0 in TO-STRING zhanghj
2017-05-06  5:04 ` Tino Calancha
2017-05-06  8:09   ` Eli Zaretskii
2017-05-06 10:34     ` Tino Calancha
2017-05-07  3:48     ` zhanghj
2017-05-19  8:13       ` Eli Zaretskii
2017-05-06 12:28   ` zhanghj
2017-05-06 12:39     ` Tino Calancha
2017-05-07  3:55       ` zhanghj
2017-05-07 14:48         ` Eli Zaretskii
2017-05-09 22:02           ` Juri Linkov

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).