GNU bug report logs - #36496
[PATCH] Describe the rx notation in the lisp manual

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Severity: wishlist; Reported by: Mattias Engdegård <mattiase@HIDDEN>; merged with #31698; dated Thu, 4 Jul 2019 12:14:01 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.
Removed tag(s) patch. Request was from Noam Postavsky <npostavs@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 9 Jul 2019 00:19:50 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Jul 08 20:19:50 2019
Received: from localhost ([127.0.0.1]:60017 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hkdrJ-0000fy-QP
	for submit <at> debbugs.gnu.org; Mon, 08 Jul 2019 20:19:50 -0400
Received: from userp2130.oracle.com ([156.151.31.86]:42474)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <drew.adams@HIDDEN>) id 1hkdrH-0000fl-Df
 for 36496 <at> debbugs.gnu.org; Mon, 08 Jul 2019 20:19:48 -0400
Received: from pps.filterd (userp2130.oracle.com [127.0.0.1])
 by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x690JAXV075034;
 Tue, 9 Jul 2019 00:19:35 GMT
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com;
 h=mime-version :
 message-id : date : from : sender : to : cc : subject : references :
 in-reply-to : content-type : content-transfer-encoding; s=corp-2018-07-02;
 bh=rBmRFgcEwgoVC29r3usw1ZJksNNKrWoYCZhO1xlT+eQ=;
 b=Tir83BjY/8UPAZhdOwdy0PfpNI0PXuLZr9kVvq3/tDQyQ5gj2u5kU5bln15oTbWr7bd6
 HrBylhQQHb2Jg/o0Lk5uemjRQ+6+PTeRWx7jlrU9AeZe6ampqCs2GA1xv8mUd8RbqF7w
 SrUwAYfwiKUYoDk/8MwtbCHoTMPqINKutK4672mrY+ORyPg4vFmXb2sijLuJbWG62Qlt
 LfXFVLtfAFacMgNccbSUBox6QggDCBSBBUOqrMFz5Ivw7eG++Hns2Z7eizAvuVZ8+NPH
 CZmCWdHGfYYVVLRes2YvHwY+s3Nx3El6zLjTtopMyhLQ/t3AYnOGLPFtkkfT+U8riuH5 Tg== 
Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80])
 by userp2130.oracle.com with ESMTP id 2tjk2th9ak-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);
 Tue, 09 Jul 2019 00:19:35 +0000
Received: from pps.filterd (userp3030.oracle.com [127.0.0.1])
 by userp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x690ICo3060010;
 Tue, 9 Jul 2019 00:19:35 GMT
Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75])
 by userp3030.oracle.com with ESMTP id 2tjgrtskj9-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);
 Tue, 09 Jul 2019 00:19:35 +0000
Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9])
 by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id x690JXAN029427;
 Tue, 9 Jul 2019 00:19:33 GMT
MIME-Version: 1.0
Message-ID: <bfe627a2-e15c-4a48-af50-abe60d8f3fe6@default>
Date: Mon, 8 Jul 2019 17:19:32 -0700 (PDT)
From: Drew Adams <drew.adams@HIDDEN>
To: rms@HIDDEN
Subject: RE: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <E1hjYHa-0005qu-Ox@HIDDEN>
 <83a7draccd.fsf@HIDDEN> <E1hjuap-0001MR-Qx@HIDDEN>
 <0458803b-c701-4706-9843-174b7373cf23@default>
 <E1hkGwG-0005Ic-6y@HIDDEN>
 <2a29fbfb-7e94-4022-bbde-42d8b9f90fc8@default>
 <E1hkdLB-0007Bx-2K@HIDDEN>
In-Reply-To: <E1hkdLB-0007Bx-2K@HIDDEN>
X-Priority: 3
X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.9.1  (1003210) [OL
 16.0.4861.0 (x86)]
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9312
 signatures=668688
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=1
 malwarescore=0
 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999
 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1
 engine=8.0.1-1810050000 definitions=main-1907090002
X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9312
 signatures=668688
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0
 priorityscore=1501 malwarescore=0
 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015
 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0
 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000
 definitions=main-1907090002
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: mattiase@HIDDEN, eliz@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

>   > Do you mean they'd accept a quoted `rx' form (list)?
>   > What would a use case be - as opposed to accepting
>   > the result of macro-expanding such a form?  Assuming
>   > there's good use case, maybe so.
>=20
> Quoting is a little more brief than writing (rx ...).

Sorry, but I don't really understand.  I know little
about `rx'.

>   > [But there may be some functions that already have a
>   > (different) interpretation of a list value for the
>   > same arg that could alternatively be a regexp string.
>   > (So maybe not "all" such functions.)]
>=20
> Are there any?  If so, it would be desirable to change them.

I was responding to this from you:

  WHat would people think of making all the functions that want a regexp
  accept an rx input equivalently?  If the arg is not a string, treat it
  as rx format.  Compilation could convert a constant non-string, for
  such args, to a regexp string.

I see now that you said "an rx input", so presumably
not just a list as arg but a list with car `rx'.  I
was thinking you meant just a list.  I'd bet there
are some functions that accept an arg that can be a
(nonempty) list or a string, and maybe even a regexp
string.  If there are then some minor adjustment
could be called for; that's all.

>   > Even assuming such a use case, should the compiler
>   > assume that _every_ such list arg should be compiled
>   > to a regexp string?
>=20
> Why not?  Is there any case in which it would be better
> to translate the rx to a regexp at run time?

I think I misunderstood you, and might still.
Still, there's a difference between passing
(quote SOME-MACRO-SEXP) as arg and passing
SOME-MACRO-SEXP.  We have `quote' for a reason.

If you want macro-expansion at compile time
why wouldn't you just pass (rx...) as the arg,
instead of (quote (rx...))?

But you know all this better than I, so no doubt
I'm just missing your point - in which case feel
free to ignore.

>   > > The only problem is, which key would it be?
>=20
>   > Some non-repeatable key.  Some key that can't be
>   > used (by default) to edit minibuffer text.  Maybe
>   > something like `C-x x'?
>=20
> Is there any reasonable one-character key?

There are lots of 1-char keys that are not defined
in a minibuffer keymap by default.  And perhaps
even some that are defined there by default but
that aren't useful for reading a regexp (so could
be co-opted when reading regexp input, if needed).

As just one example, `M-R' is not defined (`M-r'
is).  `M-R' is `move-to-window-line-top-bottom',
which isn't so useful in a minibuffer window.

(It is a repeatable key, BTW, and its global
binding is a repeatable command.  But that command
isn't very useful in the minibuffer.)




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 8 Jul 2019 23:46:49 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Jul 08 19:46:49 2019
Received: from localhost ([127.0.0.1]:59985 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hkdLM-0007lU-Ja
	for submit <at> debbugs.gnu.org; Mon, 08 Jul 2019 19:46:49 -0400
Received: from eggs.gnu.org ([209.51.188.92]:56112)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rms@HIDDEN>) id 1hkdLK-0007fS-Rx
 for 36496 <at> debbugs.gnu.org; Mon, 08 Jul 2019 19:46:47 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:39695)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <rms@HIDDEN>)
 id 1hkdLF-0005cb-Ki; Mon, 08 Jul 2019 19:46:41 -0400
Received: from rms by fencepost.gnu.org with local (Exim 4.82)
 (envelope-from <rms@HIDDEN>)
 id 1hkdLB-0007Bx-2K; Mon, 08 Jul 2019 19:46:37 -0400
Content-Type: text/plain; charset=Utf-8
From: Richard Stallman <rms@HIDDEN>
To: Drew Adams <drew.adams@HIDDEN>
In-Reply-To: <2a29fbfb-7e94-4022-bbde-42d8b9f90fc8@default> (message from Drew
 Adams on Sun, 7 Jul 2019 17:56:31 -0700 (PDT))
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <E1hjYHa-0005qu-Ox@HIDDEN>
 <83a7draccd.fsf@HIDDEN> <E1hjuap-0001MR-Qx@HIDDEN>
 <0458803b-c701-4706-9843-174b7373cf23@default>
 <E1hkGwG-0005Ic-6y@HIDDEN>
 <2a29fbfb-7e94-4022-bbde-42d8b9f90fc8@default>
Message-Id: <E1hkdLB-0007Bx-2K@HIDDEN>
Date: Mon, 08 Jul 2019 19:46:37 -0400
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: mattiase@HIDDEN, eliz@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Reply-To: rms@HIDDEN
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Do you mean they'd accept a quoted `rx' form (list)?
  > What would a use case be - as opposed to accepting
  > the result of macro-expanding such a form?  Assuming
  > there's good use case, maybe so. 

Quoting is a little more brief than writing (rx ...).

  > [But there may be some functions that already have a
  > (different) interpretation of a list value for the
  > same arg that could alternatively be a regexp string.
  > (So maybe not "all" such functions.)]

Are there any?  If so, it would be desirable to change them.

  > Even assuming such a use case, should the compiler
  > assume that _every_ such list arg should be compiled
  > to a regexp string?

Why not?  Is there any case in which it would be better
to translate the rx to a regexp at run time?

  > > The only problem is, which key would it be?

  > Some non-repeatable key.  Some key that can't be
  > used (by default) to edit minibuffer text.  Maybe
  > something like `C-x x'?

Is there any reasonable one-character key?

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)






Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 8 Jul 2019 23:44:30 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Jul 08 19:44:30 2019
Received: from localhost ([127.0.0.1]:59981 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hkdJ8-00067N-4B
	for submit <at> debbugs.gnu.org; Mon, 08 Jul 2019 19:44:30 -0400
Received: from eggs.gnu.org ([209.51.188.92]:55225)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rms@HIDDEN>) id 1hkdJ5-000677-Tn
 for 36496 <at> debbugs.gnu.org; Mon, 08 Jul 2019 19:44:28 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:39598)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <rms@HIDDEN>)
 id 1hkdIr-0003Pw-KL; Mon, 08 Jul 2019 19:44:16 -0400
Received: from rms by fencepost.gnu.org with local (Exim 4.82)
 (envelope-from <rms@HIDDEN>)
 id 1hkdIk-0006iT-At; Mon, 08 Jul 2019 19:44:06 -0400
Content-Type: text/plain; charset=Utf-8
From: Richard Stallman <rms@HIDDEN>
to: drew.adams@HIDDEN, mattiase@HIDDEN, 36496 <at> debbugs.gnu.org
In-Reply-To: <E1hkGwG-0005Ic-6y@HIDDEN> (message from Richard
 Stallman on Sun, 07 Jul 2019 19:51:24 -0400)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <E1hjYHa-0005qu-Ox@HIDDEN>
 <83a7draccd.fsf@HIDDEN> <E1hjuap-0001MR-Qx@HIDDEN>
 <0458803b-c701-4706-9843-174b7373cf23@default>
 <E1hkGwG-0005Ic-6y@HIDDEN>
Message-Id: <E1hkdIk-0006iT-At@HIDDEN>
Date: Mon, 08 Jul 2019 19:44:06 -0400
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: rms@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Reply-To: rms@HIDDEN
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

Can a regexp string be used as a part of an rx pattern?
For instance, can you do this?

  (or "foo+" "bar+")

If not, that might be good to add, so people can get the benefits of
both formats.  You could use the simple regexp constructs that are
easy to read, and use rx instead of the uglier complex regexp
constructs.


-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)






Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 8 Jul 2019 00:56:56 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Jul 07 20:56:56 2019
Received: from localhost ([127.0.0.1]:57599 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hkHxg-0007DC-3Z
	for submit <at> debbugs.gnu.org; Sun, 07 Jul 2019 20:56:56 -0400
Received: from userp2130.oracle.com ([156.151.31.86]:46056)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <drew.adams@HIDDEN>) id 1hkHxd-0007Cy-Ve
 for 36496 <at> debbugs.gnu.org; Sun, 07 Jul 2019 20:56:54 -0400
Received: from pps.filterd (userp2130.oracle.com [127.0.0.1])
 by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x680s5fY171200;
 Mon, 8 Jul 2019 00:56:33 GMT
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com;
 h=mime-version :
 message-id : date : from : sender : to : cc : subject : references :
 in-reply-to : content-type : content-transfer-encoding; s=corp-2018-07-02;
 bh=qhrJqnnxIlNOkAiWVNPJJ28lEHPRFGaDh73xip3ggl0=;
 b=mDKeTeoyuUeKKgT2FFZIrjQmBT7263bEM2v3Q6HUXkmDWcnDkFgb/Rq3mOnXBYUNNNo8
 R1GQck5Q9UrNFTL3+YIKAqqL1+52rDmDMGTOQNeSoaqr/A+/BjdhHCeHxKdrdmyY6Git
 L4sDYrrqsmeT0B4F3Irsxbok7izvS0zzjzE8+XvgypAXnujcTLddNy2XST8F3CHwE9Tx
 cO4uyyLhXWryvJfm/yNwD8HE7HlTimOPYS+Q7+aKHrxf0PgAI2A7bOe3bmyJcjlHK9BC
 blt8D9Sa+jSKgPH+NgYnteR9XnufwxeUVepNYcJaUePdsvDnxNp6tSDcyJl9Ym0FghAM 3A== 
Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71])
 by userp2130.oracle.com with ESMTP id 2tjk2tbjk8-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);
 Mon, 08 Jul 2019 00:56:33 +0000
Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1])
 by aserp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x680rHZo169662;
 Mon, 8 Jul 2019 00:56:32 GMT
Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236])
 by aserp3030.oracle.com with ESMTP id 2tjhpc89bg-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);
 Mon, 08 Jul 2019 00:56:32 +0000
Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26])
 by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id x680uVYc025568;
 Mon, 8 Jul 2019 00:56:32 GMT
MIME-Version: 1.0
Message-ID: <2a29fbfb-7e94-4022-bbde-42d8b9f90fc8@default>
Date: Sun, 7 Jul 2019 17:56:31 -0700 (PDT)
From: Drew Adams <drew.adams@HIDDEN>
To: rms@HIDDEN
Subject: RE: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <E1hjYHa-0005qu-Ox@HIDDEN>
 <83a7draccd.fsf@HIDDEN> <E1hjuap-0001MR-Qx@HIDDEN>
 <0458803b-c701-4706-9843-174b7373cf23@default>
 <E1hkGwG-0005Ic-6y@HIDDEN>
In-Reply-To: <E1hkGwG-0005Ic-6y@HIDDEN>
X-Priority: 3
X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.9.1  (1003210) [OL
 16.0.4861.0 (x86)]
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9311
 signatures=668688
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=1
 malwarescore=0
 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999
 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1
 engine=8.0.1-1810050000 definitions=main-1907080010
X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9311
 signatures=668688
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0
 priorityscore=1501 malwarescore=0
 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015
 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0
 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000
 definitions=main-1907080010
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: mattiase@HIDDEN, eliz@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

>   > would be great if you could invoke a command on a
>   > regexp (e.g. a regexp string in code) and have an
>   > equivalent `rx' expression pop up, for inspection
>   > and understanding.
>=20
> I agree.  That would make rx much more convenient for people who like
> the shortness of some regexps.

It would also help someone understand a complex regexp.

It could also help someone learn about regexps by, in
effect analyzing them (on demand).

It would also be good to be able to select _part_ of a
complex regexp - a part that is itself a valid regexp,
and use such an inspection command on just that part,
to show what `rx' it corresponds to.  IOW, select some
text, not necessarily a string, and (if its a valid
regexp) get its `rx' form.

> It could be part of Lisp mode, so you
> could use this on a regexp constant in a source file.
>=20
> I suspect that the long-windedness of rx input is a substantial
> deterrent to its use.  It may be better for complex patterns but worse
> for simple ones.
>=20
>   > It would be nice to be able to have only the result
>   > of `rx' in the code and be able to get its `rx'
>   > expression on demand.
>=20
> I think it would be clearer, usually, for Lisp source to have the rx
> form.  That would help people get used to rx.  For complex patterns,
> the rx form is easier to understand and change.
>=20
> WHat would people think of making all the functions that want a regexp
> accept an rx input equivalently?  If the arg is not a string, treat it
> as rx format.

Do you mean they'd accept a quoted `rx' form (list)?
What would a use case be - as opposed to accepting
the result of macro-expanding such a form?  Assuming
there's good use case, maybe so.=20

[But there may be some functions that already have a
(different) interpretation of a list value for the
same arg that could alternatively be a regexp string.
(So maybe not "all" such functions.)]

> Compilation could convert a constant non-string, for
> such args, to a regexp string.

Same question as above, about the use case for a
quoted `rx'-form arg (versus macro-expanding it to
provide a regexp string arg).

Even assuming such a use case, should the compiler
assume that _every_ such list arg should be compiled
to a regexp string?

And wouldn't such compile-time conversion just
amount to macro-expanding it?  I guess I might be
missing your point/suggestion.

> Commands that read a regexp using the minibuffer could offer a key to
> say that you are entering rx format.

Sounds good to me.

> The only problem is, which key would it be?

Some non-repeatable key.  Some key that can't be
used (by default) to edit minibuffer text.  Maybe
something like `C-x x'?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 23:51:33 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Jul 07 19:51:33 2019
Received: from localhost ([127.0.0.1]:57570 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hkGwP-0005jc-5S
	for submit <at> debbugs.gnu.org; Sun, 07 Jul 2019 19:51:33 -0400
Received: from eggs.gnu.org ([209.51.188.92]:59042)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rms@HIDDEN>) id 1hkGwN-0005jP-2Y
 for 36496 <at> debbugs.gnu.org; Sun, 07 Jul 2019 19:51:31 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:47234)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <rms@HIDDEN>)
 id 1hkGwH-0003Z3-F7; Sun, 07 Jul 2019 19:51:25 -0400
Received: from rms by fencepost.gnu.org with local (Exim 4.82)
 (envelope-from <rms@HIDDEN>)
 id 1hkGwG-0005Ic-6y; Sun, 07 Jul 2019 19:51:24 -0400
Content-Type: text/plain; charset=Utf-8
From: Richard Stallman <rms@HIDDEN>
To: Drew Adams <drew.adams@HIDDEN>
In-Reply-To: <0458803b-c701-4706-9843-174b7373cf23@default> (message from Drew
 Adams on Sun, 7 Jul 2019 00:36:24 +0000 (UTC))
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <E1hjYHa-0005qu-Ox@HIDDEN>
 <83a7draccd.fsf@HIDDEN> <E1hjuap-0001MR-Qx@HIDDEN>
 <0458803b-c701-4706-9843-174b7373cf23@default>
Message-Id: <E1hkGwG-0005Ic-6y@HIDDEN>
Date: Sun, 07 Jul 2019 19:51:24 -0400
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: mattiase@HIDDEN, eliz@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Reply-To: rms@HIDDEN
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > would be great if you could invoke a command on a
  > regexp (e.g. a regexp string in code) and have an
  > equivalent `rx' expression pop up, for inspection
  > and understanding.

I agree.  That would make rx much more convenient for people who like
the shortness of some regexps.  It could be part of Lisp mode, so you
could use this on a regexp constant in a source file.

I suspect that the long-windedness of rx input is a substantial
deterrent to its use.  It may be better for complex patterns but worse
for simple ones.

  > It would be nice to be able to have only the result
  > of `rx' in the code and be able to get its `rx'
  > expression on demand.

I think it would be clearer, usually, for Lisp source to have the rx
form.  That would help people get used to rx.  For complex patterns,
the rx form is easier to understand and change.

WHat would people think of making all the functions that want a regexp
accept an rx input equivalently?  If the arg is not a string, treat it
as rx format.  Compilation could convert a constant non-string, for
such args, to a regexp string.

Commands that read a regexp using the minibuffer could offer a key to
say that you are entering rx format.  The only problem is, which key
would it be?

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)






Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 14:33:41 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Jul 07 10:33:41 2019
Received: from localhost ([127.0.0.1]:57277 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hk8EX-0008RL-Er
	for submit <at> debbugs.gnu.org; Sun, 07 Jul 2019 10:33:41 -0400
Received: from eggs.gnu.org ([209.51.188.92]:37358)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1hk8EV-0008R5-2o
 for 36496 <at> debbugs.gnu.org; Sun, 07 Jul 2019 10:33:39 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:41798)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <eliz@HIDDEN>)
 id 1hk8EP-0003oX-F9; Sun, 07 Jul 2019 10:33:33 -0400
Received: from [176.228.60.248] (port=3629 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1hk8EH-0007il-Op; Sun, 07 Jul 2019 10:33:26 -0400
Date: Sun, 07 Jul 2019 17:33:23 +0300
Message-Id: <83wogt7w3w.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
In-reply-to: <D368F6DE-564B-4FB5-88C2-A891CDE0D9B8@HIDDEN> (message from
 Mattias =?utf-8?Q?Engdeg=C3=A5rd?= on Sun, 7 Jul 2019 13:31:06 +0200)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
 <83k1cv8k5z.fsf@HIDDEN> <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN>
 <83zhlr6ksx.fsf@HIDDEN> <E013164D-DB9D-4DCD-8CAA-3FB5E075E9B9@HIDDEN>
 <83y31a7f27.fsf@HIDDEN> <D368F6DE-564B-4FB5-88C2-A891CDE0D9B8@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: npostavs@HIDDEN, rms@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Mattias Engdegård <mattiase@HIDDEN>
> Date: Sun, 7 Jul 2019 13:31:06 +0200
> Cc: Noam Postavsky <npostavs@HIDDEN>, 36496 <at> debbugs.gnu.org,
>         Richard Stallman <rms@HIDDEN>
> 
> Should this bug be kept open for possible improvements to the print manual, or can we regard that as a separate issue?

It doesn't really matter, IMO.  I'd say leave this bug open, as
opening another doesn't seem to be worth the hassle.

Thanks.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 11:31:13 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Jul 07 07:31:13 2019
Received: from localhost ([127.0.0.1]:56206 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hk5Nx-0006uo-8m
	for submit <at> debbugs.gnu.org; Sun, 07 Jul 2019 07:31:13 -0400
Received: from mail200c50.megamailservers.eu ([91.136.10.210]:40648
 helo=mail193c50.megamailservers.eu)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <mattiase@HIDDEN>) id 1hk5Nu-0006qz-KZ
 for 36496 <at> debbugs.gnu.org; Sun, 07 Jul 2019 07:31:11 -0400
X-Authenticated-User: mattiase@HIDDEN
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu;
 s=maildub; t=1562499068;
 bh=sN869RvdiTIood+hApdij6VbsBiSu/zjmGHed82LhBk=;
 h=Subject:From:In-Reply-To:Date:Cc:References:To:From;
 b=S6igiTg7dZBg8bg1LcUfNSYZAuoGWZ5mj1JnudvzNWrbHo41vtQQY0PotwF0ur8WH
 gRn5F8N/vttmv0P4EGHgZpGHrFecquYFRNWiREXq4aOTeM1ww2m/zBqNjrarECbDib
 ktvkaJKlMWNhlUG+/eOE7iRK32ttvvj9FgAYlJDA=
Feedback-ID: mattiase@HIDDEN
Received: from [192.168.0.4] ([188.150.171.71]) (authenticated bits=0)
 by mail193c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x67BV6QD004526; 
 Sun, 7 Jul 2019 11:31:08 +0000
Content-Type: text/plain;
	charset=us-ascii
Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\))
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= <mattiase@HIDDEN>
In-Reply-To: <83y31a7f27.fsf@HIDDEN>
Date: Sun, 7 Jul 2019 13:31:06 +0200
Content-Transfer-Encoding: quoted-printable
Message-Id: <D368F6DE-564B-4FB5-88C2-A891CDE0D9B8@HIDDEN>
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
 <83k1cv8k5z.fsf@HIDDEN> <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN>
 <83zhlr6ksx.fsf@HIDDEN> <E013164D-DB9D-4DCD-8CAA-3FB5E075E9B9@HIDDEN>
 <83y31a7f27.fsf@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
X-Mailer: Apple Mail (2.3445.104.11)
X-CTCH-RefID: str=0001.0A0B020E.5D21D7FC.0049, ss=1, re=0.000, recu=0.000,
 reip=0.000, cl=1, cld=1, fgs=0
X-CTCH-VOD: Unknown
X-CTCH-Spam: Unknown
X-CTCH-Score: 0.000
X-CTCH-Rules: 
X-CTCH-Flags: 0
X-CTCH-ScoreCust: 0.000
X-CSC: 0
X-CHA: v=2.3 cv=KsZjJ1eN c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117
 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19
 a=kj9zAlcOel0A:10 a=mDV3o1hIAAAA:8 a=N0D_jAryGqMWON5PpPIA:9
 a=CjuIK1q_8ugA:10 a=_FVE-zBwftR9WsbkzFJk:22
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 36496
Cc: Noam Postavsky <npostavs@HIDDEN>, Richard Stallman <rms@HIDDEN>,
 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.0 (/)

7 juli 2019 kl. 04.29 skrev Eli Zaretskii <eliz@HIDDEN>:

> Thanks, LGTM.

Thanks for reviewing! Pushed to master.

7 juli 2019 kl. 01.56 skrev Richard Stallman <rms@HIDDEN>:

> Would it be feasible to format it differently so that it comes out as
> fewer pages?  That might be possible by using Texinfo a different way.

One way, already mentioned, would be to merge the character class =
descriptions for rx and string regexps. That would save about one page, =
at the cost of making the list slightly messier since rx has synonyms =
for each item which are not legal in string regexps ([:digit:] vs =
`digit', `numeric' and `num').

Eliding the categories table would save another page, if we accept a =
reference to other formats or the rx doc string.

I see little room beyond that. We could remove the examples, but they =
are short and doing so would make an already dry section even drier.

> Here's another idea: document the two syntaxes in a single table,
> where each item says how to do the job in a regexp
> and how to do it in rx.


Probably not a bad idea and one that would put the syntaxes on equal =
footing, but it involves a complete rewrite of all the regexp sections; =
more than I am prepared to do right now.

Should this bug be kept open for possible improvements to the print =
manual, or can we regard that as a separate issue?





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.
Merged 31698 36496. Request was from Mattias Engdegård <mattiase@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 02:29:33 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 22:29:33 2019
Received: from localhost ([127.0.0.1]:56050 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjwvl-0003nV-2f
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 22:29:33 -0400
Received: from eggs.gnu.org ([209.51.188.92]:59020)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1hjwvi-0003nG-OB
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 22:29:31 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:36714)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <eliz@HIDDEN>)
 id 1hjwvc-0005CR-S2; Sat, 06 Jul 2019 22:29:24 -0400
Received: from [176.228.60.248] (port=3367 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1hjwvc-0006qU-9W; Sat, 06 Jul 2019 22:29:24 -0400
Date: Sun, 07 Jul 2019 05:29:20 +0300
Message-Id: <83y31a7f27.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
In-reply-to: <E013164D-DB9D-4DCD-8CAA-3FB5E075E9B9@HIDDEN> (message from
 Mattias =?utf-8?Q?Engdeg=C3=A5rd?= on Sat, 6 Jul 2019 21:45:58 +0200)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
 <83k1cv8k5z.fsf@HIDDEN> <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN>
 <83zhlr6ksx.fsf@HIDDEN> <E013164D-DB9D-4DCD-8CAA-3FB5E075E9B9@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: npostavs@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Mattias Engdegård <mattiase@HIDDEN>
> Date: Sat, 6 Jul 2019 21:45:58 +0200
> Cc: Noam Postavsky <npostavs@HIDDEN>, 36496 <at> debbugs.gnu.org
> 
> > Honestly, they look like incorrect English: a sentence, starting with
> > a capital letter, but not ending with a period.  I hope you will
> > reconsider.
> 
> Very well, full stops added.

Thanks, LGTM.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 00:36:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 20:36:54 2019
Received: from localhost ([127.0.0.1]:56023 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjvAk-0001EB-FY
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 20:36:54 -0400
Received: from userp2130.oracle.com ([156.151.31.86]:60942)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <drew.adams@HIDDEN>) id 1hjvAi-0001Dv-Nq
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 20:36:53 -0400
Received: from pps.filterd (userp2130.oracle.com [127.0.0.1])
 by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x670Z6um113223;
 Sun, 7 Jul 2019 00:36:33 GMT
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com;
 h=mime-version :
 message-id : date : from : sender : to : cc : subject : references :
 in-reply-to : content-type : content-transfer-encoding; s=corp-2018-07-02;
 bh=OclMhPlMm3cDWUFl48DdIv1w6sZxjC3IqaY8/IrE/8Y=;
 b=dwTa9pjlcWKLLgqsa4pnY/1iH2XPZKY7ISFFiqG8xG+4PIRg0OwGFGL/vIctOtudDeEg
 6MqJArlyULPCESOTcm9hnshc+l74OwEAgLi+aE6Xyo9hWeJw1wnuOxnA34Eu6h0RmMOE
 ygpaHEKbE8MdA2sFC+fh4N7bGdlgMDuVghcPotnyZ1oupdlbGb/pFr6LGGACgxM2WWXn
 K/hN+s51IWDE68RoN1Huumr596svKoABJxYVamqIbj3T7oG24/lOrRMgfUWgJIrOkEZ0
 gCBSD4+Gtn92Hjns6UbZyfc0TxLmhusme7QAgH0oVJhMaHTmQX2FfOcIGI8ZoALK2GRL Xg== 
Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79])
 by userp2130.oracle.com with ESMTP id 2tjk2t9t7r-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);
 Sun, 07 Jul 2019 00:36:33 +0000
Received: from pps.filterd (userp3020.oracle.com [127.0.0.1])
 by userp3020.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x670YJ2h001897;
 Sun, 7 Jul 2019 00:36:33 GMT
Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75])
 by userp3020.oracle.com with ESMTP id 2tjjyjqyqx-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);
 Sun, 07 Jul 2019 00:36:33 +0000
Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25])
 by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id x670aP59028292;
 Sun, 7 Jul 2019 00:36:27 GMT
MIME-Version: 1.0
Message-ID: <0458803b-c701-4706-9843-174b7373cf23@default>
Date: Sun, 7 Jul 2019 00:36:24 +0000 (UTC)
From: Drew Adams <drew.adams@HIDDEN>
To: rms@HIDDEN, Eli Zaretskii <eliz@HIDDEN>
Subject: RE: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <E1hjYHa-0005qu-Ox@HIDDEN>
 <83a7draccd.fsf@HIDDEN> <E1hjuap-0001MR-Qx@HIDDEN>
In-Reply-To: <E1hjuap-0001MR-Qx@HIDDEN>
X-Priority: 3
X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.9.1  (1003210) [OL
 16.0.4861.0 (x86)]
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9310
 signatures=668688
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0
 malwarescore=0
 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=961
 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1
 engine=8.0.1-1810050000 definitions=main-1907070006
X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9310
 signatures=668688
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0
 priorityscore=1501 malwarescore=0
 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015
 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0
 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000
 definitions=main-1907070006
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: mattiase@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

>   > I cannot answer the question without knowing which practical factors
>   > made rx inconvenient in the past.  Where can one find this
>   > information?
>=20
> I don't know.  I think people discussed it in the
> past -- perhaps on emacs-devel.  I don't remember details.
>=20
> What's clear is that rx didn't replace regexp syntax in the past.
> There had to be reasons.

I don't want to sidetrack this thread.  But one of
the things mentioned in some previous threads about
`rx' was that some people (including me) thought it
would be great if you could invoke a command on a
regexp (e.g. a regexp string in code) and have an
equivalent `rx' expression pop up, for inspection
and understanding.

A regexp string can be very concise (advantage),
even if obtuse (disadvantage).  Much of the time one
doesn't need to dig into the content of the regexp.
It would be nice to be able to have only the result
of `rx' in the code and be able to get its `rx'
expression on demand.

In sum, I'd say that one advantage of a regexp is
its concision.  But when you need or want to grok
it it's good to be able to get its `rx' sexp.

With such a feature people could use `rx' or its
result in code, au choix.  And they could see the
`rx' equivalent for a regexp on demand.

This is orthogonal to having good doc for `rx'.
I mention it only because the question came up of
disadvantages of `rx' (reasons why it might not
replace a regexp).

(Another reason, if it's true, would be if there
are some regexp constructs that `rx' cannot
handle/reproduce.)




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 23:59:57 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 19:59:57 2019
Received: from localhost ([127.0.0.1]:56001 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjuay-0000Kz-Jy
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 19:59:57 -0400
Received: from eggs.gnu.org ([209.51.188.92]:60480)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rms@HIDDEN>) id 1hjuaw-0000Kn-SF
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 19:59:55 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:34724)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <rms@HIDDEN>)
 id 1hjuar-0001j4-Kx; Sat, 06 Jul 2019 19:59:49 -0400
Received: from rms by fencepost.gnu.org with local (Exim 4.82)
 (envelope-from <rms@HIDDEN>)
 id 1hjuap-0001MR-Qx; Sat, 06 Jul 2019 19:59:48 -0400
Content-Type: text/plain; charset=Utf-8
From: Richard Stallman <rms@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
In-Reply-To: <83a7draccd.fsf@HIDDEN> (message from Eli Zaretskii on Sat, 06
 Jul 2019 09:47:30 +0300)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <E1hjYHa-0005qu-Ox@HIDDEN>
 <83a7draccd.fsf@HIDDEN>
Message-Id: <E1hjuap-0001MR-Qx@HIDDEN>
Date: Sat, 06 Jul 2019 19:59:47 -0400
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: mattiase@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Reply-To: rms@HIDDEN
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > In the past, various practical factors have made rx somewhat inconvenient,
  > > and that prevented rx from competing with the regexp syntax.
  > > Recently we have made some improvements in rx; are they enough to
  > > make rx a real competitor for regexps?

  > I cannot answer the question without knowing which practical factors
  > made rx inconvenient in the past.  Where can one find this
  > information?

I don't know.  I think people discussed it in the
past -- perhaps on emacs-devel.  I don't remember details.

What's clear is that rx didn't replace regexp syntax in the past.
There had to be reasons.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)






Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 23:56:41 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 19:56:41 2019
Received: from localhost ([127.0.0.1]:55997 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjuXo-0000GS-RI
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 19:56:41 -0400
Received: from eggs.gnu.org ([209.51.188.92]:59796)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rms@HIDDEN>) id 1hjuXm-0000GF-Lj
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 19:56:39 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:34542)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <rms@HIDDEN>)
 id 1hjuXh-0000Ll-Cg; Sat, 06 Jul 2019 19:56:33 -0400
Received: from rms by fencepost.gnu.org with local (Exim 4.82)
 (envelope-from <rms@HIDDEN>)
 id 1hjuXe-0004eV-EL; Sat, 06 Jul 2019 19:56:30 -0400
Content-Type: text/plain; charset=Utf-8
From: Richard Stallman <rms@HIDDEN>
To: Mattias =?iso-8859-1?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
In-Reply-To: <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN> (message from
 Mattias =?iso-8859-1?Q?Engdeg=C3=A5rd?= on Sat, 6 Jul 2019 13:33:35 +0200)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
Message-Id: <E1hjuXe-0004eV-EL@HIDDEN>
Date: Sat, 06 Jul 2019 19:56:30 -0400
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: eliz@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Reply-To: rms@HIDDEN
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > >> It is about 7-8 pages in all.

Would it be feasible to format it differently so that it comes out as
fewer pages?  That might be possible by using Texinfo a different way.
Or perhaps not.  That is why I am asking.

Here's another idea: document the two syntaxes in a single table,
where each item says how to do the job in a regexp
and how to do it in rx.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)






Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 19:46:07 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 15:46:07 2019
Received: from localhost ([127.0.0.1]:55918 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjqdK-0002LA-OI
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 15:46:06 -0400
Received: from mail172c50.megamailservers.eu ([91.136.10.182]:50438
 helo=mail33c50.megamailservers.eu)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <mattiase@HIDDEN>) id 1hjqdG-0002KY-UZ
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 15:46:04 -0400
X-Authenticated-User: mattiase@HIDDEN
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu;
 s=maildub; t=1562442361;
 bh=kNReqyQGCnRLAXR9s1FzoyezH00NLnYL/zOJYMjD1o8=;
 h=From:Subject:Date:In-Reply-To:Cc:To:References:From;
 b=ICl//5aZV960hpgB4L8pCuJ2KPcuAtQVnpH4M1j3Nh7WRrS2R2kTzzYmz1zzoUdvi
 X2VeIij+AlrSfFnoml6Fytc71JDkQ1UIvnWGcFRj/lqCSKtvsafj2mct2Tydj4slm2
 ylx+t1Q4YeLmYSA7y29vTOKszSNLCMCo0qOR/cXs=
Feedback-ID: mattiase@HIDDEN
Received: from [192.168.0.4] ([188.150.171.71]) (authenticated bits=0)
 by mail33c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x66Jjwfh005208; 
 Sat, 6 Jul 2019 19:46:00 +0000
From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= <mattiase@HIDDEN>
Message-Id: <E013164D-DB9D-4DCD-8CAA-3FB5E075E9B9@HIDDEN>
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_A0D8A56C-E758-4D48-B700-ED23794126B7"
Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\))
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
Date: Sat, 6 Jul 2019 21:45:58 +0200
In-Reply-To: <83zhlr6ksx.fsf@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
 <83k1cv8k5z.fsf@HIDDEN> <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN>
 <83zhlr6ksx.fsf@HIDDEN>
X-Mailer: Apple Mail (2.3445.104.11)
X-CTCH-RefID: str=0001.0A0B0204.5D20FA79.0001, ss=1, re=0.000, recu=0.000,
 reip=0.000, cl=1, cld=1, fgs=0
X-CTCH-VOD: Unknown
X-CTCH-Spam: Unknown
X-CTCH-Score: 0.000
X-CTCH-Rules: 
X-CTCH-Flags: 0
X-CTCH-ScoreCust: 0.000
X-CSC: 0
X-CHA: v=2.3 cv=Ioswjo3g c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117
 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19
 a=mDV3o1hIAAAA:8 a=4CjTDWHgoCpdKWB9E4QA:9 a=CjuIK1q_8ugA:10
 a=ncZ9vwaUYPMA:10 a=tCgv9tXcGVBhTxdMYLsA:9 a=B2y7HmGcmWMA:10
 a=_FVE-zBwftR9WsbkzFJk:22
X-Spam-Score: 0.3 (/)
X-Debbugs-Envelope-To: 36496
Cc: Noam Postavsky <npostavs@HIDDEN>, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)


--Apple-Mail=_A0D8A56C-E758-4D48-B700-ED23794126B7
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=us-ascii

6 juli 2019 kl. 21.10 skrev Eli Zaretskii <eliz@HIDDEN>:
> 
> Honestly, they look like incorrect English: a sentence, starting with
> a capital letter, but not ending with a period.  I hope you will
> reconsider.

Very well, full stops added.


--Apple-Mail=_A0D8A56C-E758-4D48-B700-ED23794126B7
Content-Disposition: attachment;
	filename=0002-Shorter-rx-doc-string-bug-36496.patch
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="0002-Shorter-rx-doc-string-bug-36496.patch"
Content-Transfer-Encoding: quoted-printable

=46rom=20584c325f1488df5c25b69c84222034f0d9a74e9e=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20=
<mattiase@HIDDEN>=0ADate:=20Sat,=206=20Jul=202019=2013:22:15=20+0200=0A=
Subject:=20[PATCH=202/2]=20Shorter=20`rx'=20doc=20string=20(bug#36496)=0A=
=0A*=20lisp/emacs-lisp/rx.el=20(rx):=20Replace=20long=20description=20=
with=20a=20condensed=0Asummary=20of=20the=20rx=20syntax,=20with=20=
reference=20to=20the=20manual=20section.=0A---=0A=20=
lisp/emacs-lisp/rx.el=20|=20417=20=
++++++++++--------------------------------=0A=201=20file=20changed,=2096=20=
insertions(+),=20321=20deletions(-)=0A=0Adiff=20--git=20=
a/lisp/emacs-lisp/rx.el=20b/lisp/emacs-lisp/rx.el=0Aindex=20=
24dd6cbf1d..249529e54e=20100644=0A---=20a/lisp/emacs-lisp/rx.el=0A+++=20=
b/lisp/emacs-lisp/rx.el=0A@@=20-959,327=20+959,102=20@@=20rx-to-string=0A=
=20;;;###autoload=0A=20(defmacro=20rx=20(&rest=20regexps)=0A=20=20=20=
"Translate=20regular=20expressions=20REGEXPS=20in=20sexp=20form=20to=20a=20=
regexp=20string.=0A-REGEXPS=20is=20a=20non-empty=20sequence=20of=20forms=20=
of=20the=20sort=20listed=20below.=0A-=0A-Note=20that=20`rx'=20is=20a=20=
Lisp=20macro;=20when=20used=20in=20a=20Lisp=20program=20being=0A=
-compiled,=20the=20translation=20is=20performed=20by=20the=20compiler.=20=
=20The=0A-`literal'=20and=20`regexp'=20forms=20accept=20subforms=20that=20=
will=20evaluate=0A-to=20strings,=20in=20addition=20to=20constant=20=
strings.=20=20If=20REGEXPS=20include=0A-such=20forms,=20then=20the=20=
result=20is=20an=20expression=20which=20returns=20a=0A-regexp=20string,=20=
rather=20than=20a=20regexp=20string=20directly.=20=20See=0A=
-`rx-to-string'=20for=20performing=20translation=20completely=20at=20run=20=
time.=0A-=0A-The=20following=20are=20valid=20subforms=20of=20regular=20=
expressions=20in=20sexp=0A-notation.=0A-=0A-STRING=0A-=20=20=20=20=20=
matches=20string=20STRING=20literally.=0A-=0A-CHAR=0A-=20=20=20=20=20=
matches=20character=20CHAR=20literally.=0A-=0A-`not-newline',=20`nonl'=0A=
-=20=20=20=20=20matches=20any=20character=20except=20a=20newline.=0A-=0A=
-`anything'=0A-=20=20=20=20=20matches=20any=20character=0A-=0A-`(any=20=
SET=20...)'=0A-`(in=20SET=20...)'=0A-`(char=20SET=20...)'=0A-=20=20=20=20=
=20matches=20any=20character=20in=20SET=20....=20=20SET=20may=20be=20a=20=
character=20or=20string.=0A-=20=20=20=20=20Ranges=20of=20characters=20=
can=20be=20specified=20as=20`A-Z'=20in=20strings.=0A-=20=20=20=20=20=
Ranges=20may=20also=20be=20specified=20as=20conses=20like=20`(?A=20.=20=
?Z)'.=0A-=20=20=20=20=20Reversed=20ranges=20like=20`Z-A'=20and=20`(?Z=20=
.=20?A)'=20are=20not=20permitted.=0A-=0A-=20=20=20=20=20SET=20may=20also=20=
be=20the=20name=20of=20a=20character=20class:=20`digit',=0A-=20=20=20=20=20=
`control',=20`hex-digit',=20`blank',=20`graph',=20`print',=20`alnum',=0A=
-=20=20=20=20=20`alpha',=20`ascii',=20`nonascii',=20`lower',=20`punct',=20=
`space',=20`upper',=0A-=20=20=20=20=20`word',=20or=20one=20of=20their=20=
synonyms.=0A-=0A-`(not=20(any=20SET=20...))'=0A-=20=20=20=20=20matches=20=
any=20character=20not=20in=20SET=20...=0A-=0A-`line-start',=20`bol'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
beginning=20of=20a=20line=0A-=20=20=20=20=20in=20the=20text=20being=20=
matched=0A-=0A-`line-end',=20`eol'=0A-=20=20=20=20=20is=20similar=20to=20=
`line-start'=20but=20matches=20only=20at=20the=20end=20of=20a=20line=0A-=0A=
-`string-start',=20`bos',=20`bot'=0A-=20=20=20=20=20matches=20the=20=
empty=20string,=20but=20only=20at=20the=20beginning=20of=20the=0A-=20=20=20=
=20=20string=20being=20matched=20against.=0A-=0A-`string-end',=20`eos',=20=
`eot'=0A-=20=20=20=20=20matches=20the=20empty=20string,=20but=20only=20=
at=20the=20end=20of=20the=0A-=20=20=20=20=20string=20being=20matched=20=
against.=0A-=0A-`buffer-start'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20the=20beginning=20of=20the=0A-=20=20=20=20=20=
buffer=20being=20matched=20against.=20=20Actually=20equivalent=20to=20=
`string-start'.=0A-=0A-`buffer-end'=0A-=20=20=20=20=20matches=20the=20=
empty=20string,=20but=20only=20at=20the=20end=20of=20the=0A-=20=20=20=20=20=
buffer=20being=20matched=20against.=20=20Actually=20equivalent=20to=20=
`string-end'.=0A-=0A-`point'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20point.=0A-=0A-`word-start',=20`bow'=0A-=20=20=
=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
beginning=20of=20a=20word.=0A-=0A-`word-end',=20`eow'=0A-=20=20=20=20=20=
matches=20the=20empty=20string,=20but=20only=20at=20the=20end=20of=20a=20=
word.=0A-=0A-`word-boundary'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20the=20beginning=20or=20end=20of=20a=0A-=20=20=
=20=20=20word.=0A-=0A-`(not=20word-boundary)'=0A-`not-word-boundary'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20not=20at=20the=20=
beginning=20or=20end=20of=20a=0A-=20=20=20=20=20word.=0A-=0A=
-`symbol-start'=0A-=20=20=20=20=20matches=20the=20empty=20string,=20but=20=
only=20at=20the=20beginning=20of=20a=20symbol.=0A-=0A-`symbol-end'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
end=20of=20a=20symbol.=0A-=0A-`digit',=20`numeric',=20`num'=0A-=20=20=20=20=
=20matches=200=20through=209.=0A-=0A-`control',=20`cntrl'=0A-=20=20=20=20=
=20matches=20any=20character=20whose=20code=20is=20in=20the=20range=20=
0-31.=0A-=0A-`hex-digit',=20`hex',=20`xdigit'=0A-=20=20=20=20=20matches=20=
0=20through=209,=20a=20through=20f=20and=20A=20through=20F.=0A-=0A=
-`blank'=0A-=20=20=20=20=20matches=20horizontal=20whitespace,=20as=20=
defined=20by=20Annex=20C=20of=20the=0A-=20=20=20=20=20Unicode=20=
Technical=20Standard=20#18.=20=20In=20particular,=20it=20matches=0A-=20=20=
=20=20=20spaces,=20tabs,=20and=20other=20characters=20whose=20Unicode=0A=
-=20=20=20=20=20`general-category'=20property=20indicates=20they=20are=20=
spacing=0A-=20=20=20=20=20separators.=0A-=0A-`graphic',=20`graph'=0A-=20=20=
=20=20=20matches=20graphic=20characters--everything=20except=20=
whitespace,=20ASCII=0A-=20=20=20=20=20and=20non-ASCII=20control=20=
characters,=20surrogates,=20and=20codepoints=0A-=20=20=20=20=20=
unassigned=20by=20Unicode.=0A-=0A-`printing',=20`print'=0A-=20=20=20=20=20=
matches=20whitespace=20and=20graphic=20characters.=0A-=0A=
-`alphanumeric',=20`alnum'=0A-=20=20=20=20=20matches=20alphabetic=20=
characters=20and=20digits.=20=20For=20multibyte=20characters,=0A-=20=20=20=
=20=20it=20matches=20characters=20whose=20Unicode=20`general-category'=20=
property=0A-=20=20=20=20=20indicates=20they=20are=20alphabetic=20or=20=
decimal=20number=20characters.=0A-=0A-`letter',=20`alphabetic',=20=
`alpha'=0A-=20=20=20=20=20matches=20alphabetic=20characters.=20=20For=20=
multibyte=20characters,=0A-=20=20=20=20=20it=20matches=20characters=20=
whose=20Unicode=20`general-category'=20property=0A-=20=20=20=20=20=
indicates=20they=20are=20alphabetic=20characters.=0A-=0A-`ascii'=0A-=20=20=
=20=20=20matches=20ASCII=20(unibyte)=20characters.=0A-=0A-`nonascii'=0A-=20=
=20=20=20=20matches=20non-ASCII=20(multibyte)=20characters.=0A-=0A=
-`lower',=20`lower-case'=0A-=20=20=20=20=20matches=20anything=20=
lower-case,=20as=20determined=20by=20the=20current=20case=0A-=20=20=20=20=
=20table.=20=20If=20`case-fold-search'=20is=20non-nil,=20this=20also=20=
matches=20any=0A-=20=20=20=20=20upper-case=20letter.=0A-=0A-`upper',=20=
`upper-case'=0A-=20=20=20=20=20matches=20anything=20upper-case,=20as=20=
determined=20by=20the=20current=20case=0A-=20=20=20=20=20table.=20=20If=20=
`case-fold-search'=20is=20non-nil,=20this=20also=20matches=20any=0A-=20=20=
=20=20=20lower-case=20letter.=0A-=0A-`punctuation',=20`punct'=0A-=20=20=20=
=20=20matches=20punctuation.=20=20(But=20at=20present,=20for=20multibyte=20=
characters,=0A-=20=20=20=20=20it=20matches=20anything=20that=20has=20=
non-word=20syntax.)=0A-=0A-`space',=20`whitespace',=20`white'=0A-=20=20=20=
=20=20matches=20anything=20that=20has=20whitespace=20syntax.=0A-=0A=
-`word',=20`wordchar'=0A-=20=20=20=20=20matches=20anything=20that=20has=20=
word=20syntax.=0A-=0A-`not-wordchar'=0A-=20=20=20=20=20matches=20=
anything=20that=20has=20non-word=20syntax.=0A-=0A-`(syntax=20SYNTAX)'=0A=
-=20=20=20=20=20matches=20a=20character=20with=20syntax=20SYNTAX.=20=20=
SYNTAX=20must=20be=20one=0A-=20=20=20=20=20of=20the=20following=20=
symbols,=20or=20a=20symbol=20corresponding=20to=20the=20syntax=0A-=20=20=20=
=20=20character,=20e.g.=20`\\.'=20for=20`\\s.'.=0A-=0A-=20=20=20=20=20=
`whitespace'=09=09(\\s-=20in=20string=20notation)=0A-=20=20=20=20=20=
`punctuation'=09=09(\\s.)=0A-=20=20=20=20=20`word'=09=09=09(\\sw)=0A-=20=20=
=20=20=20`symbol'=09=09=09(\\s_)=0A-=20=20=20=20=20`open-parenthesis'=09=09=
(\\s()=0A-=20=20=20=20=20`close-parenthesis'=09(\\s))=0A-=20=20=20=20=20=
`expression-prefix'=09(\\s')=0A-=20=20=20=20=20`string-quote'=09=09=
(\\s\")=0A-=20=20=20=20=20`paired-delimiter'=09=09(\\s$)=0A-=20=20=20=20=20=
`escape'=09=09=09(\\s\\)=0A-=20=20=20=20=20`character-quote'=09=09(\\s/)=0A=
-=20=20=20=20=20`comment-start'=09=09(\\s<)=0A-=20=20=20=20=20=
`comment-end'=09=09(\\s>)=0A-=20=20=20=20=20`string-delimiter'=09=09=
(\\s|)=0A-=20=20=20=20=20`comment-delimiter'=09(\\s!)=0A-=0A-`(not=20=
(syntax=20SYNTAX))'=0A-=20=20=20=20=20matches=20a=20character=20that=20=
doesn't=20have=20syntax=20SYNTAX.=0A-=0A-`(category=20CATEGORY)'=0A-=20=20=
=20=20=20matches=20a=20character=20with=20category=20CATEGORY.=20=20=
CATEGORY=20must=20be=0A-=20=20=20=20=20either=20a=20character=20to=20use=20=
for=20C,=20or=20one=20of=20the=20following=20symbols.=0A-=0A-=20=20=20=20=
=20`space-for-indent'=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(\\c\\s=20in=20string=20notation)=0A-=20=20=20=20=20`base'=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(\\c.)=0A-=20=20=20=20=20`consonant'=09=09=09(\\c0)=0A-=20=20=20=20=20=
`base-vowel'=09=09=09(\\c1)=0A-=20=20=20=20=20`upper-diacritical-mark'=09=
=09(\\c2)=0A-=20=20=20=20=20`lower-diacritical-mark'=09=09(\\c3)=0A-=20=20=
=20=20=20`tone-mark'=09=09=20=20=20=20=20=20=20=20(\\c4)=0A-=20=20=20=20=20=
`symbol'=09=09=09=20=20=20=20=20=20=20=20(\\c5)=0A-=20=20=20=20=20=
`digit'=09=09=09=20=20=20=20=20=20=20=20(\\c6)=0A-=20=20=20=20=20=
`vowel-modifying-diacritical-mark'=09(\\c7)=0A-=20=20=20=20=20=
`vowel-sign'=09=09=09(\\c8)=0A-=20=20=20=20=20`semivowel-lower'=09=09=09=
(\\c9)=0A-=20=20=20=20=20`not-at-end-of-line'=09=09(\\c<)=0A-=20=20=20=20=
=20`not-at-beginning-of-line'=09=09(\\c>)=0A-=20=20=20=20=20=
`alpha-numeric-two-byte'=09=09(\\cA)=0A-=20=20=20=20=20=
`chinese-two-byte'=09=09=09(\\cC)=0A-=20=20=20=20=20`greek-two-byte'=09=09=
=09(\\cG)=0A-=20=20=20=20=20`japanese-hiragana-two-byte'=09(\\cH)=0A-=20=20=
=20=20=20`indian-two-byte'=09=09=09(\\cI)=0A-=20=20=20=20=20=
`japanese-katakana-two-byte'=09(\\cK)=0A-=20=20=20=20=20=
`strong-left-to-right'=20=20=20=20=20=20=20=20=20=20=20=20=20(\\cL)=0A-=20=
=20=20=20=20`korean-hangul-two-byte'=09=09(\\cN)=0A-=20=20=20=20=20=
`strong-right-to-left'=20=20=20=20=20=20=20=20=20=20=20=20=20(\\cR)=0A-=20=
=20=20=20=20`cyrillic-two-byte'=09=09(\\cY)=0A-=20=20=20=20=20=
`combining-diacritic'=09=09(\\c^)=0A-=20=20=20=20=20`ascii'=09=09=09=09=
(\\ca)=0A-=20=20=20=20=20`arabic'=09=09=09=09(\\cb)=0A-=20=20=20=20=20=
`chinese'=09=09=09=09(\\cc)=0A-=20=20=20=20=20`ethiopic'=09=09=09=09=
(\\ce)=0A-=20=20=20=20=20`greek'=09=09=09=09(\\cg)=0A-=20=20=20=20=20=
`korean'=09=09=09=09(\\ch)=0A-=20=20=20=20=20`indian'=09=09=09=09(\\ci)=0A=
-=20=20=20=20=20`japanese'=09=09=09=09(\\cj)=0A-=20=20=20=20=20=
`japanese-katakana'=09=09(\\ck)=0A-=20=20=20=20=20`latin'=09=09=09=09=
(\\cl)=0A-=20=20=20=20=20`lao'=09=09=09=09(\\co)=0A-=20=20=20=20=20=
`tibetan'=09=09=09=09(\\cq)=0A-=20=20=20=20=20`japanese-roman'=09=09=09=
(\\cr)=0A-=20=20=20=20=20`thai'=09=09=09=09(\\ct)=0A-=20=20=20=20=20=
`vietnamese'=09=09=09(\\cv)=0A-=20=20=20=20=20`hebrew'=09=09=09=09(\\cw)=0A=
-=20=20=20=20=20`cyrillic'=09=09=09=09(\\cy)=0A-=20=20=20=20=20=
`can-break'=09=09=09(\\c|)=0A-=0A-`(not=20(category=20CATEGORY))'=0A-=20=20=
=20=20=20matches=20a=20character=20that=20doesn't=20have=20category=20=
CATEGORY.=0A-=0A-`(and=20SEXP1=20SEXP2=20...)'=0A-`(:=20SEXP1=20SEXP2=20=
...)'=0A-`(seq=20SEXP1=20SEXP2=20...)'=0A-`(sequence=20SEXP1=20SEXP2=20=
...)'=0A-=20=20=20=20=20matches=20what=20SEXP1=20matches,=20followed=20=
by=20what=20SEXP2=20matches,=20etc.=0A-=20=20=20=20=20Without=20=
arguments,=20matches=20the=20empty=20string.=0A-=0A-`(submatch=20SEXP1=20=
SEXP2=20...)'=0A-`(group=20SEXP1=20SEXP2=20...)'=0A-=20=20=20=20=20like=20=
`and',=20but=20makes=20the=20match=20accessible=20with=20`match-end',=0A=
-=20=20=20=20=20`match-beginning',=20and=20`match-string'.=0A-=0A=
-`(submatch-n=20N=20SEXP1=20SEXP2=20...)'=0A-`(group-n=20N=20SEXP1=20=
SEXP2=20...)'=0A-=20=20=20=20=20like=20`group',=20but=20make=20it=20an=20=
explicitly-numbered=20group=20with=0A-=20=20=20=20=20group=20number=20N.=0A=
-=0A-`(or=20SEXP1=20SEXP2=20...)'=0A-`(|=20SEXP1=20SEXP2=20...)'=0A-=20=20=
=20=20=20matches=20anything=20that=20matches=20SEXP1=20or=20SEXP2,=20=
etc.=20=20If=20all=0A-=20=20=20=20=20args=20are=20strings,=20use=20=
`regexp-opt'=20to=20optimize=20the=20resulting=0A-=20=20=20=20=20regular=20=
expression.=20=20Without=20arguments,=20never=20matches=20anything.=0A-=0A=
-`(minimal-match=20SEXP)'=0A-=20=20=20=20=20produce=20a=20non-greedy=20=
regexp=20for=20SEXP.=20=20Normally,=20regexps=20matching=0A-=20=20=20=20=20=
zero=20or=20more=20occurrences=20of=20something=20are=20\"greedy\"=20in=20=
that=20they=0A-=20=20=20=20=20match=20as=20much=20as=20they=20can,=20as=20=
long=20as=20the=20overall=20regexp=20can=0A-=20=20=20=20=20still=20=
match.=20=20A=20non-greedy=20regexp=20matches=20as=20little=20as=20=
possible.=0A-=0A-`(maximal-match=20SEXP)'=0A-=20=20=20=20=20produce=20a=20=
greedy=20regexp=20for=20SEXP.=20=20This=20is=20the=20default.=0A-=0A=
-Below,=20`SEXP=20...'=20represents=20a=20sequence=20of=20regexp=20=
forms,=20treated=20as=20if=0A-enclosed=20in=20`(and=20...)'.=0A-=0A=
-`(zero-or-more=20SEXP=20...)'=0A-`(0+=20SEXP=20...)'=0A-=20=20=20=20=20=
matches=20zero=20or=20more=20occurrences=20of=20what=20SEXP=20...=20=
matches.=0A-=0A-`(*=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`zero-or-more',=20but=20always=20produces=20a=20greedy=20regexp,=20=
independent=0A-=20=20=20=20=20of=20`rx-greedy-flag'.=0A-=0A-`(*?=20SEXP=20=
...)'=0A-=20=20=20=20=20like=20`zero-or-more',=20but=20always=20produces=20=
a=20non-greedy=20regexp,=0A-=20=20=20=20=20independent=20of=20=
`rx-greedy-flag'.=0A-=0A-`(one-or-more=20SEXP=20...)'=0A-`(1+=20SEXP=20=
...)'=0A-=20=20=20=20=20matches=20one=20or=20more=20occurrences=20of=20=
SEXP=20...=0A-=0A-`(+=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`one-or-more',=20but=20always=20produces=20a=20greedy=20regexp.=0A-=0A=
-`(+?=20SEXP=20...)'=0A-=20=20=20=20=20like=20`one-or-more',=20but=20=
always=20produces=20a=20non-greedy=20regexp.=0A-=0A-`(zero-or-one=20SEXP=20=
...)'=0A-`(optional=20SEXP=20...)'=0A-`(opt=20SEXP=20...)'=0A-=20=20=20=20=
=20matches=20zero=20or=20one=20occurrences=20of=20A.=0A-=0A-`(?=20SEXP=20=
...)'=0A-=20=20=20=20=20like=20`zero-or-one',=20but=20always=20produces=20=
a=20greedy=20regexp.=0A-=0A-`(??=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`zero-or-one',=20but=20always=20produces=20a=20non-greedy=20regexp.=0A-=0A=
-`(repeat=20N=20SEXP)'=0A-`(=3D=20N=20SEXP=20...)'=0A-=20=20=20=20=20=
matches=20N=20occurrences.=0A-=0A-`(>=3D=20N=20SEXP=20...)'=0A-=20=20=20=20=
=20matches=20N=20or=20more=20occurrences.=0A-=0A-`(repeat=20N=20M=20=
SEXP)'=0A-`(**=20N=20M=20SEXP=20...)'=0A-=20=20=20=20=20matches=20N=20to=20=
M=20occurrences.=0A-=0A-`(backref=20N)'=0A-=20=20=20=20=20matches=20what=20=
was=20matched=20previously=20by=20submatch=20N.=0A-=0A-`(literal=20=
STRING-EXPR)'=0A-=20=20=20=20=20matches=20STRING-EXPR=20literally,=20=
where=20STRING-EXPR=20is=20any=20lisp=0A-=20=20=20=20=20expression=20=
that=20evaluates=20to=20a=20string.=0A-=0A-`(regexp=20REGEXP-EXPR)'=0A-=20=
=20=20=20=20include=20REGEXP-EXPR=20in=20string=20notation=20in=20the=20=
result,=20where=0A-=20=20=20=20=20REGEXP-EXPR=20is=20any=20lisp=20=
expression=20that=20evaluates=20to=20a=0A-=20=20=20=20=20string=20=
containing=20a=20valid=20regexp.=0A-=0A-`(eval=20FORM)'=0A-=20=20=20=20=20=
evaluate=20FORM=20and=20insert=20result.=20=20If=20result=20is=20a=20=
string,=0A-=20=20=20=20=20`regexp-quote'=20it.=20=20Note=20that=20FORM=20=
is=20evaluated=20during=0A-=20=20=20=20=20macroexpansion."=0A+Each=20=
argument=20is=20one=20of=20the=20forms=20below;=20RX=20is=20a=20subform,=20=
and=20RX...=20stands=0A+for=20one=20or=20more=20RXs.=20=20For=20details,=20=
see=20Info=20node=20`(elisp)=20Rx=20Notation'.=0A+See=20`rx-to-string'=20=
for=20the=20corresponding=20function.=0A+=0A+STRING=20=20=20=20=20=20=20=20=
=20Match=20a=20literal=20string.=0A+CHAR=20=20=20=20=20=20=20=20=20=20=20=
Match=20a=20literal=20character.=0A+=0A+(seq=20RX...)=20=20=20=20Match=20=
the=20RXs=20in=20sequence.=20=20Alias:=20:,=20sequence,=20and.=0A+(or=20=
RX...)=20=20=20=20=20Match=20one=20of=20the=20RXs.=20=20Alias:=20|.=0A+=0A=
+(zero-or-more=20RX...)=20Match=20RXs=20zero=20or=20more=20times.=20=20=
Alias:=200+.=0A+(one-or-more=20RX...)=20=20Match=20RXs=20one=20or=20more=20=
times.=20=20Alias:=201+.=0A+(zero-or-one=20RX...)=20=20Match=20RXs=20or=20=
the=20empty=20string.=20=20Alias:=20opt,=20optional.=0A+(*=20RX...)=20=20=
=20=20=20=20=20Match=20RXs=20zero=20or=20more=20times;=20greedy.=0A+(+=20=
RX...)=20=20=20=20=20=20=20Match=20RXs=20one=20or=20more=20times;=20=
greedy.=0A+(?=20RX...)=20=20=20=20=20=20=20Match=20RXs=20or=20the=20=
empty=20string;=20greedy.=0A+(*?=20RX...)=20=20=20=20=20=20Match=20RXs=20=
zero=20or=20more=20times;=20non-greedy.=0A+(+?=20RX...)=20=20=20=20=20=20=
Match=20RXs=20one=20or=20more=20times;=20non-greedy.=0A+(??=20RX...)=20=20=
=20=20=20=20Match=20RXs=20or=20the=20empty=20string;=20non-greedy.=0A+(=3D=
=20N=20RX...)=20=20=20=20=20Match=20RXs=20exactly=20N=20times.=0A+(>=3D=20=
N=20RX...)=20=20=20=20Match=20RXs=20N=20or=20more=20times.=0A+(**=20N=20=
M=20RX...)=20=20Match=20RXs=20N=20to=20M=20times.=20=20Alias:=20repeat.=0A=
+(minimal-match=20RX)=20=20Match=20RX,=20with=20zero-or-more,=20=
one-or-more,=20zero-or-one=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20and=20aliases=20using=20non-greedy=20matching.=0A+(maximal-match=20=
RX)=20=20Match=20RX,=20with=20zero-or-more,=20one-or-more,=20zero-or-one=0A=
+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20and=20aliases=20using=20=
greedy=20matching,=20which=20is=20the=20default.=0A+=0A+(any=20SET...)=20=
=20=20=20Match=20a=20character=20from=20one=20of=20the=20SETs.=20=20Each=20=
SET=20is=20a=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
character,=20a=20string,=20a=20range=20as=20string=20\"A-Z\"=20or=20cons=0A=
+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(?A=20.=20?Z),=20or=20a=20=
character=20class=20(see=20below).=20=20Alias:=20in,=20char.=0A+(not=20=
CHARSPEC)=20=20Match=20one=20character=20not=20matched=20by=20CHARSPEC.=20=
=20CHARSPEC=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20can=20be=20=
(any=20...),=20(syntax=20...),=20(category=20...),=0A+=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20or=20a=20character=20class.=0A+not-newline=20=20=
=20=20=20Match=20any=20character=20except=20a=20newline.=20=20Alias:=20=
nonl.=0A+anything=20=20=20=20=20=20=20=20Match=20any=20character.=0A+=0A=
+CHARCLASS=20=20=20=20=20=20=20Match=20a=20character=20from=20a=20=
character=20class.=20=20One=20of:=0A+=20alpha,=20alphabetic,=20letter=20=20=
=20Alphabetic=20characters=20(defined=20by=20Unicode).=0A+=20alnum,=20=
alphanumeric=20=20=20=20=20=20=20=20=20Alphabetic=20or=20decimal=20digit=20=
chars=20(Unicode).=0A+=20digit=20numeric,=20num=20=20=20=20=20=20=20=20=20=
=200-9.=0A+=20xdigit,=20hex-digit,=20hex=20=20=20=20=20=200-9,=20A-F,=20=
a-f.=0A+=20cntrl,=20control=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
ASCII=20codes=200-31.=0A+=20blank=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20Horizontal=20whitespace=20(Unicode).=0A+=20=
space,=20whitespace,=20white=20=20=20=20Chars=20with=20whitespace=20=
syntax.=0A+=20lower,=20lower-case=20=20=20=20=20=20=20=20=20=20=20=
Lower-case=20chars,=20from=20current=20case=20table.=0A+=20upper,=20=
upper-case=20=20=20=20=20=20=20=20=20=20=20Upper-case=20chars,=20from=20=
current=20case=20table.=0A+=20graph,=20graphic=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20Graphic=20characters=20(Unicode).=0A+=20print,=20printing=20=
=20=20=20=20=20=20=20=20=20=20=20=20Whitespace=20or=20graphic=20=
(Unicode).=0A+=20punct,=20punctuation=20=20=20=20=20=20=20=20=20=20Not=20=
control,=20space,=20letter=20or=20digit=20(ASCII);=0A+=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20not=20=
word=20syntax=20(non-ASCII).=0A+=20word,=20wordchar=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20Characters=20with=20word=20syntax.=0A+=20ascii=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20ASCII=20=
characters=20(codes=200-127).=0A+=20nonascii=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20Non-ASCII=20characters=20(but=20not=20raw=20=
bytes).=0A+=0A+(syntax=20SYNTAX)=20=20Match=20a=20character=20with=20=
syntax=20SYNTAX,=20being=20one=20of:=0A+=20=20whitespace,=20punctuation,=20=
word,=20symbol,=20open-parenthesis,=0A+=20=20close-parenthesis,=20=
expression-prefix,=20string-quote,=0A+=20=20paired-delimiter,=20escape,=20=
character-quote,=20comment-start,=0A+=20=20comment-end,=20=
string-delimiter,=20comment-delimiter=0A+=0A+(category=20CAT)=20=20=20=
Match=20a=20character=20in=20category=20CAT,=20being=20one=20of:=0A+=20=20=
space-for-indent,=20base,=20consonant,=20base-vowel,=0A+=20=20=
upper-diacritical-mark,=20lower-diacritical-mark,=20tone-mark,=20symbol,=0A=
+=20=20digit,=20vowel-modifying-diacritical-mark,=20vowel-sign,=0A+=20=20=
semivowel-lower,=20not-at-end-of-line,=20not-at-beginning-of-line,=0A+=20=
=20alpha-numeric-two-byte,=20chinese-two-byte,=20greek-two-byte,=0A+=20=20=
japanese-hiragana-two-byte,=20indian-two-byte,=0A+=20=20=
japanese-katakana-two-byte,=20strong-left-to-right,=0A+=20=20=
korean-hangul-two-byte,=20strong-right-to-left,=20cyrillic-two-byte,=0A+=20=
=20combining-diacritic,=20ascii,=20arabic,=20chinese,=20ethiopic,=20=
greek,=0A+=20=20korean,=20indian,=20japanese,=20japanese-katakana,=20=
latin,=20lao,=0A+=20=20tibetan,=20japanese-roman,=20thai,=20vietnamese,=20=
hebrew,=20cyrillic,=0A+=20=20can-break=0A+=0A+Zero-width=20assertions:=20=
these=20all=20match=20the=20empty=20string=20in=20specific=20places.=0A+=20=
line-start=20=20=20=20=20=20=20=20=20At=20the=20beginning=20of=20a=20=
line.=20=20Alias:=20bol.=0A+=20line-end=20=20=20=20=20=20=20=20=20=20=20=
At=20the=20end=20of=20a=20line.=20=20Alias:=20eol.=0A+=20string-start=20=20=
=20=20=20=20=20At=20the=20start=20of=20the=20string=20or=20buffer.=0A+=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Alias:=20=
buffer-start,=20bos,=20bot.=0A+=20string-end=20=20=20=20=20=20=20=20=20=
At=20the=20end=20of=20the=20string=20or=20buffer.=0A+=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20Alias:=20buffer-end,=20eos,=20=
eot.=0A+=20point=20=20=20=20=20=20=20=20=20=20=20=20=20=20At=20point.=0A=
+=20word-start=20=20=20=20=20=20=20=20=20At=20the=20beginning=20of=20a=20=
word.=0A+=20word-end=20=20=20=20=20=20=20=20=20=20=20At=20the=20end=20of=20=
a=20word.=0A+=20word-boundary=20=20=20=20=20=20At=20the=20beginning=20or=20=
end=20of=20a=20word.=0A+=20not-word-boundary=20=20Not=20at=20the=20=
beginning=20or=20end=20of=20a=20word.=0A+=20symbol-start=20=20=20=20=20=20=
=20At=20the=20beginning=20of=20a=20symbol.=0A+=20symbol-end=20=20=20=20=20=
=20=20=20=20At=20the=20end=20of=20a=20symbol.=0A+=0A+(group=20RX...)=20=20=
Match=20RXs=20and=20define=20a=20capture=20group.=20=20Alias:=20=
submatch.=0A+(group-n=20N=20RX...)=20Match=20RXs=20and=20define=20=
capture=20group=20N.=20=20Alias:=20submatch-n.=0A+(backref=20N)=20=20=20=20=
Match=20the=20text=20that=20capture=20group=20N=20matched.=0A+=0A=
+(literal=20EXPR)=20Match=20the=20literal=20string=20from=20evaluating=20=
EXPR=20at=20run=20time.=0A+(regexp=20EXPR)=20=20Match=20the=20string=20=
regexp=20from=20evaluating=20EXPR=20at=20run=20time.=0A+(eval=20EXPR)=20=20=
=20=20Match=20the=20rx=20sexp=20from=20evaluating=20EXPR=20at=20compile=20=
time."=0A=20=20=20(let*=20((rx--compile-to-lisp=20t)=0A=20=20=20=20=20=20=
=20=20=20=20(re=20(cond=20((null=20regexps)=0A=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20(error=20"No=20regexp"))=0A--=20=0A=
2.20.1=20(Apple=20Git-117)=0A=0A=

--Apple-Mail=_A0D8A56C-E758-4D48-B700-ED23794126B7--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 19:12:47 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 15:12:47 2019
Received: from localhost ([127.0.0.1]:55910 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjq73-0001Q3-55
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 15:12:47 -0400
Received: from mail-io1-f41.google.com ([209.85.166.41]:36010)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <npostavs@HIDDEN>) id 1hjq71-0001Pm-TA
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 15:12:44 -0400
Received: by mail-io1-f41.google.com with SMTP id o9so10479879iom.3
 for <36496 <at> debbugs.gnu.org>; Sat, 06 Jul 2019 12:12:43 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=from:to:cc:subject:references:date:in-reply-to:message-id
 :user-agent:mime-version:content-transfer-encoding;
 bh=MM7gawRETZDRjOppwn/RaYcar8Cf58gyQIwEEe+Plyw=;
 b=STZxLuJvoYhgNFn3UmCXup1hPZy5lalnkuRTQSXD3mhLkcDV0j2lIXi0+lmOA57/c2
 /qammqL/Ffqy/VQXsM5loSNBHbke7/irA8O2KQbQNcJHPpNG4rFwxRp0Drsiw0FzQN8j
 6U3fURamjQB+lC6hSbcDBeLli60mr7nEbWnN3X8FESEpuex2V1EI7h8JEm094Keeg2jv
 M/Bcq3CepGI2nKKj7vLrL4w1DbGAomQnrpC5UUVc/SiifYKY2jfzgptZbRBJ/pAYWtzJ
 JhQdlbVnHZpHvYAPlnIxUe+hc/e6VVglYdZb4J24wVHkI+stSJzA5sBzmcyP9g1XCq9L
 frDg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to
 :message-id:user-agent:mime-version:content-transfer-encoding;
 bh=MM7gawRETZDRjOppwn/RaYcar8Cf58gyQIwEEe+Plyw=;
 b=CiD3cvc84C1rzOORhzKxB0u0/jwdAzKOOJnRtppF3mIo9I2FiwRIH0Z+vLALq9vaj+
 uSBgSjQgawJTGs+Dp03S1bkY77hR3JHYWAlVbKNPQl0I/Fyu2JpsN6o/oD31x272JW8B
 6VlfIn+MOyPYE2zMjzXcwNw019TCpuUScii7RhJBekLMTpevqwsHU6mtsjyy2mOge/Gj
 pFhiwFNL20ig1uCwdLuA4SWwvNhyYRaA6iQZ9wBEDZmvxOnWegw/OpHNzwLUKUp/m6ja
 ZbUy1aI6FO+kjOg1o9wRi13q58gtEN2Es86Hi0zfiyQ9W2qZ9qP8DRHuXcYUF76QgjK9
 8xaw==
X-Gm-Message-State: APjAAAXY4anZk99lv460jLCmXbNvwZxoGGFwb9lyh4eRfNEk/TEsyrlZ
 MNvaqXeKfTIeTA9oEiWZJBEb3dMA
X-Google-Smtp-Source: APXvYqxeehihVEkMFiFnZ+adFaUxQVmnereb+CyW1+n61yX0Bxc09NgI+yWlWd9VbsgLEKr0sKGkvQ==
X-Received: by 2002:a6b:7317:: with SMTP id e23mr9074654ioh.37.1562440358157; 
 Sat, 06 Jul 2019 12:12:38 -0700 (PDT)
Received: from minid (cbl-45-2-119-34.yyz.frontiernetworks.ca. [45.2.119.34])
 by smtp.gmail.com with ESMTPSA id
 z17sm17880676iol.73.2019.07.06.12.12.37
 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);
 Sat, 06 Jul 2019 12:12:37 -0700 (PDT)
From: Noam Postavsky <npostavs@HIDDEN>
To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
 <83k1cv8k5z.fsf@HIDDEN> <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN>
Date: Sat, 06 Jul 2019 15:12:36 -0400
In-Reply-To: <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN> ("Mattias
 \=\?utf-8\?Q\?Engdeg\=C3\=A5rd\=22's\?\= message of "Sat, 6 Jul 2019 20:56:57
 +0200")
Message-ID: <87bly73rkr.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.2.90 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 36496
Cc: Eli Zaretskii <eliz@HIDDEN>, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Mattias Engdeg=C3=A5rd <mattiase@HIDDEN> writes:

> Ah, you called out my little white lie. They are synonyms in practice,
> because almost nobody uses minimal-match, probably for good
> reasons. (xr used to generate {minimal|maximal}-match, but it was
> decidedly less readable so it got changed.)
>
> Yet you are right in the sense that the documentation should not lie
> or wilfully obscure the workings. There appears to be no good
> solution, because the underlying design isn't very good. It might be
> different if minimal-match affected the entire expression inside,
> including (or ...) and (** ...), but that will have to wait for the
> next big engine.
>
> The new patch versions describe the semantics more objectively, while
> still recommending the user to stay clear of minimal-match. Good
> enough?

> +(zero-or-more RX...) Match RXs zero or more times.  Alias: 0+
> +(one-or-more RX...)  Match RXs one or more times.  Alias: 1+
> +(zero-or-one RX...)  Match RXs or the empty string.  Alias: opt, optional
> +(* RX...)       Match RXs zero or more times; greedy.
> +(+ RX...)       Match RXs one or more times; greedy.
> +(? RX...)       Match RXs or the empty string; greedy.

Yep, that looks fine.





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 19:10:52 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 15:10:52 2019
Received: from localhost ([127.0.0.1]:55906 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjq5D-0001Mc-Mu
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 15:10:51 -0400
Received: from eggs.gnu.org ([209.51.188.92]:59654)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1hjq5B-0001MQ-F5
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 15:10:50 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:57944)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <eliz@HIDDEN>)
 id 1hjq56-0004NK-2D; Sat, 06 Jul 2019 15:10:44 -0400
Received: from [176.228.60.248] (port=4574 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1hjq55-000409-D2; Sat, 06 Jul 2019 15:10:43 -0400
Date: Sat, 06 Jul 2019 22:10:38 +0300
Message-Id: <83zhlr6ksx.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
In-reply-to: <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN> (message from
 Mattias =?utf-8?Q?Engdeg=C3=A5rd?= on Sat, 6 Jul 2019 20:56:57 +0200)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
 <83k1cv8k5z.fsf@HIDDEN> <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: npostavs@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Mattias Engdegård <mattiase@HIDDEN>
> Date: Sat, 6 Jul 2019 20:56:57 +0200
> Cc: 36496 <at> debbugs.gnu.org
> 
> >> * lisp/emacs-lisp/rx.el (rx): Replace long description with a condensed
> >> summary of the rx syntax, with reference to the manual section.
> > 
> > This is OK, but it is inconsistent wrt whether each construct's
> > description ends in a period.  I suggest to end them all with a
> > period.
> 
> Added, except at the end of the lists of aliases which looked better with a minimum of punctuation (and weren't sentences to begin with).

It still looks jarring:

  +(seq RX...)    Match the RXs in sequence.  Alias: :, sequence, and
  +(or RX...)     Match one of the RXs.  Alias: |
  +
  +(zero-or-more RX...) Match RXs zero or more times.  Alias: 0+
  +(one-or-more RX...)  Match RXs one or more times.  Alias: 1+
  +(zero-or-one RX...)  Match RXs or the empty string.  Alias: opt, optional

Honestly, they look like incorrect English: a sentence, starting with
a capital letter, but not ending with a period.  I hope you will
reconsider.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 18:57:06 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 14:57:06 2019
Received: from localhost ([127.0.0.1]:55901 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjpru-00010T-BQ
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 14:57:06 -0400
Received: from mail226c50.megamailservers.eu ([91.136.10.236]:49142
 helo=mail36c50.megamailservers.eu)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <mattiase@HIDDEN>) id 1hjprr-000101-AD
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 14:57:04 -0400
X-Authenticated-User: mattiase@HIDDEN
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu;
 s=maildub; t=1562439421;
 bh=UDPFuVQ0cJedObfoTbIWjjS3RBJKKZj6xsUyxw6r3tU=;
 h=From:Subject:Date:In-Reply-To:Cc:To:References:From;
 b=iDYIWcTFVPNWe02GchnVSOHyLlBRD4LVPv00fyunYm+9sSeJAf6Y3n0iI/iScBOj8
 r/TuIwj5e1iHI8ZPyrWwH7s9riRhBHrdEF5QiMB/IEFsRFFKywH4TdXPRd3w5/5dXN
 a4YM+144ANtxLjXRwhcgVrnPBrky0PgPCb27MiUE=
Feedback-ID: mattiase@HIDDEN
Received: from [192.168.0.4] ([188.150.171.71]) (authenticated bits=0)
 by mail36c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x66Iuw0B015445; 
 Sat, 6 Jul 2019 18:57:00 +0000
From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= <mattiase@HIDDEN>
Message-Id: <BFA06F4B-C7D1-435C-890C-46A3BEA263DA@HIDDEN>
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_C3A5B1B3-CE7A-4AEF-8797-B2A3EC205318"
Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\))
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
Date: Sat, 6 Jul 2019 20:56:57 +0200
In-Reply-To: <83k1cv8k5z.fsf@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>, Noam Postavsky <npostavs@HIDDEN>
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
 <83k1cv8k5z.fsf@HIDDEN>
X-Mailer: Apple Mail (2.3445.104.11)
X-CTCH-RefID: str=0001.0A0B0204.5D20EEFD.000C, ss=1, re=0.000, recu=0.000,
 reip=0.000, cl=1, cld=1, fgs=0
X-CTCH-VOD: Unknown
X-CTCH-Spam: Unknown
X-CTCH-Score: 0.000
X-CTCH-Rules: 
X-CTCH-Flags: 0
X-CTCH-ScoreCust: 0.000
X-CSC: 0
X-CHA: v=2.3 cv=BtuzP7f5 c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117
 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19
 a=mDV3o1hIAAAA:8 a=pGLkceISAAAA:8 a=XEgWC7l0mmBYts0gfiEA:9
 a=CjuIK1q_8ugA:10 a=onAXj40GUm9XzEiVQxgA:9 a=B2y7HmGcmWMA:10
 a=tCgv9tXcGVBhTxdMYLsA:9 a=_FVE-zBwftR9WsbkzFJk:22
X-Spam-Score: 0.3 (/)
X-Debbugs-Envelope-To: 36496
Cc: 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)


--Apple-Mail=_C3A5B1B3-CE7A-4AEF-8797-B2A3EC205318
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

6 juli 2019 kl. 13.41 skrev Eli Zaretskii <eliz@HIDDEN>:
>=20
> I believe you need the same conditional addition in elisp.texi, in the
> detailed menu there.

Thank you, forgot that one. Added.

>> * lisp/emacs-lisp/rx.el (rx): Replace long description with a =
condensed
>> summary of the rx syntax, with reference to the manual section.
>=20
> This is OK, but it is inconsistent wrt whether each construct's
> description ends in a period.  I suggest to end them all with a
> period.

Added, except at the end of the lists of aliases which looked better =
with a minimum of punctuation (and weren't sentences to begin with).

6 juli 2019 kl. 13.59 skrev Noam Postavsky <npostavs@HIDDEN>:
>=20
> *, +, and ? are not exact aliases of the above: they're always greedy
> (as opposed to depending on rx-greedy-flag).  I think it's a bit
> confusing to rely on the description of minimal-match and =
maximal-match
> to explain that.

Ah, you called out my little white lie. They are synonyms in practice, =
because almost nobody uses minimal-match, probably for good reasons. (xr =
used to generate {minimal|maximal}-match, but it was decidedly less =
readable so it got changed.)

Yet you are right in the sense that the documentation should not lie or =
wilfully obscure the workings. There appears to be no good solution, =
because the underlying design isn't very good. It might be different if =
minimal-match affected the entire expression inside, including (or ...) =
and (** ...), but that will have to wait for the next big engine.

The new patch versions describe the semantics more objectively, while =
still recommending the user to stay clear of minimal-match. Good enough?


--Apple-Mail=_C3A5B1B3-CE7A-4AEF-8797-B2A3EC205318
Content-Disposition: attachment;
	filename=0001-Describe-the-rx-notation-in-the-elisp-manual-bug-364.patch
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="0001-Describe-the-rx-notation-in-the-elisp-manual-bug-364.patch"
Content-Transfer-Encoding: quoted-printable

=46rom=208c01cf75ec3043c9f7ac5c3d8766616bf6a47e1e=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20=
<mattiase@HIDDEN>=0ADate:=20Thu,=204=20Jul=202019=2013:01:52=20+0200=0A=
Subject:=20[PATCH=201/2]=20Describe=20the=20rx=20notation=20in=20the=20=
elisp=20manual=20(bug#36496)=0A=0AThe=20additions=20are=20excluded=20=
from=20the=20print=20version=20to=20avoid=20making=20it=0Athicker.=0A=0A=
*=20doc/lispref/elisp.texi=20(Top):=20New=20menu=20entry.=0A*=20=
doc/lispref/searching.texi=20(Regular=20Expressions):=20New=20menu=20=
entry.=0A(Regexp=20Example):=20Add=20rx=20form=20of=20the=20example.=0A=
(Rx=20Notation,=20Rx=20Constructs,=20Rx=20Functions):=20New=20nodes.=0A*=20=
doc/lispref/control.texi=20(pcase=20Macro):=20Describe=20the=20rx=20=
pattern.=0A---=0A=20doc/lispref/control.texi=20=20=20|=20=2025=20++=0A=20=
doc/lispref/elisp.texi=20=20=20=20=20|=20=20=203=20+=0A=20=
doc/lispref/searching.texi=20|=20573=20=
+++++++++++++++++++++++++++++++++++++=0A=203=20files=20changed,=20601=20=
insertions(+)=0A=0Adiff=20--git=20a/doc/lispref/control.texi=20=
b/doc/lispref/control.texi=0Aindex=20e308d68b75..de6cd9301f=20100644=0A=
---=20a/doc/lispref/control.texi=0A+++=20b/doc/lispref/control.texi=0A@@=20=
-618,6=20+618,31=20@@=20pcase=20Macro=0A=20to=20@var{body-forms}=20(thus=20=
avoiding=20an=20evaluation=20error=20on=20match),=0A=20if=20any=20of=20=
the=20sub-patterns=20let-binds=20a=20set=20of=20symbols,=0A=20they=20=
@emph{must}=20all=20bind=20the=20same=20set=20of=20symbols.=0A+=0A=
+@ifnottex=0A+@anchor{rx=20in=20pcase}=0A+@item=20(rx=20=
@var{rx-expr}@dots{})=0A+Matches=20strings=20against=20the=20regexp=20=
@var{rx-expr}@dots{},=20using=20the=0A+@code{rx}=20regexp=20notation=20=
(@pxref{Rx=20Notation}),=20as=20if=20by=0A+@code{string-match}.=0A+=0A=
+In=20addition=20to=20the=20usual=20@code{rx}=20syntax,=20=
@var{rx-expr}@dots{}=20can=0A+contain=20the=20following=20constructs:=0A=
+=0A+@table=20@code=0A+@item=20(let=20@var{ref}=20@var{rx-expr}@dots{})=0A=
+Bind=20the=20symbol=20@var{ref}=20to=20a=20submatch=20that=20matches=0A=
+@var{rx-expr}@enddots{}.=20=20@var{ref}=20is=20bound=20in=20=
@var{body-forms}=20to=0A+the=20string=20of=20the=20submatch=20or=20nil,=20=
but=20can=20also=20be=20used=20in=0A+@code{backref}.=0A+=0A+@item=20=
(backref=20@var{ref})=0A+Like=20the=20standard=20@code{backref}=20=
construct,=20but=20@var{ref}=20can=20here=0A+also=20be=20a=20name=20=
introduced=20by=20a=20previous=20@code{(let=20@var{ref}=20@dots{})}=0A=
+construct.=0A+@end=20table=0A+@end=20ifnottex=0A+=0A=20@end=20table=0A=20=
=0A=20@anchor{pcase-example-0}=0Adiff=20--git=20a/doc/lispref/elisp.texi=20=
b/doc/lispref/elisp.texi=0Aindex=20e18759654d..c86f7f3dfb=20100644=0A---=20=
a/doc/lispref/elisp.texi=0A+++=20b/doc/lispref/elisp.texi=0A@@=20-1298,6=20=
+1298,9=20@@=20Top=0A=20=0A=20*=20Syntax=20of=20Regexps::=20=20=20=20=20=20=
=20Rules=20for=20writing=20regular=20expressions.=0A=20*=20Regexp=20=
Example::=20=20=20=20=20=20=20=20=20=20Illustrates=20regular=20=
expression=20syntax.=0A+@ifnottex=0A+*=20Rx=20Notation::=20=20=20=20=20=20=
=20=20=20=20=20=20=20An=20alternative,=20structured=20regexp=20notation.=0A=
+@end=20ifnottex=0A=20*=20Regexp=20Functions::=20=20=20=20=20=20=20=20=
Functions=20for=20operating=20on=20regular=20expressions.=0A=20=0A=20=
Syntax=20of=20Regular=20Expressions=0Adiff=20--git=20=
a/doc/lispref/searching.texi=20b/doc/lispref/searching.texi=0Aindex=20=
ef1cffc446..f95c9bf976=20100644=0A---=20a/doc/lispref/searching.texi=0A=
+++=20b/doc/lispref/searching.texi=0A@@=20-254,6=20+254,9=20@@=20Regular=20=
Expressions=0A=20@menu=0A=20*=20Syntax=20of=20Regexps::=20=20=20=20=20=20=
=20Rules=20for=20writing=20regular=20expressions.=0A=20*=20Regexp=20=
Example::=20=20=20=20=20=20=20=20=20=20Illustrates=20regular=20=
expression=20syntax.=0A+@ifnottex=0A+*=20Rx=20Notation::=20=20=20=20=20=20=
=20=20=20=20=20=20=20An=20alternative,=20structured=20regexp=20notation.=0A=
+@end=20ifnottex=0A=20*=20Regexp=20Functions::=20=20=20=20=20=20=20=20=
Functions=20for=20operating=20on=20regular=20expressions.=0A=20@end=20=
menu=0A=20=0A@@=20-359,6=20+362,7=20@@=20Regexp=20Special=0A=20preceding=20=
expression=20either=20once=20or=20not=20at=20all.=20=20For=20example,=0A=20=
@samp{ca?r}=20matches=20@samp{car}=20or=20@samp{cr};=20nothing=20else.=0A=
=20=0A+@anchor{Non-greedy=20repetition}=0A=20@item=20@samp{*?},=20=
@samp{+?},=20@samp{??}=0A=20@cindex=20non-greedy=20repetition=20=
characters=20in=20regexp=0A=20These=20are=20@dfn{non-greedy}=20variants=20=
of=20the=20operators=20@samp{*},=20@samp{+}=0A@@=20-951,6=20+955,575=20=
@@=20Regexp=20Example=0A=20beyond=20the=20minimum=20needed=20to=20end=20=
a=20sentence.=0A=20@end=20table=0A=20=0A+@ifnottex=0A+In=20the=20=
@code{rx}=20notation=20(@pxref{Rx=20Notation}),=20the=20regexp=20could=20=
be=20written=0A+=0A+@example=0A+@group=0A+(rx=20(any=20".?!")=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=20Punctuation=20ending=20=
sentence.=0A+=20=20=20=20(zero-or-more=20(any=20"\"')]@}"))=20=20;=20=
Closing=20quotes=20or=20brackets.=0A+=20=20=20=20(or=20line-end=0A+=20=20=
=20=20=20=20=20=20(seq=20"=20"=20line-end)=0A+=20=20=20=20=20=20=20=20=
"\t"=0A+=20=20=20=20=20=20=20=20"=20=20")=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20;=20Two=20spaces.=0A+=20=20=20=20=
(zero-or-more=20(any=20"\t\n=20")))=20=20;=20Optional=20extra=20=
whitespace.=0A+@end=20group=0A+@end=20example=0A+=0A+Since=20@code{rx}=20=
regexps=20are=20just=20S-expressions,=20they=20can=20be=20formatted=0A=
+and=20commented=20as=20such.=0A+@end=20ifnottex=0A+=0A+@ifnottex=0A=
+@node=20Rx=20Notation=0A+@subsection=20The=20@code{rx}=20Structured=20=
Regexp=20Notation=0A+@cindex=20rx=0A+@cindex=20regexp=20syntax=0A+=0A+=20=
=20As=20an=20alternative=20to=20the=20string-based=20syntax,=20Emacs=20=
provides=20the=0A+structured=20@code{rx}=20notation=20based=20on=20Lisp=20=
S-expressions.=20=20This=0A+notation=20is=20usually=20easier=20to=20=
read,=20write=20and=20maintain=20than=20regexp=0A+strings,=20and=20can=20=
be=20indented=20and=20commented=20freely.=20=20It=20requires=20a=0A=
+conversion=20into=20string=20form=20since=20that=20is=20what=20regexp=20=
functions=0A+expect,=20but=20that=20conversion=20typically=20takes=20=
place=20during=0A+byte-compilation=20rather=20than=20when=20the=20Lisp=20=
code=20using=20the=20regexp=20is=0A+run.=0A+=0A+=20=20Here=20is=20an=20=
@code{rx}=20regexp@footnote{It=20could=20be=20written=20much=0A+simpler=20=
with=20non-greedy=20operators=20(how?),=20but=20that=20would=20make=20=
the=0A+example=20less=20interesting.}=20that=20matches=20a=20block=20=
comment=20in=20the=20C=0A+programming=20language:=0A+=0A+@example=0A=
+@group=0A+(rx=20"/*"=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20;=20Initial=20/*=0A+=20=20=20=20(zero-or-more=0A=
+=20=20=20=20=20(or=20(not=20(any=20"*"))=20=20=20=20=20=20=20=20=20=20;=20=
=20Either=20non-*,=0A+=20=20=20=20=20=20=20=20=20(seq=20"*"=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20;=20=20or=20*=20followed=20by=0A+=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20(not=20(any=20"/")))))=20=20;=20=20=
non-/=0A+=20=20=20=20(one-or-more=20"*")=20=20=20=20=20=20=20=20=20=20=20=
=20=20;=20At=20least=20one=20star,=0A+=20=20=20=20"/")=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=20and=20the=20=
final=20/=0A+@end=20group=0A+@end=20example=0A+=0A+@noindent=0A+or,=20=
using=20shorter=20synonyms=20and=20written=20more=20compactly,=0A+=0A=
+@example=0A+@group=0A+(rx=20"/*"=0A+=20=20=20=20(*=20(|=20(not=20(any=20=
"*"))=0A+=20=20=20=20=20=20=20=20=20=20(:=20"*"=20(not=20(any=20"/")))))=0A=
+=20=20=20=20(+=20"*")=20"/")=0A+@end=20group=0A+@end=20example=0A+=0A=
+@noindent=0A+In=20conventional=20string=20syntax,=20it=20would=20be=20=
written=0A+=0A+@example=0A+"/\\*\\(?:[^*]\\|\\*[^/]\\)*\\*+/"=0A+@end=20=
example=0A+=0A+The=20@code{rx}=20notation=20is=20mainly=20useful=20in=20=
Lisp=20code;=20it=20cannot=20be=0A+used=20in=20most=20interactive=20=
situations=20where=20a=20regexp=20is=20requested,=20such=0A+as=20when=20=
running=20@code{query-replace-regexp}=20or=20in=20variable=0A=
+customisation.=0A+=0A+@menu=0A+*=20Rx=20Constructs::=20=20=20=20=20=20=20=
Constructs=20valid=20in=20rx=20forms.=0A+*=20Rx=20Functions::=20=20=20=20=
=20=20=20=20Functions=20and=20macros=20that=20use=20rx=20forms.=0A+@end=20=
menu=0A+=0A+@node=20Rx=20Constructs=0A+@subsubsection=20Constructs=20in=20=
@code{rx}=20regexps=0A+=0A+The=20various=20forms=20in=20@code{rx}=20=
regexps=20are=20described=20below.=20=20The=0A+shorthand=20@var{rx}=20=
represents=20any=20@code{rx}=20form,=20and=20@var{rx}@dots{}=0A+means=20=
one=20or=20more=20@code{rx}=20forms.=20=20Where=20the=20corresponding=20=
string=0A+regexp=20syntax=20is=20given,=20@var{A},=20@var{B},=20@dots{}=20=
are=20string=20regexp=0A+subexpressions.=0A+@c=20With=20the=20new=20=
implementation=20of=20rx,=20this=20can=20be=20changed=20from=0A+@c=20=
'one=20or=20more'=20to=20'zero=20or=20more'.=0A+=0A+@subsubheading=20=
Literals=0A+=0A+@table=20@asis=0A+@item=20@code{"some-string"}=0A+Match=20=
the=20string=20@samp{some-string}=20literally.=20=20There=20are=20no=0A=
+characters=20with=20special=20meaning,=20unlike=20in=20string=20=
regexps.=0A+=0A+@item=20@code{?C}=0A+Match=20the=20character=20@samp{C}=20=
literally.=0A+@end=20table=0A+=0A+@subsubheading=20Sequence=20and=20=
alternative=0A+=0A+@table=20@asis=0A+@item=20@code{(seq=20=
@var{rx}@dots{})}=0A+@cindex=20@code{seq}=20in=20rx=0A+@itemx=20=
@code{(sequence=20@var{rx}@dots{})}=0A+@cindex=20@code{sequence}=20in=20=
rx=0A+@itemx=20@code{(:=20@var{rx}@dots{})}=0A+@cindex=20@code{:}=20in=20=
rx=0A+@itemx=20@code{(and=20@var{rx}@dots{})}=0A+@cindex=20@code{and}=20=
in=20rx=0A+Match=20the=20@var{rx}s=20in=20sequence.=20=20Without=20=
arguments,=20the=20expression=0A+matches=20the=20empty=20string.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}@var{B}@dots{}}=0A=
+(subexpressions=20in=20sequence).=0A+=0A+@item=20@code{(or=20=
@var{rx}@dots{})}=0A+@cindex=20@code{or}=20in=20rx=0A+@itemx=20@code{(|=20=
@var{rx}@dots{})}=0A+@cindex=20@code{|}=20in=20rx=0A+Match=20exactly=20=
one=20of=20the=20@var{rx}s,=20trying=20from=20left=20to=20right.=0A=
+Without=20arguments,=20the=20expression=20will=20not=20match=20anything=20=
at=20all.@*=0A+Corresponding=20string=20regexp:=20=
@samp{@var{A}\|@var{B}\|@dots{}}.=0A+@end=20table=0A+=0A+@subsubheading=20=
Repetition=0A+=0A+Normally,=20repetition=20forms=20are=20greedy,=20in=20=
that=20they=20attempt=20to=20match=0A+as=20many=20times=20as=20possible.=20=
=20Some=20forms=20are=20non-greedy;=20they=20try=20to=0A+match=20as=20=
few=20times=20as=20possible=20(@pxref{Non-greedy=20repetition}).=0A+=0A=
+@table=20@code=0A+@item=20(zero-or-more=20@var{rx}@dots{})=0A+@cindex=20=
@code{zero-or-more}=20in=20rx=0A+@itemx=20(0+=20@var{rx}@dots{})=0A=
+@cindex=20@code{0+}=20in=20rx=0A+Match=20the=20@var{rx}s=20zero=20or=20=
more=20times.=20=20Greedy=20by=20default.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}*}=20(greedy),=0A+@samp{@var{A}*?}=20(non-greedy)=0A=
+=0A+@item=20(one-or-more=20@var{rx}@dots{})=0A+@cindex=20=
@code{one-or-more}=20in=20rx=0A+@itemx=20(1+=20@var{rx}@dots{})=0A=
+@cindex=20@code{1+}=20in=20rx=0A+Match=20the=20@var{rx}s=20one=20or=20=
more=20times.=20=20Greedy=20by=20default.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}+}=20(greedy),=0A+@samp{@var{A}+?}=20(non-greedy)=0A=
+=0A+@item=20(zero-or-one=20@var{rx}@dots{})=0A+@cindex=20=
@code{zero-or-one}=20in=20rx=0A+@itemx=20(optional=20@var{rx}@dots{})=0A=
+@cindex=20@code{optional}=20in=20rx=0A+@itemx=20(opt=20@var{rx}@dots{})=0A=
+@cindex=20@code{opt}=20in=20rx=0A+Match=20the=20@var{rx}s=20once=20or=20=
an=20empty=20string.=20=20Greedy=20by=20default.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}?}=20(greedy),=0A+@samp{@var{A}??}=20=
(non-greedy).=0A+=0A+@item=20(*=20@var{rx}@dots{})=0A+@cindex=20@code{*}=20=
in=20rx=0A+Match=20the=20@var{rx}s=20zero=20or=20more=20times.=20=20=
Greedy.@*=0A+Corresponding=20string=20regexp:=20@samp{@var{A}*}=0A+=0A=
+@item=20(+=20@var{rx}@dots{})=0A+@cindex=20@code{+}=20in=20rx=0A+Match=20=
the=20@var{rx}s=20one=20or=20more=20times.=20=20Greedy.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}+}=0A+=0A+@item=20(?=20=
@var{rx}@dots{})=0A+@cindex=20@code{?}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20once=20or=20an=20empty=20string.=20=20Greedy.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}?}=0A+=0A+@item=20(*?=20=
@var{rx}@dots{})=0A+@cindex=20@code{*?}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20zero=20or=20more=20times.=20=20Non-greedy.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}*?}=0A+=0A+@item=20(+?=20=
@var{rx}@dots{})=0A+@cindex=20@code{+?}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20one=20or=20more=20times.=20=20Non-greedy.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}+?}=0A+=0A+@item=20(??=20=
@var{rx}@dots{})=0A+@cindex=20@code{??}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20or=20an=20empty=20string.=20=20Non-greedy.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}??}=0A+=0A+@item=20(=3D=20=
@var{n}=20@var{rx}@dots{})=0A+@cindex=20@code{=3D}=20in=20rx=0A+@itemx=20=
(repeat=20@var{n}=20@var{rx})=0A+Match=20the=20@var{rx}s=20exactly=20=
@var{n}=20times.@*=0A+Corresponding=20string=20regexp:=20=
@samp{@var{A}\@{@var{n}\@}}=0A+=0A+@item=20(>=3D=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@code{>=3D}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20@var{n}=20or=20more=20times.=20=20Greedy.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}\@{@var{n},\@}}=0A+=0A+@item=20(**=20=
@var{n}=20@var{m}=20@var{rx}@dots{})=0A+@cindex=20@code{**}=20in=20rx=0A=
+@itemx=20(repeat=20@var{n}=20@var{m}=20@var{rx}@dots{})=0A+@cindex=20=
@code{repeat}=20in=20rx=0A+Match=20the=20@var{rx}s=20at=20least=20=
@var{n}=20but=20no=20more=20than=20@var{m}=20times.=20=20Greedy.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}\@{@var{n},@var{m}\@}}=0A=
+@end=20table=0A+=0A+The=20greediness=20of=20some=20repetition=20forms=20=
can=20be=20controlled=20using=20the=0A+following=20constructs.=20=20=
However,=20it=20is=20usually=20better=20to=20use=20the=0A+explicit=20=
non-greedy=20forms=20above=20when=20such=20matching=20is=20required.=0A+=0A=
+@table=20@code=0A+@item=20(minimal-match=20@var{rx})=0A+@cindex=20=
@code{minimal-match}=20in=20rx=0A+Match=20@var{rx},=20with=20=
@code{zero-or-more},=20@code{0+},=0A+@code{one-or-more},=20@code{1+},=20=
@code{zero-or-one},=20@code{opt}=20and=0A+@code{option}=20using=20=
non-greedy=20matching.=0A+=0A+@item=20(maximal-match=20@var{rx})=0A=
+@cindex=20@code{maximal-match}=20in=20rx=0A+Match=20@var{rx},=20with=20=
@code{zero-or-more},=20@code{0+},=0A+@code{one-or-more},=20@code{1+},=20=
@code{zero-or-one},=20@code{opt}=20and=0A+@code{option}=20using=20=
non-greedy=20matching.=20=20This=20is=20the=20default.=0A+@end=20table=0A=
+=0A+@subsubheading=20Matching=20single=20characters=0A+=0A+@table=20=
@asis=0A+@item=20@code{(any=20@var{set}@dots{})}=0A+@cindex=20@code{any}=20=
in=20rx=0A+@itemx=20@code{(char=20@var{set}@dots{})}=0A+@cindex=20=
@code{char}=20in=20rx=0A+@itemx=20@code{(in=20@var{set}@dots{})}=0A=
+@cindex=20@code{in}=20in=20rx=0A+@cindex=20character=20class=20in=20rx=0A=
+Match=20a=20single=20character=20from=20one=20of=20the=20@var{set}s.=20=20=
Each=20@var{set}=0A+is=20a=20character,=20a=20string=20representing=20=
the=20set=20of=20its=20characters,=20a=0A+range=20or=20a=20character=20=
class=20(see=20below).=20=20A=20range=20is=20either=20a=0A=
+hyphen-separated=20string=20like=20@code{"A-Z"},=20or=20a=20cons=20of=20=
characters=0A+like=20@code{(?A=20.=20?Z)}.=0A+=0A+Note=20that=20hyphen=20=
(@code{-})=20is=20special=20in=20strings=20in=20this=20construct,=0A=
+since=20it=20acts=20as=20a=20range=20separator.=20=20To=20include=20a=20=
hyphen,=20add=20it=20as=20a=0A+separate=20character=20or=20=
single-character=20string.@*=0A+Corresponding=20string=20regexp:=20=
@samp{[@dots{}]}=0A+=0A+@item=20@code{(not=20@var{charspec})}=0A+@cindex=20=
@code{not}=20in=20rx=0A+Match=20a=20character=20not=20included=20in=20=
@var{charspec}.=20=20@var{charspec}=20can=0A+be=20an=20@code{any},=20=
@code{syntax}=20or=20@code{category}=20form,=20or=20a=0A+character=20=
class.@*=0A+Corresponding=20string=20regexp:=20@samp{[^@dots{}]},=20=
@samp{\S@var{code}},=0A+@samp{\C@var{code}}=0A+=0A+@item=20=
@code{not-newline},=20@code{nonl}=0A+@cindex=20@code{not-newline}=20in=20=
rx=0A+@cindex=20@code{nonl}=20in=20rx=0A+Match=20any=20character=20=
except=20a=20newline.@*=0A+Corresponding=20string=20regexp:=20@samp{.}=20=
(dot)=0A+=0A+@item=20@code{anything}=0A+@cindex=20@code{anything}=20in=20=
rx=0A+Match=20any=20character.@*=0A+Corresponding=20string=20regexp:=20=
@samp{.\|\n}=20(for=20example)=0A+=0A+@item=20character=20class=0A=
+@cindex=20character=20class=20in=20rx=0A+Match=20a=20character=20from=20=
a=20named=20character=20class:=0A+=0A+@table=20@asis=0A+@item=20=
@code{alpha},=20@code{alphabetic},=20@code{letter}=0A+Match=20alphabetic=20=
characters.=20=20More=20precisely,=20match=20characters=20whose=0A=
+Unicode=20@samp{general-category}=20property=20indicates=20that=20they=20=
are=0A+alphabetic.=0A+=0A+@item=20@code{alnum},=20@code{alphanumeric}=0A=
+Match=20alphabetic=20characters=20and=20digits.=20=20More=20precisely,=20=
match=0A+characters=20whose=20Unicode=20@samp{general-category}=20=
property=20indicates=0A+that=20they=20are=20alphabetic=20or=20decimal=20=
digits.=0A+=0A+@item=20@code{digit},=20@code{numeric},=20@code{num}=0A=
+Match=20the=20digits=20@samp{0}--@samp{9}.=0A+=0A+@item=20=
@code{xdigit},=20@code{hex-digit},=20@code{hex}=0A+Match=20the=20=
hexadecimal=20digits=20@samp{0}--@samp{9},=20@samp{A}--@samp{F}=0A+and=20=
@samp{a}--@samp{f}.=0A+=0A+@item=20@code{cntrl},=20@code{control}=0A=
+Match=20any=20character=20whose=20code=20is=20in=20the=20range=200--31.=0A=
+=0A+@item=20@code{blank}=0A+Match=20horizontal=20whitespace.=20=20More=20=
precisely,=20match=20characters=20whose=0A+Unicode=20=
@samp{general-category}=20property=20indicates=20that=20they=20are=0A=
+spacing=20separators.=0A+=0A+@item=20@code{space},=20@code{whitespace},=20=
@code{white}=0A+Match=20any=20character=20that=20has=20whitespace=20=
syntax=0A+(@pxref{Syntax=20Class=20Table}).=0A+=0A+@item=20@code{lower},=20=
@code{lower-case}=0A+Match=20anything=20lower-case,=20as=20determined=20=
by=20the=20current=20case=20table.=0A+If=20@code{case-fold-search}=20is=20=
non-nil,=20this=20also=20matches=20any=0A+upper-case=20letter.=0A+=0A=
+@item=20@code{upper},=20@code{upper-case}=0A+Match=20anything=20=
upper-case,=20as=20determined=20by=20the=20current=20case=20table.=0A+If=20=
@code{case-fold-search}=20is=20non-nil,=20this=20also=20matches=20any=0A=
+lower-case=20letter.=0A+=0A+@item=20@code{graph},=20@code{graphic}=0A=
+Match=20any=20character=20except=20whitespace,=20@acronym{ASCII}=20and=0A=
+non-@acronym{ASCII}=20control=20characters,=20surrogates,=20and=20=
codepoints=0A+unassigned=20by=20Unicode,=20as=20indicated=20by=20the=20=
Unicode=0A+@samp{general-category}=20property.=0A+=0A+@item=20=
@code{print},=20@code{printing}=0A+Match=20whitespace=20or=20a=20=
character=20matched=20by=20@code{graph}.=0A+=0A+@item=20@code{punct},=20=
@code{punctuation}=0A+Match=20any=20punctuation=20character.=20=20(At=20=
present,=20for=20multibyte=0A+characters,=20anything=20that=20has=20=
non-word=20syntax.)=0A+=0A+@item=20@code{word},=20@code{wordchar}=0A=
+Match=20any=20character=20that=20has=20word=20syntax=20(@pxref{Syntax=20=
Class=20Table}).=0A+=0A+@item=20@code{ascii}=0A+Match=20any=20=
@acronym{ASCII}=20character=20(codes=200--127).=0A+=0A+@item=20=
@code{nonascii}=0A+Match=20any=20non-@acronym{ASCII}=20character=20(but=20=
not=20raw=20bytes).=0A+@end=20table=0A+=0A+Corresponding=20string=20=
regexp:=20@samp{[[:@var{class}:]]}=0A+=0A+@item=20@code{(syntax=20=
@var{syntax})}=0A+@cindex=20@code{syntax}=20in=20rx=0A+Match=20a=20=
character=20with=20syntax=20@var{syntax},=20being=20one=20of=20the=20=
following=0A+names:=0A+=0A+@multitable=20{@code{close-parenthesis}}=20=
{Syntax=20character}=0A+@headitem=20Syntax=20name=20=20=20=20=20=20=20=20=
=20=20@tab=20Syntax=20character=0A+@item=20@code{whitespace}=20=20=20=20=20=
=20=20=20@tab=20@code{-}=0A+@item=20@code{punctuation}=20=20=20=20=20=20=20=
@tab=20@code{.}=0A+@item=20@code{word}=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20@tab=20@code{w}=0A+@item=20@code{symbol}=20=20=20=20=20=20=20=20=20=
=20=20=20@tab=20@code{_}=0A+@item=20@code{open-parenthesis}=20=20@tab=20=
@code{(}=0A+@item=20@code{close-parenthesis}=20@tab=20@code{)}=0A+@item=20=
@code{expression-prefix}=20@tab=20@code{'}=0A+@item=20=
@code{string-quote}=20=20=20=20=20=20@tab=20@code{"}=0A+@item=20=
@code{paired-delimiter}=20=20@tab=20@code{$}=0A+@item=20@code{escape}=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{\}=0A+@item=20=
@code{character-quote}=20=20=20@tab=20@code{/}=0A+@item=20=
@code{comment-start}=20=20=20=20=20@tab=20@code{<}=0A+@item=20=
@code{comment-end}=20=20=20=20=20=20=20@tab=20@code{>}=0A+@item=20=
@code{string-delimiter}=20=20@tab=20@code{|}=0A+@item=20=
@code{comment-delimiter}=20@tab=20@code{!}=0A+@end=20multitable=0A+=0A=
+For=20details,=20@pxref{Syntax=20Class=20Table}.=20=20Please=20note=20=
that=0A+@code{(syntax=20punctuation)}=20is=20@emph{not}=20equivalent=20=
to=20the=20character=20class=0A+@code{punctuation}.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\s@var{code}}=0A+=0A+@item=20@code=20{(category=20=
@var{category})}=0A+@cindex=20@code{category}=20in=20rx=0A+Match=20a=20=
character=20in=20category=20@var{category},=20which=20is=20either=20one=20=
of=0A+the=20names=20below=20or=20its=20category=20character.=0A+=0A=
+@multitable=20{@code{vowel-modifying-diacritical-mark}}=20{Category=20=
character}=0A+@headitem=20Category=20name=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20@tab=20Category=20character=0A+@item=20=
@code{space-for-indent}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20space=0A+@item=20@code{base}=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{.}=0A+@item=20=
@code{consonant}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{0}=0A+@item=20@code{base-vowel}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{1}=0A=
+@item=20@code{upper-diacritical-mark}=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{2}=0A+@item=20@code{lower-diacritical-mark}=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{3}=0A+@item=20@code{tone-mark}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{4}=0A=
+@item=20@code{symbol}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{5}=0A+@item=20@code{digit}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{6}=0A+@item=20@code{vowel-modifying-diacritical-mark}=20=
@tab=20@code{7}=0A+@item=20@code{vowel-sign}=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{8}=0A+@item=20=
@code{semivowel-lower}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{9}=0A+@item=20@code{not-at-end-of-line}=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20@tab=20@code{<}=0A+@item=20=
@code{not-at-beginning-of-line}=20=20=20=20=20=20=20=20=20@tab=20=
@code{>}=0A+@item=20@code{alpha-numeric-two-byte}=20=20=20=20=20=20=20=20=
=20=20=20@tab=20@code{A}=0A+@item=20@code{chinese-two-byte}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{C}=0A+@item=20=
@code{greek-two-byte}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{G}=0A+@item=20@code{japanese-hiragana-two-byte}=20=20=20=20=
=20=20=20@tab=20@code{H}=0A+@item=20@code{indian-two-byte}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{I}=0A+@item=20=
@code{japanese-katakana-two-byte}=20=20=20=20=20=20=20@tab=20@code{K}=0A=
+@item=20@code{strong-left-to-right}=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{L}=0A+@item=20@code{korean-hangul-two-byte}=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{N}=0A+@item=20@code{strong-right-to-left}=20=20=
=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{R}=0A+@item=20=
@code{cyrillic-two-byte}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{Y}=0A+@item=20@code{combining-diacritic}=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{^}=0A+@item=20@code{ascii}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{a}=0A+@item=20@code{arabic}=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{b}=0A+@item=20=
@code{chinese}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20@tab=20@code{c}=0A+@item=20@code{ethiopic}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20=
@code{e}=0A+@item=20@code{greek}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{g}=0A+@item=20=
@code{korean}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{h}=0A+@item=20@code{indian}=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{i}=0A+@item=20@code{japanese}=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{j}=0A+@item=20=
@code{japanese-katakana}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{k}=0A+@item=20@code{latin}=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{l}=0A+@item=20=
@code{lao}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20@tab=20@code{o}=0A+@item=20@code{tibetan}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{q}=0A+@item=20@code{japanese-roman}=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{r}=0A+@item=20@code{thai}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20@tab=20@code{t}=0A+@item=20@code{vietnamese}=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{v}=0A+@item=20=
@code{hebrew}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{w}=0A+@item=20@code{cyrillic}=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20=
@code{y}=0A+@item=20@code{can-break}=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{|}=0A+@end=20multitable=0A=
+=0A+For=20more=20information=20about=20currently=20defined=20=
categories,=20run=20the=0A+command=20@kbd{M-x=20describe-categories=20=
@key{RET}}.=20=20For=20how=20to=20define=0A+new=20categories,=20=
@pxref{Categories}.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\c@var{code}}=0A+@end=20table=0A+=0A+@subsubheading=20Zero-width=20=
assertions=0A+=0A+These=20all=20match=20the=20empty=20string,=20but=20=
only=20in=20specific=20places.=0A+=0A+@table=20@asis=0A+@item=20=
@code{line-start},=20@code{bol}=0A+@cindex=20@code{line-start}=20in=20rx=0A=
+@cindex=20@code{bol}=20in=20rx=0A+Match=20at=20the=20beginning=20of=20a=20=
line.@*=0A+Corresponding=20string=20regexp:=20@samp{^}=0A+=0A+@item=20=
@code{line-end},=20@code{eol}=0A+@cindex=20@code{line-end}=20in=20rx=0A=
+@cindex=20@code{eol}=20in=20rx=0A+Match=20at=20the=20end=20of=20a=20=
line.@*=0A+Corresponding=20string=20regexp:=20@samp{$}=0A+=0A+@item=20=
@code{string-start},=20@code{bos},=20@code{buffer-start},=20@code{bot}=0A=
+@cindex=20@code{string-start}=20in=20rx=0A+@cindex=20@code{bos}=20in=20=
rx=0A+@cindex=20@code{buffer-start}=20in=20rx=0A+@cindex=20@code{bot}=20=
in=20rx=0A+Match=20at=20the=20start=20of=20the=20string=20or=20buffer=20=
being=20matched=20against.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\`}=0A+=0A+@item=20@code{string-end},=20@code{eos},=20=
@code{buffer-end},=20@code{eot}=0A+@cindex=20@code{string-end}=20in=20rx=0A=
+@cindex=20@code{eos}=20in=20rx=0A+@cindex=20@code{buffer-end}=20in=20rx=0A=
+@cindex=20@code{eot}=20in=20rx=0A+Match=20at=20the=20end=20of=20the=20=
string=20or=20buffer=20being=20matched=20against.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\'}=0A+=0A+@item=20@code{point}=0A+@cindex=20=
@code{point}=20in=20rx=0A+Match=20at=20point.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\=3D}=0A+=0A+@item=20@code{word-start}=0A=
+@cindex=20@code{word-start}=20in=20rx=0A+Match=20at=20the=20beginning=20=
of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20@samp{\<}=0A+=0A=
+@item=20@code{word-end}=0A+@cindex=20@code{word-end}=20in=20rx=0A+Match=20=
at=20the=20end=20of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\>}=0A+=0A+@item=20@code{word-boundary}=0A+@cindex=20=
@code{word-boundary}=20in=20rx=0A+Match=20at=20the=20beginning=20or=20=
end=20of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20@samp{\b}=0A=
+=0A+@item=20@code{not-word-boundary}=0A+@cindex=20=
@code{not-word-boundary}=20in=20rx=0A+Match=20anywhere=20but=20at=20the=20=
beginning=20or=20end=20of=20a=20word.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\B}=0A+=0A+@item=20@code{symbol-start}=0A+@cindex=20=
@code{symbol-start}=20in=20rx=0A+Match=20at=20the=20beginning=20of=20a=20=
symbol.@*=0A+Corresponding=20string=20regexp:=20@samp{\_<}=0A+=0A+@item=20=
@code{symbol-end}=0A+@cindex=20@code{symbol-end}=20in=20rx=0A+Match=20at=20=
the=20end=20of=20a=20symbol.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\_>}=0A+@end=20table=0A+=0A+@subsubheading=20Capture=20groups=0A+=0A=
+@table=20@code=0A+@item=20(group=20@var{rx}@dots{})=0A+@cindex=20=
@code{group}=20in=20rx=0A+@itemx=20(submatch=20@var{rx}@dots{})=0A=
+@cindex=20@code{submatch}=20in=20rx=0A+Match=20the=20@var{rx}s,=20=
making=20the=20matched=20text=20and=20position=20accessible=0A+in=20the=20=
match=20data.=20=20The=20first=20group=20in=20a=20regexp=20is=20numbered=20=
1;=0A+subsequent=20groups=20will=20be=20numbered=20one=20higher=20than=20=
the=20previous=0A+group.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\(@dots{}\)}=0A+=0A+@item=20(group-n=20@var{n}=20@var{rx}@dots{})=0A=
+@cindex=20@code{group-n}=20in=20rx=0A+@itemx=20(submatch-n=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@code{submatch-n}=20in=20rx=0A+Like=20=
@code{group},=20but=20explicitly=20assign=20the=20group=20number=20=
@var{n}.=0A+@var{n}=20must=20be=20positive.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\(?@var{n}:@dots{}\)}=0A+=0A+@item=20(backref=20@var{n})=0A=
+@cindex=20@code{backref}=20in=20rx=0A+Match=20the=20text=20previously=20=
matched=20by=20group=20number=20@var{n}.=0A+@var{n}=20must=20be=20in=20=
the=20range=201--9.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\@var{n}}=0A+@end=20table=0A+=0A+@subsubheading=20Dynamic=20=
inclusion=0A+=0A+@table=20@code=0A+@item=20(literal=20@var{expr})=0A=
+@cindex=20@code{literal}=20in=20rx=0A+Match=20the=20literal=20string=20=
that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A+expression=20=
@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20call=20time,=20=
in=0A+the=20current=20lexical=20environment.=0A+=0A+@item=20(regexp=20=
@var{expr})=0A+@cindex=20@code{regexp}=20in=20rx=0A+@itemx=20(regex=20=
@var{expr})=0A+@cindex=20@code{regex}=20in=20rx=0A+Match=20the=20string=20=
regexp=20that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A=
+expression=20@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20=
call=20time,=20in=0A+the=20current=20lexical=20environment.=0A+=0A+@item=20=
(eval=20@var{expr})=0A+@cindex=20@code{eval}=20in=20rx=0A+Match=20the=20=
rx=20form=20that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A=
+expression=20@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20=
macro-expansion=0A+time=20for=20@code{rx},=20at=20call=20time=20for=20=
@code{rx-to-string},=0A+in=20the=20current=20global=20environment.=0A=
+@end=20table=0A+=0A+@node=20Rx=20Functions=0A+@subsubsection=20=
Functions=20and=20macros=20using=20@code{rx}=20regexps=0A+=0A+@defmac=20=
rx=20rx-expr@dots{}=0A+Translate=20the=20@var{rx-expr}s=20to=20a=20=
string=20regexp,=20as=20if=20they=20were=20the=0A+body=20of=20a=20=
@code{(seq=20@dots{})}=20form.=20=20The=20@code{rx}=20macro=20expands=20=
to=20a=0A+string=20constant,=20or,=20if=20@code{literal}=20or=20=
@code{regexp}=20forms=20are=0A+used,=20a=20Lisp=20expression=20that=20=
evaluates=20to=20a=20string.=0A+@end=20defmac=0A+=0A+@defun=20=
rx-to-string=20rx-expr=20&optional=20no-group=0A+Translate=20=
@var{rx-expr}=20to=20a=20string=20regexp=20which=20is=20returned.=0A+If=20=
@var{no-group}=20is=20absent=20or=20nil,=20bracket=20the=20result=20in=20=
a=0A+non-capturing=20group,=20@samp{\(?:@dots{}\)},=20if=20necessary=20=
to=20ensure=20that=0A+a=20postfix=20operator=20appended=20to=20it=20will=20=
apply=20to=20the=20whole=20expression.=0A+=0A+Arguments=20to=20=
@code{literal}=20and=20@code{regexp}=20forms=20in=20@var{rx-expr}=0A=
+must=20be=20string=20literals.=0A+@end=20defun=0A+=0A+The=20=
@code{pcase}=20macro=20can=20use=20@code{rx}=20expressions=20as=20=
patterns=0A+directly;=20@pxref{rx=20in=20pcase}.=0A+@end=20ifnottex=0A+=0A=
=20@node=20Regexp=20Functions=0A=20@subsection=20Regular=20Expression=20=
Functions=0A=20=0A--=20=0A2.20.1=20(Apple=20Git-117)=0A=0A=

--Apple-Mail=_C3A5B1B3-CE7A-4AEF-8797-B2A3EC205318
Content-Disposition: attachment;
	filename=0002-Shorter-rx-doc-string-bug-36496.patch
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="0002-Shorter-rx-doc-string-bug-36496.patch"
Content-Transfer-Encoding: quoted-printable

=46rom=208cf5f5583a5c042ea856155eb9a78b21fc38310f=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20=
<mattiase@HIDDEN>=0ADate:=20Sat,=206=20Jul=202019=2013:22:15=20+0200=0A=
Subject:=20[PATCH=202/2]=20Shorter=20`rx'=20doc=20string=20(bug#36496)=0A=
=0A*=20lisp/emacs-lisp/rx.el=20(rx):=20Replace=20long=20description=20=
with=20a=20condensed=0Asummary=20of=20the=20rx=20syntax,=20with=20=
reference=20to=20the=20manual=20section.=0A---=0A=20=
lisp/emacs-lisp/rx.el=20|=20417=20=
++++++++++--------------------------------=0A=201=20file=20changed,=2096=20=
insertions(+),=20321=20deletions(-)=0A=0Adiff=20--git=20=
a/lisp/emacs-lisp/rx.el=20b/lisp/emacs-lisp/rx.el=0Aindex=20=
24dd6cbf1d..8fccf9c470=20100644=0A---=20a/lisp/emacs-lisp/rx.el=0A+++=20=
b/lisp/emacs-lisp/rx.el=0A@@=20-959,327=20+959,102=20@@=20rx-to-string=0A=
=20;;;###autoload=0A=20(defmacro=20rx=20(&rest=20regexps)=0A=20=20=20=
"Translate=20regular=20expressions=20REGEXPS=20in=20sexp=20form=20to=20a=20=
regexp=20string.=0A-REGEXPS=20is=20a=20non-empty=20sequence=20of=20forms=20=
of=20the=20sort=20listed=20below.=0A-=0A-Note=20that=20`rx'=20is=20a=20=
Lisp=20macro;=20when=20used=20in=20a=20Lisp=20program=20being=0A=
-compiled,=20the=20translation=20is=20performed=20by=20the=20compiler.=20=
=20The=0A-`literal'=20and=20`regexp'=20forms=20accept=20subforms=20that=20=
will=20evaluate=0A-to=20strings,=20in=20addition=20to=20constant=20=
strings.=20=20If=20REGEXPS=20include=0A-such=20forms,=20then=20the=20=
result=20is=20an=20expression=20which=20returns=20a=0A-regexp=20string,=20=
rather=20than=20a=20regexp=20string=20directly.=20=20See=0A=
-`rx-to-string'=20for=20performing=20translation=20completely=20at=20run=20=
time.=0A-=0A-The=20following=20are=20valid=20subforms=20of=20regular=20=
expressions=20in=20sexp=0A-notation.=0A-=0A-STRING=0A-=20=20=20=20=20=
matches=20string=20STRING=20literally.=0A-=0A-CHAR=0A-=20=20=20=20=20=
matches=20character=20CHAR=20literally.=0A-=0A-`not-newline',=20`nonl'=0A=
-=20=20=20=20=20matches=20any=20character=20except=20a=20newline.=0A-=0A=
-`anything'=0A-=20=20=20=20=20matches=20any=20character=0A-=0A-`(any=20=
SET=20...)'=0A-`(in=20SET=20...)'=0A-`(char=20SET=20...)'=0A-=20=20=20=20=
=20matches=20any=20character=20in=20SET=20....=20=20SET=20may=20be=20a=20=
character=20or=20string.=0A-=20=20=20=20=20Ranges=20of=20characters=20=
can=20be=20specified=20as=20`A-Z'=20in=20strings.=0A-=20=20=20=20=20=
Ranges=20may=20also=20be=20specified=20as=20conses=20like=20`(?A=20.=20=
?Z)'.=0A-=20=20=20=20=20Reversed=20ranges=20like=20`Z-A'=20and=20`(?Z=20=
.=20?A)'=20are=20not=20permitted.=0A-=0A-=20=20=20=20=20SET=20may=20also=20=
be=20the=20name=20of=20a=20character=20class:=20`digit',=0A-=20=20=20=20=20=
`control',=20`hex-digit',=20`blank',=20`graph',=20`print',=20`alnum',=0A=
-=20=20=20=20=20`alpha',=20`ascii',=20`nonascii',=20`lower',=20`punct',=20=
`space',=20`upper',=0A-=20=20=20=20=20`word',=20or=20one=20of=20their=20=
synonyms.=0A-=0A-`(not=20(any=20SET=20...))'=0A-=20=20=20=20=20matches=20=
any=20character=20not=20in=20SET=20...=0A-=0A-`line-start',=20`bol'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
beginning=20of=20a=20line=0A-=20=20=20=20=20in=20the=20text=20being=20=
matched=0A-=0A-`line-end',=20`eol'=0A-=20=20=20=20=20is=20similar=20to=20=
`line-start'=20but=20matches=20only=20at=20the=20end=20of=20a=20line=0A-=0A=
-`string-start',=20`bos',=20`bot'=0A-=20=20=20=20=20matches=20the=20=
empty=20string,=20but=20only=20at=20the=20beginning=20of=20the=0A-=20=20=20=
=20=20string=20being=20matched=20against.=0A-=0A-`string-end',=20`eos',=20=
`eot'=0A-=20=20=20=20=20matches=20the=20empty=20string,=20but=20only=20=
at=20the=20end=20of=20the=0A-=20=20=20=20=20string=20being=20matched=20=
against.=0A-=0A-`buffer-start'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20the=20beginning=20of=20the=0A-=20=20=20=20=20=
buffer=20being=20matched=20against.=20=20Actually=20equivalent=20to=20=
`string-start'.=0A-=0A-`buffer-end'=0A-=20=20=20=20=20matches=20the=20=
empty=20string,=20but=20only=20at=20the=20end=20of=20the=0A-=20=20=20=20=20=
buffer=20being=20matched=20against.=20=20Actually=20equivalent=20to=20=
`string-end'.=0A-=0A-`point'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20point.=0A-=0A-`word-start',=20`bow'=0A-=20=20=
=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
beginning=20of=20a=20word.=0A-=0A-`word-end',=20`eow'=0A-=20=20=20=20=20=
matches=20the=20empty=20string,=20but=20only=20at=20the=20end=20of=20a=20=
word.=0A-=0A-`word-boundary'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20the=20beginning=20or=20end=20of=20a=0A-=20=20=
=20=20=20word.=0A-=0A-`(not=20word-boundary)'=0A-`not-word-boundary'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20not=20at=20the=20=
beginning=20or=20end=20of=20a=0A-=20=20=20=20=20word.=0A-=0A=
-`symbol-start'=0A-=20=20=20=20=20matches=20the=20empty=20string,=20but=20=
only=20at=20the=20beginning=20of=20a=20symbol.=0A-=0A-`symbol-end'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
end=20of=20a=20symbol.=0A-=0A-`digit',=20`numeric',=20`num'=0A-=20=20=20=20=
=20matches=200=20through=209.=0A-=0A-`control',=20`cntrl'=0A-=20=20=20=20=
=20matches=20any=20character=20whose=20code=20is=20in=20the=20range=20=
0-31.=0A-=0A-`hex-digit',=20`hex',=20`xdigit'=0A-=20=20=20=20=20matches=20=
0=20through=209,=20a=20through=20f=20and=20A=20through=20F.=0A-=0A=
-`blank'=0A-=20=20=20=20=20matches=20horizontal=20whitespace,=20as=20=
defined=20by=20Annex=20C=20of=20the=0A-=20=20=20=20=20Unicode=20=
Technical=20Standard=20#18.=20=20In=20particular,=20it=20matches=0A-=20=20=
=20=20=20spaces,=20tabs,=20and=20other=20characters=20whose=20Unicode=0A=
-=20=20=20=20=20`general-category'=20property=20indicates=20they=20are=20=
spacing=0A-=20=20=20=20=20separators.=0A-=0A-`graphic',=20`graph'=0A-=20=20=
=20=20=20matches=20graphic=20characters--everything=20except=20=
whitespace,=20ASCII=0A-=20=20=20=20=20and=20non-ASCII=20control=20=
characters,=20surrogates,=20and=20codepoints=0A-=20=20=20=20=20=
unassigned=20by=20Unicode.=0A-=0A-`printing',=20`print'=0A-=20=20=20=20=20=
matches=20whitespace=20and=20graphic=20characters.=0A-=0A=
-`alphanumeric',=20`alnum'=0A-=20=20=20=20=20matches=20alphabetic=20=
characters=20and=20digits.=20=20For=20multibyte=20characters,=0A-=20=20=20=
=20=20it=20matches=20characters=20whose=20Unicode=20`general-category'=20=
property=0A-=20=20=20=20=20indicates=20they=20are=20alphabetic=20or=20=
decimal=20number=20characters.=0A-=0A-`letter',=20`alphabetic',=20=
`alpha'=0A-=20=20=20=20=20matches=20alphabetic=20characters.=20=20For=20=
multibyte=20characters,=0A-=20=20=20=20=20it=20matches=20characters=20=
whose=20Unicode=20`general-category'=20property=0A-=20=20=20=20=20=
indicates=20they=20are=20alphabetic=20characters.=0A-=0A-`ascii'=0A-=20=20=
=20=20=20matches=20ASCII=20(unibyte)=20characters.=0A-=0A-`nonascii'=0A-=20=
=20=20=20=20matches=20non-ASCII=20(multibyte)=20characters.=0A-=0A=
-`lower',=20`lower-case'=0A-=20=20=20=20=20matches=20anything=20=
lower-case,=20as=20determined=20by=20the=20current=20case=0A-=20=20=20=20=
=20table.=20=20If=20`case-fold-search'=20is=20non-nil,=20this=20also=20=
matches=20any=0A-=20=20=20=20=20upper-case=20letter.=0A-=0A-`upper',=20=
`upper-case'=0A-=20=20=20=20=20matches=20anything=20upper-case,=20as=20=
determined=20by=20the=20current=20case=0A-=20=20=20=20=20table.=20=20If=20=
`case-fold-search'=20is=20non-nil,=20this=20also=20matches=20any=0A-=20=20=
=20=20=20lower-case=20letter.=0A-=0A-`punctuation',=20`punct'=0A-=20=20=20=
=20=20matches=20punctuation.=20=20(But=20at=20present,=20for=20multibyte=20=
characters,=0A-=20=20=20=20=20it=20matches=20anything=20that=20has=20=
non-word=20syntax.)=0A-=0A-`space',=20`whitespace',=20`white'=0A-=20=20=20=
=20=20matches=20anything=20that=20has=20whitespace=20syntax.=0A-=0A=
-`word',=20`wordchar'=0A-=20=20=20=20=20matches=20anything=20that=20has=20=
word=20syntax.=0A-=0A-`not-wordchar'=0A-=20=20=20=20=20matches=20=
anything=20that=20has=20non-word=20syntax.=0A-=0A-`(syntax=20SYNTAX)'=0A=
-=20=20=20=20=20matches=20a=20character=20with=20syntax=20SYNTAX.=20=20=
SYNTAX=20must=20be=20one=0A-=20=20=20=20=20of=20the=20following=20=
symbols,=20or=20a=20symbol=20corresponding=20to=20the=20syntax=0A-=20=20=20=
=20=20character,=20e.g.=20`\\.'=20for=20`\\s.'.=0A-=0A-=20=20=20=20=20=
`whitespace'=09=09(\\s-=20in=20string=20notation)=0A-=20=20=20=20=20=
`punctuation'=09=09(\\s.)=0A-=20=20=20=20=20`word'=09=09=09(\\sw)=0A-=20=20=
=20=20=20`symbol'=09=09=09(\\s_)=0A-=20=20=20=20=20`open-parenthesis'=09=09=
(\\s()=0A-=20=20=20=20=20`close-parenthesis'=09(\\s))=0A-=20=20=20=20=20=
`expression-prefix'=09(\\s')=0A-=20=20=20=20=20`string-quote'=09=09=
(\\s\")=0A-=20=20=20=20=20`paired-delimiter'=09=09(\\s$)=0A-=20=20=20=20=20=
`escape'=09=09=09(\\s\\)=0A-=20=20=20=20=20`character-quote'=09=09(\\s/)=0A=
-=20=20=20=20=20`comment-start'=09=09(\\s<)=0A-=20=20=20=20=20=
`comment-end'=09=09(\\s>)=0A-=20=20=20=20=20`string-delimiter'=09=09=
(\\s|)=0A-=20=20=20=20=20`comment-delimiter'=09(\\s!)=0A-=0A-`(not=20=
(syntax=20SYNTAX))'=0A-=20=20=20=20=20matches=20a=20character=20that=20=
doesn't=20have=20syntax=20SYNTAX.=0A-=0A-`(category=20CATEGORY)'=0A-=20=20=
=20=20=20matches=20a=20character=20with=20category=20CATEGORY.=20=20=
CATEGORY=20must=20be=0A-=20=20=20=20=20either=20a=20character=20to=20use=20=
for=20C,=20or=20one=20of=20the=20following=20symbols.=0A-=0A-=20=20=20=20=
=20`space-for-indent'=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(\\c\\s=20in=20string=20notation)=0A-=20=20=20=20=20`base'=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(\\c.)=0A-=20=20=20=20=20`consonant'=09=09=09(\\c0)=0A-=20=20=20=20=20=
`base-vowel'=09=09=09(\\c1)=0A-=20=20=20=20=20`upper-diacritical-mark'=09=
=09(\\c2)=0A-=20=20=20=20=20`lower-diacritical-mark'=09=09(\\c3)=0A-=20=20=
=20=20=20`tone-mark'=09=09=20=20=20=20=20=20=20=20(\\c4)=0A-=20=20=20=20=20=
`symbol'=09=09=09=20=20=20=20=20=20=20=20(\\c5)=0A-=20=20=20=20=20=
`digit'=09=09=09=20=20=20=20=20=20=20=20(\\c6)=0A-=20=20=20=20=20=
`vowel-modifying-diacritical-mark'=09(\\c7)=0A-=20=20=20=20=20=
`vowel-sign'=09=09=09(\\c8)=0A-=20=20=20=20=20`semivowel-lower'=09=09=09=
(\\c9)=0A-=20=20=20=20=20`not-at-end-of-line'=09=09(\\c<)=0A-=20=20=20=20=
=20`not-at-beginning-of-line'=09=09(\\c>)=0A-=20=20=20=20=20=
`alpha-numeric-two-byte'=09=09(\\cA)=0A-=20=20=20=20=20=
`chinese-two-byte'=09=09=09(\\cC)=0A-=20=20=20=20=20`greek-two-byte'=09=09=
=09(\\cG)=0A-=20=20=20=20=20`japanese-hiragana-two-byte'=09(\\cH)=0A-=20=20=
=20=20=20`indian-two-byte'=09=09=09(\\cI)=0A-=20=20=20=20=20=
`japanese-katakana-two-byte'=09(\\cK)=0A-=20=20=20=20=20=
`strong-left-to-right'=20=20=20=20=20=20=20=20=20=20=20=20=20(\\cL)=0A-=20=
=20=20=20=20`korean-hangul-two-byte'=09=09(\\cN)=0A-=20=20=20=20=20=
`strong-right-to-left'=20=20=20=20=20=20=20=20=20=20=20=20=20(\\cR)=0A-=20=
=20=20=20=20`cyrillic-two-byte'=09=09(\\cY)=0A-=20=20=20=20=20=
`combining-diacritic'=09=09(\\c^)=0A-=20=20=20=20=20`ascii'=09=09=09=09=
(\\ca)=0A-=20=20=20=20=20`arabic'=09=09=09=09(\\cb)=0A-=20=20=20=20=20=
`chinese'=09=09=09=09(\\cc)=0A-=20=20=20=20=20`ethiopic'=09=09=09=09=
(\\ce)=0A-=20=20=20=20=20`greek'=09=09=09=09(\\cg)=0A-=20=20=20=20=20=
`korean'=09=09=09=09(\\ch)=0A-=20=20=20=20=20`indian'=09=09=09=09(\\ci)=0A=
-=20=20=20=20=20`japanese'=09=09=09=09(\\cj)=0A-=20=20=20=20=20=
`japanese-katakana'=09=09(\\ck)=0A-=20=20=20=20=20`latin'=09=09=09=09=
(\\cl)=0A-=20=20=20=20=20`lao'=09=09=09=09(\\co)=0A-=20=20=20=20=20=
`tibetan'=09=09=09=09(\\cq)=0A-=20=20=20=20=20`japanese-roman'=09=09=09=
(\\cr)=0A-=20=20=20=20=20`thai'=09=09=09=09(\\ct)=0A-=20=20=20=20=20=
`vietnamese'=09=09=09(\\cv)=0A-=20=20=20=20=20`hebrew'=09=09=09=09(\\cw)=0A=
-=20=20=20=20=20`cyrillic'=09=09=09=09(\\cy)=0A-=20=20=20=20=20=
`can-break'=09=09=09(\\c|)=0A-=0A-`(not=20(category=20CATEGORY))'=0A-=20=20=
=20=20=20matches=20a=20character=20that=20doesn't=20have=20category=20=
CATEGORY.=0A-=0A-`(and=20SEXP1=20SEXP2=20...)'=0A-`(:=20SEXP1=20SEXP2=20=
...)'=0A-`(seq=20SEXP1=20SEXP2=20...)'=0A-`(sequence=20SEXP1=20SEXP2=20=
...)'=0A-=20=20=20=20=20matches=20what=20SEXP1=20matches,=20followed=20=
by=20what=20SEXP2=20matches,=20etc.=0A-=20=20=20=20=20Without=20=
arguments,=20matches=20the=20empty=20string.=0A-=0A-`(submatch=20SEXP1=20=
SEXP2=20...)'=0A-`(group=20SEXP1=20SEXP2=20...)'=0A-=20=20=20=20=20like=20=
`and',=20but=20makes=20the=20match=20accessible=20with=20`match-end',=0A=
-=20=20=20=20=20`match-beginning',=20and=20`match-string'.=0A-=0A=
-`(submatch-n=20N=20SEXP1=20SEXP2=20...)'=0A-`(group-n=20N=20SEXP1=20=
SEXP2=20...)'=0A-=20=20=20=20=20like=20`group',=20but=20make=20it=20an=20=
explicitly-numbered=20group=20with=0A-=20=20=20=20=20group=20number=20N.=0A=
-=0A-`(or=20SEXP1=20SEXP2=20...)'=0A-`(|=20SEXP1=20SEXP2=20...)'=0A-=20=20=
=20=20=20matches=20anything=20that=20matches=20SEXP1=20or=20SEXP2,=20=
etc.=20=20If=20all=0A-=20=20=20=20=20args=20are=20strings,=20use=20=
`regexp-opt'=20to=20optimize=20the=20resulting=0A-=20=20=20=20=20regular=20=
expression.=20=20Without=20arguments,=20never=20matches=20anything.=0A-=0A=
-`(minimal-match=20SEXP)'=0A-=20=20=20=20=20produce=20a=20non-greedy=20=
regexp=20for=20SEXP.=20=20Normally,=20regexps=20matching=0A-=20=20=20=20=20=
zero=20or=20more=20occurrences=20of=20something=20are=20\"greedy\"=20in=20=
that=20they=0A-=20=20=20=20=20match=20as=20much=20as=20they=20can,=20as=20=
long=20as=20the=20overall=20regexp=20can=0A-=20=20=20=20=20still=20=
match.=20=20A=20non-greedy=20regexp=20matches=20as=20little=20as=20=
possible.=0A-=0A-`(maximal-match=20SEXP)'=0A-=20=20=20=20=20produce=20a=20=
greedy=20regexp=20for=20SEXP.=20=20This=20is=20the=20default.=0A-=0A=
-Below,=20`SEXP=20...'=20represents=20a=20sequence=20of=20regexp=20=
forms,=20treated=20as=20if=0A-enclosed=20in=20`(and=20...)'.=0A-=0A=
-`(zero-or-more=20SEXP=20...)'=0A-`(0+=20SEXP=20...)'=0A-=20=20=20=20=20=
matches=20zero=20or=20more=20occurrences=20of=20what=20SEXP=20...=20=
matches.=0A-=0A-`(*=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`zero-or-more',=20but=20always=20produces=20a=20greedy=20regexp,=20=
independent=0A-=20=20=20=20=20of=20`rx-greedy-flag'.=0A-=0A-`(*?=20SEXP=20=
...)'=0A-=20=20=20=20=20like=20`zero-or-more',=20but=20always=20produces=20=
a=20non-greedy=20regexp,=0A-=20=20=20=20=20independent=20of=20=
`rx-greedy-flag'.=0A-=0A-`(one-or-more=20SEXP=20...)'=0A-`(1+=20SEXP=20=
...)'=0A-=20=20=20=20=20matches=20one=20or=20more=20occurrences=20of=20=
SEXP=20...=0A-=0A-`(+=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`one-or-more',=20but=20always=20produces=20a=20greedy=20regexp.=0A-=0A=
-`(+?=20SEXP=20...)'=0A-=20=20=20=20=20like=20`one-or-more',=20but=20=
always=20produces=20a=20non-greedy=20regexp.=0A-=0A-`(zero-or-one=20SEXP=20=
...)'=0A-`(optional=20SEXP=20...)'=0A-`(opt=20SEXP=20...)'=0A-=20=20=20=20=
=20matches=20zero=20or=20one=20occurrences=20of=20A.=0A-=0A-`(?=20SEXP=20=
...)'=0A-=20=20=20=20=20like=20`zero-or-one',=20but=20always=20produces=20=
a=20greedy=20regexp.=0A-=0A-`(??=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`zero-or-one',=20but=20always=20produces=20a=20non-greedy=20regexp.=0A-=0A=
-`(repeat=20N=20SEXP)'=0A-`(=3D=20N=20SEXP=20...)'=0A-=20=20=20=20=20=
matches=20N=20occurrences.=0A-=0A-`(>=3D=20N=20SEXP=20...)'=0A-=20=20=20=20=
=20matches=20N=20or=20more=20occurrences.=0A-=0A-`(repeat=20N=20M=20=
SEXP)'=0A-`(**=20N=20M=20SEXP=20...)'=0A-=20=20=20=20=20matches=20N=20to=20=
M=20occurrences.=0A-=0A-`(backref=20N)'=0A-=20=20=20=20=20matches=20what=20=
was=20matched=20previously=20by=20submatch=20N.=0A-=0A-`(literal=20=
STRING-EXPR)'=0A-=20=20=20=20=20matches=20STRING-EXPR=20literally,=20=
where=20STRING-EXPR=20is=20any=20lisp=0A-=20=20=20=20=20expression=20=
that=20evaluates=20to=20a=20string.=0A-=0A-`(regexp=20REGEXP-EXPR)'=0A-=20=
=20=20=20=20include=20REGEXP-EXPR=20in=20string=20notation=20in=20the=20=
result,=20where=0A-=20=20=20=20=20REGEXP-EXPR=20is=20any=20lisp=20=
expression=20that=20evaluates=20to=20a=0A-=20=20=20=20=20string=20=
containing=20a=20valid=20regexp.=0A-=0A-`(eval=20FORM)'=0A-=20=20=20=20=20=
evaluate=20FORM=20and=20insert=20result.=20=20If=20result=20is=20a=20=
string,=0A-=20=20=20=20=20`regexp-quote'=20it.=20=20Note=20that=20FORM=20=
is=20evaluated=20during=0A-=20=20=20=20=20macroexpansion."=0A+Each=20=
argument=20is=20one=20of=20the=20forms=20below;=20RX=20is=20a=20subform,=20=
and=20RX...=20stands=0A+for=20one=20or=20more=20RXs.=20=20For=20details,=20=
see=20Info=20node=20`(elisp)=20Rx=20Notation'.=0A+See=20`rx-to-string'=20=
for=20the=20corresponding=20function.=0A+=0A+STRING=20=20=20=20=20=20=20=20=
=20Match=20a=20literal=20string.=0A+CHAR=20=20=20=20=20=20=20=20=20=20=20=
Match=20a=20literal=20character.=0A+=0A+(seq=20RX...)=20=20=20=20Match=20=
the=20RXs=20in=20sequence.=20=20Alias:=20:,=20sequence,=20and=0A+(or=20=
RX...)=20=20=20=20=20Match=20one=20of=20the=20RXs.=20=20Alias:=20|=0A+=0A=
+(zero-or-more=20RX...)=20Match=20RXs=20zero=20or=20more=20times.=20=20=
Alias:=200+=0A+(one-or-more=20RX...)=20=20Match=20RXs=20one=20or=20more=20=
times.=20=20Alias:=201+=0A+(zero-or-one=20RX...)=20=20Match=20RXs=20or=20=
the=20empty=20string.=20=20Alias:=20opt,=20optional=0A+(*=20RX...)=20=20=20=
=20=20=20=20Match=20RXs=20zero=20or=20more=20times;=20greedy.=0A+(+=20=
RX...)=20=20=20=20=20=20=20Match=20RXs=20one=20or=20more=20times;=20=
greedy.=0A+(?=20RX...)=20=20=20=20=20=20=20Match=20RXs=20or=20the=20=
empty=20string;=20greedy.=0A+(*?=20RX...)=20=20=20=20=20=20Match=20RXs=20=
zero=20or=20more=20times;=20non-greedy.=0A+(+?=20RX...)=20=20=20=20=20=20=
Match=20RXs=20one=20or=20more=20times;=20non-greedy.=0A+(??=20RX...)=20=20=
=20=20=20=20Match=20RXs=20or=20the=20empty=20string;=20non-greedy.=0A+(=3D=
=20N=20RX...)=20=20=20=20=20Match=20RXs=20exactly=20N=20times.=0A+(>=3D=20=
N=20RX...)=20=20=20=20Match=20RXs=20N=20or=20more=20times.=0A+(**=20N=20=
M=20RX...)=20=20Match=20RXs=20N=20to=20M=20times.=20=20Alias:=20repeat=0A=
+(minimal-match=20RX)=20=20Match=20RX,=20with=20zero-or-more,=20=
one-or-more,=20zero-or-one=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20and=20aliases=20using=20non-greedy=20matching.=0A+(maximal-match=20=
RX)=20=20Match=20RX,=20with=20zero-or-more,=20one-or-more,=20zero-or-one=0A=
+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20and=20aliases=20using=20=
greedy=20matching,=20which=20is=20the=20default.=0A+=0A+(any=20SET...)=20=
=20=20=20Match=20a=20character=20from=20one=20of=20the=20SETs.=20=20Each=20=
SET=20is=20a=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
character,=20a=20string,=20a=20range=20as=20string=20\"A-Z\"=20or=20cons=0A=
+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(?A=20.=20?Z),=20or=20a=20=
character=20class=20(see=20below).=20=20Alias:=20in,=20char=0A+(not=20=
CHARSPEC)=20=20Match=20one=20character=20not=20matched=20by=20CHARSPEC.=20=
=20CHARSPEC=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20can=20be=20=
(any=20...),=20(syntax=20...),=20(category=20...),=0A+=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20or=20a=20character=20class.=0A+not-newline=20=20=
=20=20=20Match=20any=20character=20except=20a=20newline.=20=20Alias:=20=
nonl=0A+anything=20=20=20=20=20=20=20=20Match=20any=20character.=0A+=0A=
+CHARCLASS=20=20=20=20=20=20=20Match=20a=20character=20from=20a=20=
character=20class.=20=20One=20of:=0A+=20alpha,=20alphabetic,=20letter=20=20=
=20Alphabetic=20characters=20(defined=20by=20Unicode).=0A+=20alnum,=20=
alphanumeric=20=20=20=20=20=20=20=20=20Alphabetic=20or=20decimal=20digit=20=
chars=20(Unicode).=0A+=20digit=20numeric,=20num=20=20=20=20=20=20=20=20=20=
=200-9.=0A+=20xdigit,=20hex-digit,=20hex=20=20=20=20=20=200-9,=20A-F,=20=
a-f.=0A+=20cntrl,=20control=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
ASCII=20codes=200-31.=0A+=20blank=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20Horizontal=20whitespace=20(Unicode).=0A+=20=
space,=20whitespace,=20white=20=20=20=20Chars=20with=20whitespace=20=
syntax.=0A+=20lower,=20lower-case=20=20=20=20=20=20=20=20=20=20=20=
Lower-case=20chars,=20from=20current=20case=20table.=0A+=20upper,=20=
upper-case=20=20=20=20=20=20=20=20=20=20=20Upper-case=20chars,=20from=20=
current=20case=20table.=0A+=20graph,=20graphic=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20Graphic=20characters=20(Unicode).=0A+=20print,=20printing=20=
=20=20=20=20=20=20=20=20=20=20=20=20Whitespace=20or=20graphic=20=
(Unicode).=0A+=20punct,=20punctuation=20=20=20=20=20=20=20=20=20=20Not=20=
control,=20space,=20letter=20or=20digit=20(ASCII);=0A+=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20not=20=
word=20syntax=20(non-ASCII).=0A+=20word,=20wordchar=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20Characters=20with=20word=20syntax.=0A+=20ascii=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20ASCII=20=
characters=20(codes=200-127).=0A+=20nonascii=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20Non-ASCII=20characters=20(but=20not=20raw=20=
bytes).=0A+=0A+(syntax=20SYNTAX)=20=20Match=20a=20character=20with=20=
syntax=20SYNTAX,=20being=20one=20of:=0A+=20=20whitespace,=20punctuation,=20=
word,=20symbol,=20open-parenthesis,=0A+=20=20close-parenthesis,=20=
expression-prefix,=20string-quote,=0A+=20=20paired-delimiter,=20escape,=20=
character-quote,=20comment-start,=0A+=20=20comment-end,=20=
string-delimiter,=20comment-delimiter=0A+=0A+(category=20CAT)=20=20=20=
Match=20a=20character=20in=20category=20CAT,=20being=20one=20of:=0A+=20=20=
space-for-indent,=20base,=20consonant,=20base-vowel,=0A+=20=20=
upper-diacritical-mark,=20lower-diacritical-mark,=20tone-mark,=20symbol,=0A=
+=20=20digit,=20vowel-modifying-diacritical-mark,=20vowel-sign,=0A+=20=20=
semivowel-lower,=20not-at-end-of-line,=20not-at-beginning-of-line,=0A+=20=
=20alpha-numeric-two-byte,=20chinese-two-byte,=20greek-two-byte,=0A+=20=20=
japanese-hiragana-two-byte,=20indian-two-byte,=0A+=20=20=
japanese-katakana-two-byte,=20strong-left-to-right,=0A+=20=20=
korean-hangul-two-byte,=20strong-right-to-left,=20cyrillic-two-byte,=0A+=20=
=20combining-diacritic,=20ascii,=20arabic,=20chinese,=20ethiopic,=20=
greek,=0A+=20=20korean,=20indian,=20japanese,=20japanese-katakana,=20=
latin,=20lao,=0A+=20=20tibetan,=20japanese-roman,=20thai,=20vietnamese,=20=
hebrew,=20cyrillic,=0A+=20=20can-break=0A+=0A+Zero-width=20assertions:=20=
these=20all=20match=20the=20empty=20string=20in=20specific=20places.=0A+=20=
line-start=20=20=20=20=20=20=20=20=20At=20the=20beginning=20of=20a=20=
line.=20=20Alias:=20bol=0A+=20line-end=20=20=20=20=20=20=20=20=20=20=20=
At=20the=20end=20of=20a=20line.=20=20Alias:=20eol=0A+=20string-start=20=20=
=20=20=20=20=20At=20the=20start=20of=20the=20string=20or=20buffer.=0A+=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Alias:=20=
buffer-start,=20bos,=20bot=0A+=20string-end=20=20=20=20=20=20=20=20=20At=20=
the=20end=20of=20the=20string=20or=20buffer.=0A+=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20Alias:=20buffer-end,=20eos,=20eot=0A=
+=20point=20=20=20=20=20=20=20=20=20=20=20=20=20=20At=20point.=0A+=20=
word-start=20=20=20=20=20=20=20=20=20At=20the=20beginning=20of=20a=20=
word.=0A+=20word-end=20=20=20=20=20=20=20=20=20=20=20At=20the=20end=20of=20=
a=20word.=0A+=20word-boundary=20=20=20=20=20=20At=20the=20beginning=20or=20=
end=20of=20a=20word.=0A+=20not-word-boundary=20=20Not=20at=20the=20=
beginning=20or=20end=20of=20a=20word.=0A+=20symbol-start=20=20=20=20=20=20=
=20At=20the=20beginning=20of=20a=20symbol.=0A+=20symbol-end=20=20=20=20=20=
=20=20=20=20At=20the=20end=20of=20a=20symbol.=0A+=0A+(group=20RX...)=20=20=
Match=20RXs=20and=20define=20a=20capture=20group.=20=20Alias:=20submatch=0A=
+(group-n=20N=20RX...)=20Match=20RXs=20and=20define=20capture=20group=20=
N.=20=20Alias:=20submatch-n=0A+(backref=20N)=20=20=20=20Match=20the=20=
text=20that=20capture=20group=20N=20matched.=0A+=0A+(literal=20EXPR)=20=
Match=20the=20literal=20string=20from=20evaluating=20EXPR=20at=20run=20=
time.=0A+(regexp=20EXPR)=20=20Match=20the=20string=20regexp=20from=20=
evaluating=20EXPR=20at=20run=20time.=0A+(eval=20EXPR)=20=20=20=20Match=20=
the=20rx=20sexp=20from=20evaluating=20EXPR=20at=20compile=20time."=0A=20=20=
=20(let*=20((rx--compile-to-lisp=20t)=0A=20=20=20=20=20=20=20=20=20=20=
(re=20(cond=20((null=20regexps)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20(error=20"No=20regexp"))=0A--=20=0A2.20.1=20=
(Apple=20Git-117)=0A=0A=

--Apple-Mail=_C3A5B1B3-CE7A-4AEF-8797-B2A3EC205318--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 11:59:14 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 07:59:14 2019
Received: from localhost ([127.0.0.1]:54310 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjjLW-0002RQ-75
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 07:59:14 -0400
Received: from mail-io1-f49.google.com ([209.85.166.49]:40597)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <npostavs@HIDDEN>) id 1hjjLU-0002RB-8Z
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 07:59:12 -0400
Received: by mail-io1-f49.google.com with SMTP id h6so16430130iom.7
 for <36496 <at> debbugs.gnu.org>; Sat, 06 Jul 2019 04:59:12 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=from:to:cc:subject:references:date:in-reply-to:message-id
 :user-agent:mime-version:content-transfer-encoding;
 bh=7hJdDmr82tIjcKmHtOBmVaNJWBqS4dvWJnUaamibwkw=;
 b=jPo1XCuB/+G4TCh+f0Y8AUa5FrNNC4RIV7dg11nZIgpeYtBkoxpJn4Ln9ZiuLZU8uV
 Sbo1FGAY/gJOqBZWxz7Rwjb9ODo5GmdABmm4lEGOdnXonQUWqpwyA+NO8OsDY8bojZaM
 K4SwTwn+GASzZ7PcV85CHdthDdfkESBkLh4MsU3LCdKDSwtswJs7xJLb6Plbj+KdyGQZ
 IIRy7C8KbMdwKRgYVk+0wiIPcgt9qEQLjQDyqNcJpEqqoUfYI1KW8lB6NVe3sgmj+kfV
 j7KXUbXhedSioCIr7Xm7Xfz2vlGNrrDQ0G6pqVzrUfGn2x5R0FaQqTfSPNT4F4CYnwnS
 1q9w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to
 :message-id:user-agent:mime-version:content-transfer-encoding;
 bh=7hJdDmr82tIjcKmHtOBmVaNJWBqS4dvWJnUaamibwkw=;
 b=cv2QxRF+1WiSaKJlvpr9rxNkZmeIG6GPcIiJZjMWIUM/DEZedziSKKYzNqPRCXjZAE
 AxGBWLhVacsceoWkbLp2xVWgGtuBAJXBZnTGbqWAhExRM5Unbju5tc/Um8lTyse8BwJ/
 ihxg2PCLHwVpbG/KX+G0u4hLHwvOgj+mizyHemQjcuo5MPc0cTmjynf8z5StrSfrWUji
 K2DLBcMMjiYH4CIL7YiBYcbbLGKmgvxHWT6fXys/8+WTaTW8LRtXRRqJtxP+ymKDeTna
 N7bezfsFG56Y5fmnpAtXIMWhgvhIfVPOo5I4heBMpQEuV7wk2iB4u/vpaDGkDgOH6XAf
 4uFA==
X-Gm-Message-State: APjAAAVHKY4hE0IHQ00ZQ4C8xycaoxRllmD5xGYpW6w7OHI/vcgeUG3N
 6hCOt1FxD4id/A0mc+veRqowWj9b
X-Google-Smtp-Source: APXvYqwed24sKOamt2aM9qQy+2qJrrJap5P51749KjhIlZ3MOpIJ7PPEVnb5NM0Rlgn7j7welR+D6g==
X-Received: by 2002:a02:2245:: with SMTP id o66mr10478562jao.53.1562414344986; 
 Sat, 06 Jul 2019 04:59:04 -0700 (PDT)
Received: from minid (cbl-45-2-119-34.yyz.frontiernetworks.ca. [45.2.119.34])
 by smtp.gmail.com with ESMTPSA id
 n21sm8255187ioh.30.2019.07.06.04.59.04
 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);
 Sat, 06 Jul 2019 04:59:04 -0700 (PDT)
From: Noam Postavsky <npostavs@HIDDEN>
To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
Date: Sat, 06 Jul 2019 07:59:03 -0400
In-Reply-To: <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN> ("Mattias
 \=\?utf-8\?Q\?Engdeg\=C3\=A5rd\=22's\?\= message of "Sat, 6 Jul 2019 13:33:35
 +0200")
Message-ID: <87sgrj4bnc.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.2.90 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 36496
Cc: Eli Zaretskii <eliz@HIDDEN>, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

Mattias Engdeg=C3=A5rd <mattiase@HIDDEN> writes:

> +(zero-or-more RX...) Match RXs zero or more times.  Alias: *, 0+
> +(one-or-more RX...)  Match RXs one or more times.  Alias: +, 1+
> +(zero-or-one RX...)  Match RXs or the empty string.  Alias: ?, opt, opti=
onal

*, +, and ? are not exact aliases of the above: they're always greedy
(as opposed to depending on rx-greedy-flag).  I think it's a bit
confusing to rely on the description of minimal-match and maximal-match
to explain that.

> +(minimal-match RX)  Match RX, with zero-or-more, one-or-more,
> +                zero-or-one, 0+, 1+, opt, and optional
> +                using non-greedy matching.
> +(maximal-match RX)  Match RX, with zero-or-more, one-or-more,
> +                zero-or-one, 0+, 1+, opt, and optional
> +                using greedy matching, which is the default.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 11:41:41 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 07:41:41 2019
Received: from localhost ([127.0.0.1]:54272 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjj4X-0001zn-Ed
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 07:41:41 -0400
Received: from eggs.gnu.org ([209.51.188.92]:44718)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1hjj4V-0001zb-Of
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 07:41:40 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:53280)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <eliz@HIDDEN>)
 id 1hjj4Q-0001jQ-IE; Sat, 06 Jul 2019 07:41:34 -0400
Received: from [176.228.60.248] (port=4112 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1hjj4Q-0007Qk-5r; Sat, 06 Jul 2019 07:41:34 -0400
Date: Sat, 06 Jul 2019 14:41:28 +0300
Message-Id: <83k1cv8k5z.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
In-reply-to: <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN> (message from
 Mattias =?utf-8?Q?Engdeg=C3=A5rd?= on Sat, 6 Jul 2019 13:33:35 +0200)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN> <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Mattias Engdegård <mattiase@HIDDEN>
> Date: Sat, 6 Jul 2019 13:33:35 +0200
> Cc: 36496 <at> debbugs.gnu.org
> 
> diff --git a/doc/lispref/searching.texi b/doc/lispref/searching.texi
> index ef1cffc446..17c4790f5e 100644
> --- a/doc/lispref/searching.texi
> +++ b/doc/lispref/searching.texi
> @@ -254,6 +254,9 @@ Regular Expressions
>  @menu
>  * Syntax of Regexps::       Rules for writing regular expressions.
>  * Regexp Example::          Illustrates regular expression syntax.
> +@ifnottex
> +* Rx Notation::             An alternative, structured regexp notation.
> +@end ifnottex
>  * Regexp Functions::        Functions for operating on regular expressions.
>  @end menu

I believe you need the same conditional addition in elisp.texi, in the
detailed menu there.

> * lisp/emacs-lisp/rx.el (rx): Replace long description with a condensed
> summary of the rx syntax, with reference to the manual section.

This is OK, but it is inconsistent wrt whether each construct's
description ends in a period.  I suggest to end them all with a
period.

Thanks.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 11:33:46 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 07:33:46 2019
Received: from localhost ([127.0.0.1]:54266 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjiws-0001nu-Fr
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 07:33:46 -0400
Received: from mail235c50.megamailservers.eu ([91.136.10.245]:50186
 helo=mail56c50.megamailservers.eu)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <mattiase@HIDDEN>) id 1hjiwp-0001nf-MU
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 07:33:45 -0400
X-Authenticated-User: mattiase@HIDDEN
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu;
 s=maildub; t=1562412819;
 bh=NUPLVi/Hvh6gM5yV17+qbb8floxkzUolnuvkTEiJCYk=;
 h=From:Subject:Date:In-Reply-To:Cc:To:References:From;
 b=SQxJ/OLHtN6z6LCp8KXffpvjq0qr23kWH3AUGKwr7lghFYKPaDnGzEMZHSAqEm1N7
 o8zZ61ffDaTjoLHVgnmlTTqLu0FWw7mAMYBU2+byPvupe/1ttxMLRZBtH7afzWX1gw
 unFrL8vv5FDFsWWiuh5y869shKodJyWffCj/Cn+E=
Feedback-ID: mattiase@HIDDEN
Received: from [192.168.1.64] (c-e636e253.032-75-73746f71.bbcust.telenor.se
 [83.226.54.230]) (authenticated bits=0)
 by mail56c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x66BXaUo016942; 
 Sat, 6 Jul 2019 11:33:38 +0000
From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= <mattiase@HIDDEN>
Message-Id: <F6C1EF17-20F5-4551-B9CE-6C1D6C404EBD@HIDDEN>
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_4EE8477A-8B77-4C86-A6A0-ED3F0D46DD21"
Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\))
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
Date: Sat, 6 Jul 2019 13:33:35 +0200
In-Reply-To: <83r2738r9j.fsf@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
 <83r2738r9j.fsf@HIDDEN>
X-Mailer: Apple Mail (2.3445.104.11)
X-CTCH-RefID: str=0001.0A0B020A.5D208713.0008, ss=1, re=0.000, recu=0.000,
 reip=0.000, cl=1, cld=1, fgs=0
X-CTCH-VOD: Unknown
X-CTCH-Spam: Unknown
X-CTCH-Score: 0.000
X-CTCH-Rules: 
X-CTCH-Flags: 0
X-CTCH-ScoreCust: 0.000
X-CSC: 0
X-CHA: v=2.3 cv=DI6hHRFb c=1 sm=1 tr=0 a=M+GU/qJco4WXjv8D6jB2IA==:117
 a=M+GU/qJco4WXjv8D6jB2IA==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19
 a=mDV3o1hIAAAA:8 a=S08f7oA2__9kJBOj998A:9 a=CjuIK1q_8ugA:10
 a=P24n4mVnincD3SCcurQA:9 a=B2y7HmGcmWMA:10 a=Tkn_Sv_VdHUd6U5knqEA:9
 a=_FVE-zBwftR9WsbkzFJk:22
X-Spam-Score: 0.3 (/)
X-Debbugs-Envelope-To: 36496
Cc: 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)


--Apple-Mail=_4EE8477A-8B77-4C86-A6A0-ED3F0D46DD21
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

6 juli 2019 kl. 11.08 skrev Eli Zaretskii <eliz@HIDDEN>:
>=20
>> It is about 7-8 pages in all.
>=20
> It's more that 2500 lines.  We have in doc/misc/ separate manuals much
> smaller than this.  So making a separate manual out of this is not
> radically different from what we have already.

It was a visual count of printed pages in the pdf; a lot of lines in the =
source are mark-up.
In any case, the attached patch has @ifnottex added to it. I didn't move =
the text to a separate file, since there was no existing =
"lispref-extras" document to put them in. In addition, some of the =
additions were to existing sections (pcase, and the complex regexp =
example).

> Opinion on which matter? on whether or not make it a separate manual?
> If so, you now have my opinion.

Thanks, that's what I meant.

> The comma is common because older versions of makeinfo insisted on
> having it, and would complain if there weren't one.  The latest
> versions no longer complain, but we would still like to support the
> old versions, as they are ~15 times faster, so some people still keep
> them around.

Thank you very much for clearing that up; I always wondered.

Also attached is a patch for replacing the rx doc string with a =
condensed summary.  I basically copied the one I wrote for ry.


--Apple-Mail=_4EE8477A-8B77-4C86-A6A0-ED3F0D46DD21
Content-Disposition: attachment;
	filename=0001-Describe-the-rx-notation-in-the-elisp-manual-bug-364.patch
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="0001-Describe-the-rx-notation-in-the-elisp-manual-bug-364.patch"
Content-Transfer-Encoding: quoted-printable

=46rom=20d5c54a21127a92e7dec1c03c262de551f3a76e27=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20=
<mattiase@HIDDEN>=0ADate:=20Thu,=204=20Jul=202019=2013:01:52=20+0200=0A=
Subject:=20[PATCH]=20Describe=20the=20rx=20notation=20in=20the=20elisp=20=
manual=20(bug#36496)=0A=0A*=20doc/lispref/searching.texi=20(Regular=20=
Expressions):=20New=20menu=20entry.=0A(Regexp=20Example):=20Add=20rx=20=
form=20of=20the=20example.=0A(Rx=20Notation,=20Rx=20Constructs,=20Rx=20=
Functions):=20New=20nodes.=0A*=20doc/lispref/control.texi=20(pcase=20=
Macro):=20Describe=20the=20rx=20pattern.=0A---=0A=20=
doc/lispref/control.texi=20=20=20|=20=2025=20++=0A=20=
doc/lispref/searching.texi=20|=20565=20=
+++++++++++++++++++++++++++++++++++++=0A=202=20files=20changed,=20590=20=
insertions(+)=0A=0Adiff=20--git=20a/doc/lispref/control.texi=20=
b/doc/lispref/control.texi=0Aindex=20e308d68b75..de6cd9301f=20100644=0A=
---=20a/doc/lispref/control.texi=0A+++=20b/doc/lispref/control.texi=0A@@=20=
-618,6=20+618,31=20@@=20pcase=20Macro=0A=20to=20@var{body-forms}=20(thus=20=
avoiding=20an=20evaluation=20error=20on=20match),=0A=20if=20any=20of=20=
the=20sub-patterns=20let-binds=20a=20set=20of=20symbols,=0A=20they=20=
@emph{must}=20all=20bind=20the=20same=20set=20of=20symbols.=0A+=0A=
+@ifnottex=0A+@anchor{rx=20in=20pcase}=0A+@item=20(rx=20=
@var{rx-expr}@dots{})=0A+Matches=20strings=20against=20the=20regexp=20=
@var{rx-expr}@dots{},=20using=20the=0A+@code{rx}=20regexp=20notation=20=
(@pxref{Rx=20Notation}),=20as=20if=20by=0A+@code{string-match}.=0A+=0A=
+In=20addition=20to=20the=20usual=20@code{rx}=20syntax,=20=
@var{rx-expr}@dots{}=20can=0A+contain=20the=20following=20constructs:=0A=
+=0A+@table=20@code=0A+@item=20(let=20@var{ref}=20@var{rx-expr}@dots{})=0A=
+Bind=20the=20symbol=20@var{ref}=20to=20a=20submatch=20that=20matches=0A=
+@var{rx-expr}@enddots{}.=20=20@var{ref}=20is=20bound=20in=20=
@var{body-forms}=20to=0A+the=20string=20of=20the=20submatch=20or=20nil,=20=
but=20can=20also=20be=20used=20in=0A+@code{backref}.=0A+=0A+@item=20=
(backref=20@var{ref})=0A+Like=20the=20standard=20@code{backref}=20=
construct,=20but=20@var{ref}=20can=20here=0A+also=20be=20a=20name=20=
introduced=20by=20a=20previous=20@code{(let=20@var{ref}=20@dots{})}=0A=
+construct.=0A+@end=20table=0A+@end=20ifnottex=0A+=0A=20@end=20table=0A=20=
=0A=20@anchor{pcase-example-0}=0Adiff=20--git=20=
a/doc/lispref/searching.texi=20b/doc/lispref/searching.texi=0Aindex=20=
ef1cffc446..17c4790f5e=20100644=0A---=20a/doc/lispref/searching.texi=0A=
+++=20b/doc/lispref/searching.texi=0A@@=20-254,6=20+254,9=20@@=20Regular=20=
Expressions=0A=20@menu=0A=20*=20Syntax=20of=20Regexps::=20=20=20=20=20=20=
=20Rules=20for=20writing=20regular=20expressions.=0A=20*=20Regexp=20=
Example::=20=20=20=20=20=20=20=20=20=20Illustrates=20regular=20=
expression=20syntax.=0A+@ifnottex=0A+*=20Rx=20Notation::=20=20=20=20=20=20=
=20=20=20=20=20=20=20An=20alternative,=20structured=20regexp=20notation.=0A=
+@end=20ifnottex=0A=20*=20Regexp=20Functions::=20=20=20=20=20=20=20=20=
Functions=20for=20operating=20on=20regular=20expressions.=0A=20@end=20=
menu=0A=20=0A@@=20-359,6=20+362,7=20@@=20Regexp=20Special=0A=20preceding=20=
expression=20either=20once=20or=20not=20at=20all.=20=20For=20example,=0A=20=
@samp{ca?r}=20matches=20@samp{car}=20or=20@samp{cr};=20nothing=20else.=0A=
=20=0A+@anchor{Non-greedy=20repetition}=0A=20@item=20@samp{*?},=20=
@samp{+?},=20@samp{??}=0A=20@cindex=20non-greedy=20repetition=20=
characters=20in=20regexp=0A=20These=20are=20@dfn{non-greedy}=20variants=20=
of=20the=20operators=20@samp{*},=20@samp{+}=0A@@=20-951,6=20+955,567=20=
@@=20Regexp=20Example=0A=20beyond=20the=20minimum=20needed=20to=20end=20=
a=20sentence.=0A=20@end=20table=0A=20=0A+@ifnottex=0A+In=20the=20=
@code{rx}=20notation=20(@pxref{Rx=20Notation}),=20the=20regexp=20could=20=
be=20written=0A+=0A+@example=0A+@group=0A+(rx=20(any=20".?!")=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=20Punctuation=20ending=20=
sentence.=0A+=20=20=20=20(zero-or-more=20(any=20"\"')]@}"))=20=20;=20=
Closing=20quotes=20or=20brackets.=0A+=20=20=20=20(or=20line-end=0A+=20=20=
=20=20=20=20=20=20(seq=20"=20"=20line-end)=0A+=20=20=20=20=20=20=20=20=
"\t"=0A+=20=20=20=20=20=20=20=20"=20=20")=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20;=20Two=20spaces.=0A+=20=20=20=20=
(zero-or-more=20(any=20"\t\n=20")))=20=20;=20Optional=20extra=20=
whitespace.=0A+@end=20group=0A+@end=20example=0A+=0A+Since=20@code{rx}=20=
regexps=20are=20just=20S-expressions,=20they=20can=20be=20formatted=0A=
+and=20commented=20as=20such.=0A+@end=20ifnottex=0A+=0A+@ifnottex=0A=
+@node=20Rx=20Notation=0A+@subsection=20The=20@code{rx}=20Structured=20=
Regexp=20Notation=0A+@cindex=20rx=0A+@cindex=20regexp=20syntax=0A+=0A+=20=
=20As=20an=20alternative=20to=20the=20string-based=20syntax,=20Emacs=20=
provides=20the=0A+structured=20@code{rx}=20notation=20based=20on=20Lisp=20=
S-expressions.=20=20This=0A+notation=20is=20usually=20easier=20to=20=
read,=20write=20and=20maintain=20than=20regexp=0A+strings,=20and=20can=20=
be=20indented=20and=20commented=20freely.=20=20It=20requires=20a=0A=
+conversion=20into=20string=20form=20since=20that=20is=20what=20regexp=20=
functions=0A+expect,=20but=20that=20conversion=20typically=20takes=20=
place=20during=0A+byte-compilation=20rather=20than=20when=20the=20Lisp=20=
code=20using=20the=20regexp=20is=0A+run.=0A+=0A+=20=20Here=20is=20an=20=
@code{rx}=20regexp@footnote{It=20could=20be=20written=20much=0A+simpler=20=
with=20non-greedy=20operators=20(how?),=20but=20that=20would=20make=20=
the=0A+example=20less=20interesting.}=20that=20matches=20a=20block=20=
comment=20in=20the=20C=0A+programming=20language:=0A+=0A+@example=0A=
+@group=0A+(rx=20"/*"=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20;=20Initial=20/*=0A+=20=20=20=20(zero-or-more=0A=
+=20=20=20=20=20(or=20(not=20(any=20"*"))=20=20=20=20=20=20=20=20=20=20;=20=
=20Either=20non-*,=0A+=20=20=20=20=20=20=20=20=20(seq=20"*"=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20;=20=20or=20*=20followed=20by=0A+=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20(not=20(any=20"/")))))=20=20;=20=20=
non-/=0A+=20=20=20=20(one-or-more=20"*")=20=20=20=20=20=20=20=20=20=20=20=
=20=20;=20At=20least=20one=20star,=0A+=20=20=20=20"/")=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=20and=20the=20=
final=20/=0A+@end=20group=0A+@end=20example=0A+=0A+@noindent=0A+or,=20=
using=20shorter=20synonyms=20and=20written=20more=20compactly,=0A+=0A=
+@example=0A+@group=0A+(rx=20"/*"=0A+=20=20=20=20(*=20(|=20(not=20(any=20=
"*"))=0A+=20=20=20=20=20=20=20=20=20=20(:=20"*"=20(not=20(any=20"/")))))=0A=
+=20=20=20=20(+=20"*")=20"/")=0A+@end=20group=0A+@end=20example=0A+=0A=
+@noindent=0A+In=20conventional=20string=20syntax,=20it=20would=20be=20=
written=0A+=0A+@example=0A+"/\\*\\(?:[^*]\\|\\*[^/]\\)*\\*+/"=0A+@end=20=
example=0A+=0A+The=20@code{rx}=20notation=20is=20mainly=20useful=20in=20=
Lisp=20code;=20it=20cannot=20be=0A+used=20in=20most=20interactive=20=
situations=20where=20a=20regexp=20is=20requested,=20such=0A+as=20when=20=
running=20@code{query-replace-regexp}=20or=20in=20variable=0A=
+customisation.=0A+=0A+@menu=0A+*=20Rx=20Constructs::=20=20=20=20=20=20=20=
Constructs=20valid=20in=20rx=20forms.=0A+*=20Rx=20Functions::=20=20=20=20=
=20=20=20=20Functions=20and=20macros=20that=20use=20rx=20forms.=0A+@end=20=
menu=0A+=0A+@node=20Rx=20Constructs=0A+@subsubsection=20Constructs=20in=20=
@code{rx}=20regexps=0A+=0A+The=20various=20forms=20in=20@code{rx}=20=
regexps=20are=20described=20below.=20=20The=0A+shorthand=20@var{rx}=20=
represents=20any=20@code{rx}=20form,=20and=20@var{rx}@dots{}=0A+means=20=
one=20or=20more=20@code{rx}=20forms.=20=20Where=20the=20corresponding=20=
string=0A+regexp=20syntax=20is=20given,=20@var{A},=20@var{B},=20@dots{}=20=
are=20string=20regexp=0A+subexpressions.=0A+@c=20With=20the=20new=20=
implementation=20of=20rx,=20this=20can=20be=20changed=20from=0A+@c=20=
'one=20or=20more'=20to=20'zero=20or=20more'.=0A+=0A+@subsubheading=20=
Literals=0A+=0A+@table=20@asis=0A+@item=20@code{"some-string"}=0A+Match=20=
the=20string=20@samp{some-string}=20literally.=20=20There=20are=20no=0A=
+characters=20with=20special=20meaning,=20unlike=20in=20string=20=
regexps.=0A+=0A+@item=20@code{?C}=0A+Match=20the=20character=20@samp{C}=20=
literally.=0A+@end=20table=0A+=0A+@subsubheading=20Fundamental=20=
structure=0A+=0A+@table=20@asis=0A+@item=20@code{(seq=20=
@var{rx}@dots{})}=0A+@cindex=20@code{seq}=20in=20rx=0A+@itemx=20=
@code{(sequence=20@var{rx}@dots{})}=0A+@cindex=20@code{sequence}=20in=20=
rx=0A+@itemx=20@code{(:=20@var{rx}@dots{})}=0A+@cindex=20@code{:}=20in=20=
rx=0A+@itemx=20@code{(and=20@var{rx}@dots{})}=0A+@cindex=20@code{and}=20=
in=20rx=0A+Match=20the=20@var{rx}s=20in=20sequence.=20=20Without=20=
arguments,=20the=20expression=0A+matches=20the=20empty=20string.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}@var{B}@dots{}}=0A=
+(subexpressions=20in=20sequence).=0A+=0A+@item=20@code{(or=20=
@var{rx}@dots{})}=0A+@cindex=20@code{or}=20in=20rx=0A+@itemx=20@code{(|=20=
@var{rx}@dots{})}=0A+@cindex=20@code{|}=20in=20rx=0A+Match=20exactly=20=
one=20of=20the=20@var{rx}s,=20trying=20from=20left=20to=20right.=0A=
+Without=20arguments,=20the=20expression=20will=20not=20match=20anything=20=
at=20all.@*=0A+Corresponding=20string=20regexp:=20=
@samp{@var{A}\|@var{B}\|@dots{}}.=0A+@end=20table=0A+=0A+@subsubheading=20=
Repetition=0A+=0A+@table=20@code=0A+@item=20(zero-or-more=20=
@var{rx}@dots{})=0A+@cindex=20@code{zero-or-more}=20in=20rx=0A+@itemx=20=
(0+=20@var{rx}@dots{})=0A+@cindex=20@code{0+}=20in=20rx=0A+@itemx=20(*=20=
@var{rx}@dots{})=0A+@cindex=20@code{*}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20zero=20or=20more=20times.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}*}=0A+=0A+@item=20(one-or-more=20@var{rx}@dots{})=0A=
+@cindex=20@code{one-or-more}=20in=20rx=0A+@itemx=20(1+=20=
@var{rx}@dots{})=0A+@cindex=20@code{1+}=20in=20rx=0A+@itemx=20(+=20=
@var{rx}@dots{})=0A+@cindex=20@code{+}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20one=20or=20more=20times.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}+}=0A+=0A+@item=20(zero-or-one=20@var{rx}@dots{})=0A=
+@cindex=20@code{zero-or-one}=20in=20rx=0A+@itemx=20(optional=20=
@var{rx}@dots{})=0A+@cindex=20@code{optional}=20in=20rx=0A+@itemx=20(opt=20=
@var{rx}@dots{})=0A+@cindex=20@code{opt}=20in=20rx=0A+@itemx=20(?=20=
@var{rx}@dots{})=0A+@cindex=20@code{?}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20once=20or=20an=20empty=20string.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}?}=0A+=0A+@item=20(=3D=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@code{=3D}=20in=20rx=0A+@itemx=20(repeat=20=
@var{n}=20@var{rx})=0A+Match=20the=20@var{rx}s=20exactly=20@var{n}=20=
times.@*=0A+Corresponding=20string=20regexp:=20=
@samp{@var{A}\@{@var{n}\@}}=0A+=0A+@item=20(>=3D=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@code{>=3D}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20@var{n}=20or=20more=20times.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}\@{@var{n},\@}}=0A+=0A+@item=20(**=20@var{n}=20=
@var{m}=20@var{rx}@dots{})=0A+@cindex=20@code{**}=20in=20rx=0A+@itemx=20=
(repeat=20@var{n}=20@var{m}=20@var{rx}@dots{})=0A+@cindex=20=
@code{repeat}=20in=20rx=0A+Match=20the=20@var{rx}s=20at=20least=20=
@var{n}=20but=20no=20more=20than=20@var{m}=20times.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}\@{@var{n},@var{m}\@}}=0A+@end=20table=0A=
+=0A+@subsubheading=20Non-greedy=20repetition=0A+=0A+Normally,=20=
repetition=20forms=20are=20greedy,=20in=20that=20they=20attempt=20to=20=
match=0A+as=20many=20times=20as=20possible.=20=20The=20following=20three=20=
forms=20are=20non-greedy;=20they=0A+try=20to=20match=20as=20few=20times=20=
as=20possible=20(@pxref{Non-greedy=20repetition}).=0A+=0A+@table=20@code=0A=
+@item=20(*?=20@var{rx}@dots{})=0A+@cindex=20@code{*?}=20in=20rx=0A=
+Match=20the=20@var{rx}s=20zero=20or=20more=20times,=20non-greedily.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}*?}=0A+=0A+@item=20(+?=20=
@var{rx}@dots{})=0A+@cindex=20@code{+?}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20one=20or=20more=20times,=20non-greedily.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}+?}=0A+=0A+@item=20(??=20=
@var{rx}@dots{})=0A+@cindex=20@code{??}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20or=20an=20empty=20string,=20non-greedily.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}??}=0A+@end=20table=0A+=0A+The=20=
greediness=20of=20some=20repetition=20forms=20can=20be=20controlled=20=
using=20the=0A+following=20constructs.=20=20However,=20it=20is=20usually=20=
better=20to=20use=20the=0A+explicit=20non-greedy=20forms=20above=20=
instead.=0A+=0A+@table=20@code=0A+@item=20(minimal-match=20@var{rx})=0A=
+@cindex=20@code{minimal-match}=20in=20rx=0A+Match=20@var{rx},=20with=20=
@code{zero-or-more},=20@code{0+},=0A+@code{one-or-more},=20@code{1+},=20=
@code{zero-or-one},=20@code{opt}=20and=0A+@code{option}=20using=20=
non-greedy=20matching.=0A+=0A+@item=20(maximal-match=20@var{rx})=0A=
+@cindex=20@code{maximal-match}=20in=20rx=0A+Match=20@var{rx},=20with=20=
@code{zero-or-more},=20@code{0+},=0A+@code{one-or-more},=20@code{1+},=20=
@code{zero-or-one},=20@code{opt}=20and=0A+@code{option}=20using=20=
non-greedy=20matching.=20=20This=20is=20the=20default.=0A+@end=20table=0A=
+=0A+@subsubheading=20Matching=20single=20characters=0A+=0A+@table=20=
@asis=0A+@item=20@code{(any=20@var{set}@dots{})}=0A+@cindex=20@code{any}=20=
in=20rx=0A+@itemx=20@code{(char=20@var{set}@dots{})}=0A+@cindex=20=
@code{char}=20in=20rx=0A+@itemx=20@code{(in=20@var{set}@dots{})}=0A=
+@cindex=20@code{in}=20in=20rx=0A+@cindex=20character=20class=20in=20rx=0A=
+Match=20a=20single=20character=20from=20one=20of=20the=20@var{set}s.=20=20=
Each=20@var{set}=0A+is=20a=20character,=20a=20string=20representing=20=
the=20set=20of=20its=20characters,=20a=0A+range=20or=20a=20character=20=
class=20(see=20below).=20=20A=20range=20is=20either=20a=0A=
+hyphen-separated=20string=20like=20@code{"A-Z"},=20or=20a=20cons=20of=20=
characters=0A+like=20@code{(?A=20.=20?Z)}.=0A+=0A+Note=20that=20hyphen=20=
(@code{-})=20is=20special=20in=20strings=20in=20this=20construct,=0A=
+since=20it=20acts=20as=20a=20range=20separator.=20=20To=20include=20a=20=
hyphen,=20add=20it=20as=20a=0A+separate=20character=20or=20=
single-character=20string.@*=0A+Corresponding=20string=20regexp:=20=
@samp{[@dots{}]}=0A+=0A+@item=20@code{(not=20@var{charspec})}=0A+@cindex=20=
@code{not}=20in=20rx=0A+Match=20a=20character=20not=20included=20in=20=
@var{charspec}.=20=20@var{charspec}=20can=0A+be=20an=20@code{any},=20=
@code{syntax}=20or=20@code{category}=20form,=20or=20a=0A+character=20=
class.@*=0A+Corresponding=20string=20regexp:=20@samp{[^@dots{}]},=20=
@samp{\S@var{code}},=0A+@samp{\C@var{code}}=0A+=0A+@item=20=
@code{not-newline},=20@code{nonl}=0A+@cindex=20@code{not-newline}=20in=20=
rx=0A+@cindex=20@code{nonl}=20in=20rx=0A+Match=20any=20character=20=
except=20a=20newline.@*=0A+Corresponding=20string=20regexp:=20@samp{.}=20=
(dot)=0A+=0A+@item=20@code{anything}=0A+@cindex=20@code{anything}=20in=20=
rx=0A+Match=20any=20character.@*=0A+Corresponding=20string=20regexp:=20=
@samp{.\|\n}=20(for=20example)=0A+=0A+@item=20character=20class=0A=
+@cindex=20character=20class=20in=20rx=0A+Match=20a=20character=20from=20=
a=20named=20character=20class:=0A+=0A+@table=20@asis=0A+@item=20=
@code{alpha},=20@code{alphabetic},=20@code{letter}=0A+Match=20alphabetic=20=
characters.=20=20More=20precisely,=20match=20characters=20whose=0A=
+Unicode=20@samp{general-category}=20property=20indicates=20that=20they=20=
are=0A+alphabetic.=0A+=0A+@item=20@code{alnum},=20@code{alphanumeric}=0A=
+Match=20alphabetic=20characters=20and=20digits.=20=20More=20precisely,=20=
match=0A+characters=20whose=20Unicode=20@samp{general-category}=20=
property=20indicates=0A+that=20they=20are=20alphabetic=20or=20decimal=20=
digits.=0A+=0A+@item=20@code{digit},=20@code{numeric},=20@code{num}=0A=
+Match=20the=20digits=20@samp{0}--@samp{9}.=0A+=0A+@item=20=
@code{xdigit},=20@code{hex-digit},=20@code{hex}=0A+Match=20the=20=
hexadecimal=20digits=20@samp{0}--@samp{9},=20@samp{A}--@samp{F}=0A+and=20=
@samp{a}--@samp{f}.=0A+=0A+@item=20@code{cntrl},=20@code{control}=0A=
+Match=20any=20character=20whose=20code=20is=20in=20the=20range=200--31.=0A=
+=0A+@item=20@code{blank}=0A+Match=20horizontal=20whitespace.=20=20More=20=
precisely,=20match=20characters=20whose=0A+Unicode=20=
@samp{general-category}=20property=20indicates=20that=20they=20are=0A=
+spacing=20separators.=0A+=0A+@item=20@code{space},=20@code{whitespace},=20=
@code{white}=0A+Match=20any=20character=20that=20has=20whitespace=20=
syntax=0A+(@pxref{Syntax=20Class=20Table}).=0A+=0A+@item=20@code{lower},=20=
@code{lower-case}=0A+Match=20anything=20lower-case,=20as=20determined=20=
by=20the=20current=20case=20table.=0A+If=20@code{case-fold-search}=20is=20=
non-nil,=20this=20also=20matches=20any=0A+upper-case=20letter.=0A+=0A=
+@item=20@code{upper},=20@code{upper-case}=0A+Match=20anything=20=
upper-case,=20as=20determined=20by=20the=20current=20case=20table.=0A+If=20=
@code{case-fold-search}=20is=20non-nil,=20this=20also=20matches=20any=0A=
+lower-case=20letter.=0A+=0A+@item=20@code{graph},=20@code{graphic}=0A=
+Match=20any=20character=20except=20whitespace,=20@acronym{ASCII}=20and=0A=
+non-@acronym{ASCII}=20control=20characters,=20surrogates,=20and=20=
codepoints=0A+unassigned=20by=20Unicode,=20as=20indicated=20by=20the=20=
Unicode=0A+@samp{general-category}=20property.=0A+=0A+@item=20=
@code{print},=20@code{printing}=0A+Match=20whitespace=20or=20a=20=
character=20matched=20by=20@code{graph}.=0A+=0A+@item=20@code{punct},=20=
@code{punctuation}=0A+Match=20any=20punctuation=20character.=20=20(At=20=
present,=20for=20multibyte=0A+characters,=20anything=20that=20has=20=
non-word=20syntax.)=0A+=0A+@item=20@code{word},=20@code{wordchar}=0A=
+Match=20any=20character=20that=20has=20word=20syntax=20(@pxref{Syntax=20=
Class=20Table}).=0A+=0A+@item=20@code{ascii}=0A+Match=20any=20=
@acronym{ASCII}=20character=20(codes=200--127).=0A+=0A+@item=20=
@code{nonascii}=0A+Match=20any=20non-@acronym{ASCII}=20character=20(but=20=
not=20raw=20bytes).=0A+@end=20table=0A+=0A+Corresponding=20string=20=
regexp:=20@samp{[[:@var{class}:]]}=0A+=0A+@item=20@code{(syntax=20=
@var{syntax})}=0A+@cindex=20@code{syntax}=20in=20rx=0A+Match=20a=20=
character=20with=20syntax=20@var{syntax},=20being=20one=20of=20the=20=
following=0A+names:=0A+=0A+@multitable=20{@code{close-parenthesis}}=20=
{Syntax=20character}=0A+@headitem=20Syntax=20name=20=20=20=20=20=20=20=20=
=20=20@tab=20Syntax=20character=0A+@item=20@code{whitespace}=20=20=20=20=20=
=20=20=20@tab=20@code{-}=0A+@item=20@code{punctuation}=20=20=20=20=20=20=20=
@tab=20@code{.}=0A+@item=20@code{word}=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20@tab=20@code{w}=0A+@item=20@code{symbol}=20=20=20=20=20=20=20=20=20=
=20=20=20@tab=20@code{_}=0A+@item=20@code{open-parenthesis}=20=20@tab=20=
@code{(}=0A+@item=20@code{close-parenthesis}=20@tab=20@code{)}=0A+@item=20=
@code{expression-prefix}=20@tab=20@code{'}=0A+@item=20=
@code{string-quote}=20=20=20=20=20=20@tab=20@code{"}=0A+@item=20=
@code{paired-delimiter}=20=20@tab=20@code{$}=0A+@item=20@code{escape}=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{\}=0A+@item=20=
@code{character-quote}=20=20=20@tab=20@code{/}=0A+@item=20=
@code{comment-start}=20=20=20=20=20@tab=20@code{<}=0A+@item=20=
@code{comment-end}=20=20=20=20=20=20=20@tab=20@code{>}=0A+@item=20=
@code{string-delimiter}=20=20@tab=20@code{|}=0A+@item=20=
@code{comment-delimiter}=20@tab=20@code{!}=0A+@end=20multitable=0A+=0A=
+For=20details,=20@pxref{Syntax=20Class=20Table}.=20=20Please=20note=20=
that=0A+@code{(syntax=20punctuation)}=20is=20@emph{not}=20equivalent=20=
to=20the=20character=20class=0A+@code{punctuation}.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\s@var{code}}=0A+=0A+@item=20@code=20{(category=20=
@var{category})}=0A+@cindex=20@code{category}=20in=20rx=0A+Match=20a=20=
character=20in=20category=20@var{category},=20which=20is=20either=20one=20=
of=0A+the=20names=20below=20or=20its=20category=20character.=0A+=0A=
+@multitable=20{@code{vowel-modifying-diacritical-mark}}=20{Category=20=
character}=0A+@headitem=20Category=20name=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20@tab=20Category=20character=0A+@item=20=
@code{space-for-indent}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20space=0A+@item=20@code{base}=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{.}=0A+@item=20=
@code{consonant}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{0}=0A+@item=20@code{base-vowel}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{1}=0A=
+@item=20@code{upper-diacritical-mark}=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{2}=0A+@item=20@code{lower-diacritical-mark}=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{3}=0A+@item=20@code{tone-mark}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{4}=0A=
+@item=20@code{symbol}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{5}=0A+@item=20@code{digit}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{6}=0A+@item=20@code{vowel-modifying-diacritical-mark}=20=
@tab=20@code{7}=0A+@item=20@code{vowel-sign}=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{8}=0A+@item=20=
@code{semivowel-lower}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{9}=0A+@item=20@code{not-at-end-of-line}=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20@tab=20@code{<}=0A+@item=20=
@code{not-at-beginning-of-line}=20=20=20=20=20=20=20=20=20@tab=20=
@code{>}=0A+@item=20@code{alpha-numeric-two-byte}=20=20=20=20=20=20=20=20=
=20=20=20@tab=20@code{A}=0A+@item=20@code{chinese-two-byte}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{C}=0A+@item=20=
@code{greek-two-byte}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{G}=0A+@item=20@code{japanese-hiragana-two-byte}=20=20=20=20=
=20=20=20@tab=20@code{H}=0A+@item=20@code{indian-two-byte}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{I}=0A+@item=20=
@code{japanese-katakana-two-byte}=20=20=20=20=20=20=20@tab=20@code{K}=0A=
+@item=20@code{strong-left-to-right}=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{L}=0A+@item=20@code{korean-hangul-two-byte}=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{N}=0A+@item=20@code{strong-right-to-left}=20=20=
=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{R}=0A+@item=20=
@code{cyrillic-two-byte}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{Y}=0A+@item=20@code{combining-diacritic}=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{^}=0A+@item=20@code{ascii}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{a}=0A+@item=20@code{arabic}=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{b}=0A+@item=20=
@code{chinese}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20@tab=20@code{c}=0A+@item=20@code{ethiopic}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20=
@code{e}=0A+@item=20@code{greek}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{g}=0A+@item=20=
@code{korean}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{h}=0A+@item=20@code{indian}=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{i}=0A+@item=20@code{japanese}=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{j}=0A+@item=20=
@code{japanese-katakana}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{k}=0A+@item=20@code{latin}=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{l}=0A+@item=20=
@code{lao}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20@tab=20@code{o}=0A+@item=20@code{tibetan}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{q}=0A+@item=20@code{japanese-roman}=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{r}=0A+@item=20@code{thai}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20@tab=20@code{t}=0A+@item=20@code{vietnamese}=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{v}=0A+@item=20=
@code{hebrew}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{w}=0A+@item=20@code{cyrillic}=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20=
@code{y}=0A+@item=20@code{can-break}=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{|}=0A+@end=20multitable=0A=
+=0A+For=20more=20information=20about=20currently=20defined=20=
categories,=20run=20the=0A+command=20@kbd{M-x=20describe-categories=20=
@key{RET}}.=20=20For=20how=20to=20define=0A+new=20categories,=20=
@pxref{Categories}.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\c@var{code}}=0A+@end=20table=0A+=0A+@subsubheading=20Zero-width=20=
assertions=0A+=0A+These=20all=20match=20the=20empty=20string,=20but=20=
only=20in=20specific=20places.=0A+=0A+@table=20@asis=0A+@item=20=
@code{line-start},=20@code{bol}=0A+@cindex=20@code{line-start}=20in=20rx=0A=
+@cindex=20@code{bol}=20in=20rx=0A+Match=20at=20the=20beginning=20of=20a=20=
line.@*=0A+Corresponding=20string=20regexp:=20@samp{^}=0A+=0A+@item=20=
@code{line-end},=20@code{eol}=0A+@cindex=20@code{line-end}=20in=20rx=0A=
+@cindex=20@code{eol}=20in=20rx=0A+Match=20at=20the=20end=20of=20a=20=
line.@*=0A+Corresponding=20string=20regexp:=20@samp{$}=0A+=0A+@item=20=
@code{string-start},=20@code{bos},=20@code{buffer-start},=20@code{bot}=0A=
+@cindex=20@code{string-start}=20in=20rx=0A+@cindex=20@code{bos}=20in=20=
rx=0A+@cindex=20@code{buffer-start}=20in=20rx=0A+@cindex=20@code{bot}=20=
in=20rx=0A+Match=20at=20the=20start=20of=20the=20string=20or=20buffer=20=
being=20matched=20against.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\`}=0A+=0A+@item=20@code{string-end},=20@code{eos},=20=
@code{buffer-end},=20@code{eot}=0A+@cindex=20@code{string-end}=20in=20rx=0A=
+@cindex=20@code{eos}=20in=20rx=0A+@cindex=20@code{buffer-end}=20in=20rx=0A=
+@cindex=20@code{eot}=20in=20rx=0A+Match=20at=20the=20end=20of=20the=20=
string=20or=20buffer=20being=20matched=20against.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\'}=0A+=0A+@item=20@code{point}=0A+@cindex=20=
@code{point}=20in=20rx=0A+Match=20at=20point.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\=3D}=0A+=0A+@item=20@code{word-start}=0A=
+@cindex=20@code{word-start}=20in=20rx=0A+Match=20at=20the=20beginning=20=
of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20@samp{\<}=0A+=0A=
+@item=20@code{word-end}=0A+@cindex=20@code{word-end}=20in=20rx=0A+Match=20=
at=20the=20end=20of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\>}=0A+=0A+@item=20@code{word-boundary}=0A+@cindex=20=
@code{word-boundary}=20in=20rx=0A+Match=20at=20the=20beginning=20or=20=
end=20of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20@samp{\b}=0A=
+=0A+@item=20@code{not-word-boundary}=0A+@cindex=20=
@code{not-word-boundary}=20in=20rx=0A+Match=20anywhere=20but=20at=20the=20=
beginning=20or=20end=20of=20a=20word.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\B}=0A+=0A+@item=20@code{symbol-start}=0A+@cindex=20=
@code{symbol-start}=20in=20rx=0A+Match=20at=20the=20beginning=20of=20a=20=
symbol.@*=0A+Corresponding=20string=20regexp:=20@samp{\_<}=0A+=0A+@item=20=
@code{symbol-end}=0A+@cindex=20@code{symbol-end}=20in=20rx=0A+Match=20at=20=
the=20end=20of=20a=20symbol.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\_>}=0A+@end=20table=0A+=0A+@subsubheading=20Capture=20groups=0A+=0A=
+@table=20@code=0A+@item=20(group=20@var{rx}@dots{})=0A+@cindex=20=
@code{group}=20in=20rx=0A+@itemx=20(submatch=20@var{rx}@dots{})=0A=
+@cindex=20@code{submatch}=20in=20rx=0A+Match=20the=20@var{rx}s,=20=
making=20the=20matched=20text=20and=20position=20accessible=0A+in=20the=20=
match=20data.=20=20The=20first=20group=20in=20a=20regexp=20is=20numbered=20=
1;=0A+subsequent=20groups=20will=20be=20numbered=20one=20higher=20than=20=
the=20previous=0A+group.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\(@dots{}\)}=0A+=0A+@item=20(group-n=20@var{n}=20@var{rx}@dots{})=0A=
+@cindex=20@code{group-n}=20in=20rx=0A+@itemx=20(submatch-n=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@code{submatch-n}=20in=20rx=0A+Like=20=
@code{group},=20but=20explicitly=20assign=20the=20group=20number=20=
@var{n}.=0A+@var{n}=20must=20be=20positive.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\(?@var{n}:@dots{}\)}=0A+=0A+@item=20(backref=20@var{n})=0A=
+@cindex=20@code{backref}=20in=20rx=0A+Match=20the=20text=20previously=20=
matched=20by=20group=20number=20@var{n}.=0A+@var{n}=20must=20be=20in=20=
the=20range=201--9.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\@var{n}}=0A+@end=20table=0A+=0A+@subsubheading=20Dynamic=20=
inclusion=0A+=0A+@table=20@code=0A+@item=20(literal=20@var{expr})=0A=
+@cindex=20@code{literal}=20in=20rx=0A+Match=20the=20literal=20string=20=
that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A+expression=20=
@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20call=20time,=20=
in=0A+the=20current=20lexical=20environment.=0A+=0A+@item=20(regexp=20=
@var{expr})=0A+@cindex=20@code{regexp}=20in=20rx=0A+@itemx=20(regex=20=
@var{expr})=0A+@cindex=20@code{regex}=20in=20rx=0A+Match=20the=20string=20=
regexp=20that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A=
+expression=20@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20=
call=20time,=20in=0A+the=20current=20lexical=20environment.=0A+=0A+@item=20=
(eval=20@var{expr})=0A+@cindex=20@code{eval}=20in=20rx=0A+Match=20the=20=
rx=20form=20that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A=
+expression=20@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20=
macro-expansion=0A+time=20for=20@code{rx},=20at=20call=20time=20for=20=
@code{rx-to-string},=0A+in=20the=20current=20global=20environment.=0A=
+@end=20table=0A+=0A+@node=20Rx=20Functions=0A+@subsubsection=20=
Functions=20and=20macros=20using=20@code{rx}=20regexps=0A+=0A+@defmac=20=
rx=20rx-expr@dots{}=0A+Translate=20the=20@var{rx-expr}s=20to=20a=20=
string=20regexp,=20as=20if=20they=20were=20the=0A+body=20of=20a=20=
@code{(seq=20@dots{})}=20form.=20=20The=20@code{rx}=20macro=20expands=20=
to=20a=0A+string=20constant,=20or,=20if=20@code{literal}=20or=20=
@code{regexp}=20forms=20are=0A+used,=20a=20Lisp=20expression=20that=20=
evaluates=20to=20a=20string.=0A+@end=20defmac=0A+=0A+@defun=20=
rx-to-string=20rx-expr=20&optional=20no-group=0A+Translate=20=
@var{rx-expr}=20to=20a=20string=20regexp=20which=20is=20returned.=0A+If=20=
@var{no-group}=20is=20absent=20or=20nil,=20bracket=20the=20result=20in=20=
a=0A+non-capturing=20group,=20@samp{\(?:@dots{}\)},=20if=20necessary=20=
to=20ensure=20that=0A+a=20postfix=20operator=20appended=20to=20it=20will=20=
apply=20to=20the=20whole=20expression.=0A+=0A+Arguments=20to=20=
@code{literal}=20and=20@code{regexp}=20forms=20in=20@var{rx-expr}=0A=
+must=20be=20string=20literals.=0A+@end=20defun=0A+=0A+The=20=
@code{pcase}=20macro=20can=20use=20@code{rx}=20expressions=20as=20=
patterns=0A+directly;=20@pxref{rx=20in=20pcase}.=0A+@end=20ifnottex=0A+=0A=
=20@node=20Regexp=20Functions=0A=20@subsection=20Regular=20Expression=20=
Functions=0A=20=0A--=20=0A2.20.1=20(Apple=20Git-117)=0A=0A=

--Apple-Mail=_4EE8477A-8B77-4C86-A6A0-ED3F0D46DD21
Content-Disposition: attachment;
	filename=0001-Shorter-rx-doc-string-bug-36496.patch
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="0001-Shorter-rx-doc-string-bug-36496.patch"
Content-Transfer-Encoding: quoted-printable

=46rom=2048b2baa78e62a97ca2d621c5be643e6b539d78bf=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20=
<mattiase@HIDDEN>=0ADate:=20Sat,=206=20Jul=202019=2013:22:15=20+0200=0A=
Subject:=20[PATCH]=20Shorter=20`rx'=20doc=20string=20(bug#36496)=0A=0A*=20=
lisp/emacs-lisp/rx.el=20(rx):=20Replace=20long=20description=20with=20a=20=
condensed=0Asummary=20of=20the=20rx=20syntax,=20with=20reference=20to=20=
the=20manual=20section.=0A---=0A=20lisp/emacs-lisp/rx.el=20|=20416=20=
++++++++++--------------------------------=0A=201=20file=20changed,=2095=20=
insertions(+),=20321=20deletions(-)=0A=0Adiff=20--git=20=
a/lisp/emacs-lisp/rx.el=20b/lisp/emacs-lisp/rx.el=0Aindex=20=
24dd6cbf1d..e65460c39d=20100644=0A---=20a/lisp/emacs-lisp/rx.el=0A+++=20=
b/lisp/emacs-lisp/rx.el=0A@@=20-959,327=20+959,101=20@@=20rx-to-string=0A=
=20;;;###autoload=0A=20(defmacro=20rx=20(&rest=20regexps)=0A=20=20=20=
"Translate=20regular=20expressions=20REGEXPS=20in=20sexp=20form=20to=20a=20=
regexp=20string.=0A-REGEXPS=20is=20a=20non-empty=20sequence=20of=20forms=20=
of=20the=20sort=20listed=20below.=0A-=0A-Note=20that=20`rx'=20is=20a=20=
Lisp=20macro;=20when=20used=20in=20a=20Lisp=20program=20being=0A=
-compiled,=20the=20translation=20is=20performed=20by=20the=20compiler.=20=
=20The=0A-`literal'=20and=20`regexp'=20forms=20accept=20subforms=20that=20=
will=20evaluate=0A-to=20strings,=20in=20addition=20to=20constant=20=
strings.=20=20If=20REGEXPS=20include=0A-such=20forms,=20then=20the=20=
result=20is=20an=20expression=20which=20returns=20a=0A-regexp=20string,=20=
rather=20than=20a=20regexp=20string=20directly.=20=20See=0A=
-`rx-to-string'=20for=20performing=20translation=20completely=20at=20run=20=
time.=0A-=0A-The=20following=20are=20valid=20subforms=20of=20regular=20=
expressions=20in=20sexp=0A-notation.=0A-=0A-STRING=0A-=20=20=20=20=20=
matches=20string=20STRING=20literally.=0A-=0A-CHAR=0A-=20=20=20=20=20=
matches=20character=20CHAR=20literally.=0A-=0A-`not-newline',=20`nonl'=0A=
-=20=20=20=20=20matches=20any=20character=20except=20a=20newline.=0A-=0A=
-`anything'=0A-=20=20=20=20=20matches=20any=20character=0A-=0A-`(any=20=
SET=20...)'=0A-`(in=20SET=20...)'=0A-`(char=20SET=20...)'=0A-=20=20=20=20=
=20matches=20any=20character=20in=20SET=20....=20=20SET=20may=20be=20a=20=
character=20or=20string.=0A-=20=20=20=20=20Ranges=20of=20characters=20=
can=20be=20specified=20as=20`A-Z'=20in=20strings.=0A-=20=20=20=20=20=
Ranges=20may=20also=20be=20specified=20as=20conses=20like=20`(?A=20.=20=
?Z)'.=0A-=20=20=20=20=20Reversed=20ranges=20like=20`Z-A'=20and=20`(?Z=20=
.=20?A)'=20are=20not=20permitted.=0A-=0A-=20=20=20=20=20SET=20may=20also=20=
be=20the=20name=20of=20a=20character=20class:=20`digit',=0A-=20=20=20=20=20=
`control',=20`hex-digit',=20`blank',=20`graph',=20`print',=20`alnum',=0A=
-=20=20=20=20=20`alpha',=20`ascii',=20`nonascii',=20`lower',=20`punct',=20=
`space',=20`upper',=0A-=20=20=20=20=20`word',=20or=20one=20of=20their=20=
synonyms.=0A-=0A-`(not=20(any=20SET=20...))'=0A-=20=20=20=20=20matches=20=
any=20character=20not=20in=20SET=20...=0A-=0A-`line-start',=20`bol'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
beginning=20of=20a=20line=0A-=20=20=20=20=20in=20the=20text=20being=20=
matched=0A-=0A-`line-end',=20`eol'=0A-=20=20=20=20=20is=20similar=20to=20=
`line-start'=20but=20matches=20only=20at=20the=20end=20of=20a=20line=0A-=0A=
-`string-start',=20`bos',=20`bot'=0A-=20=20=20=20=20matches=20the=20=
empty=20string,=20but=20only=20at=20the=20beginning=20of=20the=0A-=20=20=20=
=20=20string=20being=20matched=20against.=0A-=0A-`string-end',=20`eos',=20=
`eot'=0A-=20=20=20=20=20matches=20the=20empty=20string,=20but=20only=20=
at=20the=20end=20of=20the=0A-=20=20=20=20=20string=20being=20matched=20=
against.=0A-=0A-`buffer-start'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20the=20beginning=20of=20the=0A-=20=20=20=20=20=
buffer=20being=20matched=20against.=20=20Actually=20equivalent=20to=20=
`string-start'.=0A-=0A-`buffer-end'=0A-=20=20=20=20=20matches=20the=20=
empty=20string,=20but=20only=20at=20the=20end=20of=20the=0A-=20=20=20=20=20=
buffer=20being=20matched=20against.=20=20Actually=20equivalent=20to=20=
`string-end'.=0A-=0A-`point'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20point.=0A-=0A-`word-start',=20`bow'=0A-=20=20=
=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
beginning=20of=20a=20word.=0A-=0A-`word-end',=20`eow'=0A-=20=20=20=20=20=
matches=20the=20empty=20string,=20but=20only=20at=20the=20end=20of=20a=20=
word.=0A-=0A-`word-boundary'=0A-=20=20=20=20=20matches=20the=20empty=20=
string,=20but=20only=20at=20the=20beginning=20or=20end=20of=20a=0A-=20=20=
=20=20=20word.=0A-=0A-`(not=20word-boundary)'=0A-`not-word-boundary'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20not=20at=20the=20=
beginning=20or=20end=20of=20a=0A-=20=20=20=20=20word.=0A-=0A=
-`symbol-start'=0A-=20=20=20=20=20matches=20the=20empty=20string,=20but=20=
only=20at=20the=20beginning=20of=20a=20symbol.=0A-=0A-`symbol-end'=0A-=20=
=20=20=20=20matches=20the=20empty=20string,=20but=20only=20at=20the=20=
end=20of=20a=20symbol.=0A-=0A-`digit',=20`numeric',=20`num'=0A-=20=20=20=20=
=20matches=200=20through=209.=0A-=0A-`control',=20`cntrl'=0A-=20=20=20=20=
=20matches=20any=20character=20whose=20code=20is=20in=20the=20range=20=
0-31.=0A-=0A-`hex-digit',=20`hex',=20`xdigit'=0A-=20=20=20=20=20matches=20=
0=20through=209,=20a=20through=20f=20and=20A=20through=20F.=0A-=0A=
-`blank'=0A-=20=20=20=20=20matches=20horizontal=20whitespace,=20as=20=
defined=20by=20Annex=20C=20of=20the=0A-=20=20=20=20=20Unicode=20=
Technical=20Standard=20#18.=20=20In=20particular,=20it=20matches=0A-=20=20=
=20=20=20spaces,=20tabs,=20and=20other=20characters=20whose=20Unicode=0A=
-=20=20=20=20=20`general-category'=20property=20indicates=20they=20are=20=
spacing=0A-=20=20=20=20=20separators.=0A-=0A-`graphic',=20`graph'=0A-=20=20=
=20=20=20matches=20graphic=20characters--everything=20except=20=
whitespace,=20ASCII=0A-=20=20=20=20=20and=20non-ASCII=20control=20=
characters,=20surrogates,=20and=20codepoints=0A-=20=20=20=20=20=
unassigned=20by=20Unicode.=0A-=0A-`printing',=20`print'=0A-=20=20=20=20=20=
matches=20whitespace=20and=20graphic=20characters.=0A-=0A=
-`alphanumeric',=20`alnum'=0A-=20=20=20=20=20matches=20alphabetic=20=
characters=20and=20digits.=20=20For=20multibyte=20characters,=0A-=20=20=20=
=20=20it=20matches=20characters=20whose=20Unicode=20`general-category'=20=
property=0A-=20=20=20=20=20indicates=20they=20are=20alphabetic=20or=20=
decimal=20number=20characters.=0A-=0A-`letter',=20`alphabetic',=20=
`alpha'=0A-=20=20=20=20=20matches=20alphabetic=20characters.=20=20For=20=
multibyte=20characters,=0A-=20=20=20=20=20it=20matches=20characters=20=
whose=20Unicode=20`general-category'=20property=0A-=20=20=20=20=20=
indicates=20they=20are=20alphabetic=20characters.=0A-=0A-`ascii'=0A-=20=20=
=20=20=20matches=20ASCII=20(unibyte)=20characters.=0A-=0A-`nonascii'=0A-=20=
=20=20=20=20matches=20non-ASCII=20(multibyte)=20characters.=0A-=0A=
-`lower',=20`lower-case'=0A-=20=20=20=20=20matches=20anything=20=
lower-case,=20as=20determined=20by=20the=20current=20case=0A-=20=20=20=20=
=20table.=20=20If=20`case-fold-search'=20is=20non-nil,=20this=20also=20=
matches=20any=0A-=20=20=20=20=20upper-case=20letter.=0A-=0A-`upper',=20=
`upper-case'=0A-=20=20=20=20=20matches=20anything=20upper-case,=20as=20=
determined=20by=20the=20current=20case=0A-=20=20=20=20=20table.=20=20If=20=
`case-fold-search'=20is=20non-nil,=20this=20also=20matches=20any=0A-=20=20=
=20=20=20lower-case=20letter.=0A-=0A-`punctuation',=20`punct'=0A-=20=20=20=
=20=20matches=20punctuation.=20=20(But=20at=20present,=20for=20multibyte=20=
characters,=0A-=20=20=20=20=20it=20matches=20anything=20that=20has=20=
non-word=20syntax.)=0A-=0A-`space',=20`whitespace',=20`white'=0A-=20=20=20=
=20=20matches=20anything=20that=20has=20whitespace=20syntax.=0A-=0A=
-`word',=20`wordchar'=0A-=20=20=20=20=20matches=20anything=20that=20has=20=
word=20syntax.=0A-=0A-`not-wordchar'=0A-=20=20=20=20=20matches=20=
anything=20that=20has=20non-word=20syntax.=0A-=0A-`(syntax=20SYNTAX)'=0A=
-=20=20=20=20=20matches=20a=20character=20with=20syntax=20SYNTAX.=20=20=
SYNTAX=20must=20be=20one=0A-=20=20=20=20=20of=20the=20following=20=
symbols,=20or=20a=20symbol=20corresponding=20to=20the=20syntax=0A-=20=20=20=
=20=20character,=20e.g.=20`\\.'=20for=20`\\s.'.=0A-=0A-=20=20=20=20=20=
`whitespace'=09=09(\\s-=20in=20string=20notation)=0A-=20=20=20=20=20=
`punctuation'=09=09(\\s.)=0A-=20=20=20=20=20`word'=09=09=09(\\sw)=0A-=20=20=
=20=20=20`symbol'=09=09=09(\\s_)=0A-=20=20=20=20=20`open-parenthesis'=09=09=
(\\s()=0A-=20=20=20=20=20`close-parenthesis'=09(\\s))=0A-=20=20=20=20=20=
`expression-prefix'=09(\\s')=0A-=20=20=20=20=20`string-quote'=09=09=
(\\s\")=0A-=20=20=20=20=20`paired-delimiter'=09=09(\\s$)=0A-=20=20=20=20=20=
`escape'=09=09=09(\\s\\)=0A-=20=20=20=20=20`character-quote'=09=09(\\s/)=0A=
-=20=20=20=20=20`comment-start'=09=09(\\s<)=0A-=20=20=20=20=20=
`comment-end'=09=09(\\s>)=0A-=20=20=20=20=20`string-delimiter'=09=09=
(\\s|)=0A-=20=20=20=20=20`comment-delimiter'=09(\\s!)=0A-=0A-`(not=20=
(syntax=20SYNTAX))'=0A-=20=20=20=20=20matches=20a=20character=20that=20=
doesn't=20have=20syntax=20SYNTAX.=0A-=0A-`(category=20CATEGORY)'=0A-=20=20=
=20=20=20matches=20a=20character=20with=20category=20CATEGORY.=20=20=
CATEGORY=20must=20be=0A-=20=20=20=20=20either=20a=20character=20to=20use=20=
for=20C,=20or=20one=20of=20the=20following=20symbols.=0A-=0A-=20=20=20=20=
=20`space-for-indent'=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(\\c\\s=20in=20string=20notation)=0A-=20=20=20=20=20`base'=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
(\\c.)=0A-=20=20=20=20=20`consonant'=09=09=09(\\c0)=0A-=20=20=20=20=20=
`base-vowel'=09=09=09(\\c1)=0A-=20=20=20=20=20`upper-diacritical-mark'=09=
=09(\\c2)=0A-=20=20=20=20=20`lower-diacritical-mark'=09=09(\\c3)=0A-=20=20=
=20=20=20`tone-mark'=09=09=20=20=20=20=20=20=20=20(\\c4)=0A-=20=20=20=20=20=
`symbol'=09=09=09=20=20=20=20=20=20=20=20(\\c5)=0A-=20=20=20=20=20=
`digit'=09=09=09=20=20=20=20=20=20=20=20(\\c6)=0A-=20=20=20=20=20=
`vowel-modifying-diacritical-mark'=09(\\c7)=0A-=20=20=20=20=20=
`vowel-sign'=09=09=09(\\c8)=0A-=20=20=20=20=20`semivowel-lower'=09=09=09=
(\\c9)=0A-=20=20=20=20=20`not-at-end-of-line'=09=09(\\c<)=0A-=20=20=20=20=
=20`not-at-beginning-of-line'=09=09(\\c>)=0A-=20=20=20=20=20=
`alpha-numeric-two-byte'=09=09(\\cA)=0A-=20=20=20=20=20=
`chinese-two-byte'=09=09=09(\\cC)=0A-=20=20=20=20=20`greek-two-byte'=09=09=
=09(\\cG)=0A-=20=20=20=20=20`japanese-hiragana-two-byte'=09(\\cH)=0A-=20=20=
=20=20=20`indian-two-byte'=09=09=09(\\cI)=0A-=20=20=20=20=20=
`japanese-katakana-two-byte'=09(\\cK)=0A-=20=20=20=20=20=
`strong-left-to-right'=20=20=20=20=20=20=20=20=20=20=20=20=20(\\cL)=0A-=20=
=20=20=20=20`korean-hangul-two-byte'=09=09(\\cN)=0A-=20=20=20=20=20=
`strong-right-to-left'=20=20=20=20=20=20=20=20=20=20=20=20=20(\\cR)=0A-=20=
=20=20=20=20`cyrillic-two-byte'=09=09(\\cY)=0A-=20=20=20=20=20=
`combining-diacritic'=09=09(\\c^)=0A-=20=20=20=20=20`ascii'=09=09=09=09=
(\\ca)=0A-=20=20=20=20=20`arabic'=09=09=09=09(\\cb)=0A-=20=20=20=20=20=
`chinese'=09=09=09=09(\\cc)=0A-=20=20=20=20=20`ethiopic'=09=09=09=09=
(\\ce)=0A-=20=20=20=20=20`greek'=09=09=09=09(\\cg)=0A-=20=20=20=20=20=
`korean'=09=09=09=09(\\ch)=0A-=20=20=20=20=20`indian'=09=09=09=09(\\ci)=0A=
-=20=20=20=20=20`japanese'=09=09=09=09(\\cj)=0A-=20=20=20=20=20=
`japanese-katakana'=09=09(\\ck)=0A-=20=20=20=20=20`latin'=09=09=09=09=
(\\cl)=0A-=20=20=20=20=20`lao'=09=09=09=09(\\co)=0A-=20=20=20=20=20=
`tibetan'=09=09=09=09(\\cq)=0A-=20=20=20=20=20`japanese-roman'=09=09=09=
(\\cr)=0A-=20=20=20=20=20`thai'=09=09=09=09(\\ct)=0A-=20=20=20=20=20=
`vietnamese'=09=09=09(\\cv)=0A-=20=20=20=20=20`hebrew'=09=09=09=09(\\cw)=0A=
-=20=20=20=20=20`cyrillic'=09=09=09=09(\\cy)=0A-=20=20=20=20=20=
`can-break'=09=09=09(\\c|)=0A-=0A-`(not=20(category=20CATEGORY))'=0A-=20=20=
=20=20=20matches=20a=20character=20that=20doesn't=20have=20category=20=
CATEGORY.=0A-=0A-`(and=20SEXP1=20SEXP2=20...)'=0A-`(:=20SEXP1=20SEXP2=20=
...)'=0A-`(seq=20SEXP1=20SEXP2=20...)'=0A-`(sequence=20SEXP1=20SEXP2=20=
...)'=0A-=20=20=20=20=20matches=20what=20SEXP1=20matches,=20followed=20=
by=20what=20SEXP2=20matches,=20etc.=0A-=20=20=20=20=20Without=20=
arguments,=20matches=20the=20empty=20string.=0A-=0A-`(submatch=20SEXP1=20=
SEXP2=20...)'=0A-`(group=20SEXP1=20SEXP2=20...)'=0A-=20=20=20=20=20like=20=
`and',=20but=20makes=20the=20match=20accessible=20with=20`match-end',=0A=
-=20=20=20=20=20`match-beginning',=20and=20`match-string'.=0A-=0A=
-`(submatch-n=20N=20SEXP1=20SEXP2=20...)'=0A-`(group-n=20N=20SEXP1=20=
SEXP2=20...)'=0A-=20=20=20=20=20like=20`group',=20but=20make=20it=20an=20=
explicitly-numbered=20group=20with=0A-=20=20=20=20=20group=20number=20N.=0A=
-=0A-`(or=20SEXP1=20SEXP2=20...)'=0A-`(|=20SEXP1=20SEXP2=20...)'=0A-=20=20=
=20=20=20matches=20anything=20that=20matches=20SEXP1=20or=20SEXP2,=20=
etc.=20=20If=20all=0A-=20=20=20=20=20args=20are=20strings,=20use=20=
`regexp-opt'=20to=20optimize=20the=20resulting=0A-=20=20=20=20=20regular=20=
expression.=20=20Without=20arguments,=20never=20matches=20anything.=0A-=0A=
-`(minimal-match=20SEXP)'=0A-=20=20=20=20=20produce=20a=20non-greedy=20=
regexp=20for=20SEXP.=20=20Normally,=20regexps=20matching=0A-=20=20=20=20=20=
zero=20or=20more=20occurrences=20of=20something=20are=20\"greedy\"=20in=20=
that=20they=0A-=20=20=20=20=20match=20as=20much=20as=20they=20can,=20as=20=
long=20as=20the=20overall=20regexp=20can=0A-=20=20=20=20=20still=20=
match.=20=20A=20non-greedy=20regexp=20matches=20as=20little=20as=20=
possible.=0A-=0A-`(maximal-match=20SEXP)'=0A-=20=20=20=20=20produce=20a=20=
greedy=20regexp=20for=20SEXP.=20=20This=20is=20the=20default.=0A-=0A=
-Below,=20`SEXP=20...'=20represents=20a=20sequence=20of=20regexp=20=
forms,=20treated=20as=20if=0A-enclosed=20in=20`(and=20...)'.=0A-=0A=
-`(zero-or-more=20SEXP=20...)'=0A-`(0+=20SEXP=20...)'=0A-=20=20=20=20=20=
matches=20zero=20or=20more=20occurrences=20of=20what=20SEXP=20...=20=
matches.=0A-=0A-`(*=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`zero-or-more',=20but=20always=20produces=20a=20greedy=20regexp,=20=
independent=0A-=20=20=20=20=20of=20`rx-greedy-flag'.=0A-=0A-`(*?=20SEXP=20=
...)'=0A-=20=20=20=20=20like=20`zero-or-more',=20but=20always=20produces=20=
a=20non-greedy=20regexp,=0A-=20=20=20=20=20independent=20of=20=
`rx-greedy-flag'.=0A-=0A-`(one-or-more=20SEXP=20...)'=0A-`(1+=20SEXP=20=
...)'=0A-=20=20=20=20=20matches=20one=20or=20more=20occurrences=20of=20=
SEXP=20...=0A-=0A-`(+=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`one-or-more',=20but=20always=20produces=20a=20greedy=20regexp.=0A-=0A=
-`(+?=20SEXP=20...)'=0A-=20=20=20=20=20like=20`one-or-more',=20but=20=
always=20produces=20a=20non-greedy=20regexp.=0A-=0A-`(zero-or-one=20SEXP=20=
...)'=0A-`(optional=20SEXP=20...)'=0A-`(opt=20SEXP=20...)'=0A-=20=20=20=20=
=20matches=20zero=20or=20one=20occurrences=20of=20A.=0A-=0A-`(?=20SEXP=20=
...)'=0A-=20=20=20=20=20like=20`zero-or-one',=20but=20always=20produces=20=
a=20greedy=20regexp.=0A-=0A-`(??=20SEXP=20...)'=0A-=20=20=20=20=20like=20=
`zero-or-one',=20but=20always=20produces=20a=20non-greedy=20regexp.=0A-=0A=
-`(repeat=20N=20SEXP)'=0A-`(=3D=20N=20SEXP=20...)'=0A-=20=20=20=20=20=
matches=20N=20occurrences.=0A-=0A-`(>=3D=20N=20SEXP=20...)'=0A-=20=20=20=20=
=20matches=20N=20or=20more=20occurrences.=0A-=0A-`(repeat=20N=20M=20=
SEXP)'=0A-`(**=20N=20M=20SEXP=20...)'=0A-=20=20=20=20=20matches=20N=20to=20=
M=20occurrences.=0A-=0A-`(backref=20N)'=0A-=20=20=20=20=20matches=20what=20=
was=20matched=20previously=20by=20submatch=20N.=0A-=0A-`(literal=20=
STRING-EXPR)'=0A-=20=20=20=20=20matches=20STRING-EXPR=20literally,=20=
where=20STRING-EXPR=20is=20any=20lisp=0A-=20=20=20=20=20expression=20=
that=20evaluates=20to=20a=20string.=0A-=0A-`(regexp=20REGEXP-EXPR)'=0A-=20=
=20=20=20=20include=20REGEXP-EXPR=20in=20string=20notation=20in=20the=20=
result,=20where=0A-=20=20=20=20=20REGEXP-EXPR=20is=20any=20lisp=20=
expression=20that=20evaluates=20to=20a=0A-=20=20=20=20=20string=20=
containing=20a=20valid=20regexp.=0A-=0A-`(eval=20FORM)'=0A-=20=20=20=20=20=
evaluate=20FORM=20and=20insert=20result.=20=20If=20result=20is=20a=20=
string,=0A-=20=20=20=20=20`regexp-quote'=20it.=20=20Note=20that=20FORM=20=
is=20evaluated=20during=0A-=20=20=20=20=20macroexpansion."=0A+Each=20=
argument=20is=20one=20of=20the=20forms=20below;=20RX=20is=20a=20subform,=20=
and=20RX...=20stands=0A+for=20one=20or=20more=20RXs.=20=20For=20details,=20=
see=20Info=20node=20`(elisp)=20Rx=20Notation'.=0A+See=20`rx-to-string'=20=
for=20the=20corresponding=20function.=0A+=0A+STRING=20=20=20=20=20=20=20=20=
=20Match=20a=20literal=20string.=0A+CHAR=20=20=20=20=20=20=20=20=20=20=20=
Match=20a=20literal=20character.=0A+=0A+(seq=20RX...)=20=20=20=20Match=20=
the=20RXs=20in=20sequence.=20=20Alias:=20:,=20sequence,=20and=0A+(or=20=
RX...)=20=20=20=20=20Match=20one=20of=20the=20RXs.=20=20Alias:=20|=0A+=0A=
+(zero-or-more=20RX...)=20Match=20RXs=20zero=20or=20more=20times.=20=20=
Alias:=20*,=200+=0A+(one-or-more=20RX...)=20=20Match=20RXs=20one=20or=20=
more=20times.=20=20Alias:=20+,=201+=0A+(zero-or-one=20RX...)=20=20Match=20=
RXs=20or=20the=20empty=20string.=20=20Alias:=20?,=20opt,=20optional=0A=
+(*?=20RX...)=20=20=20=20=20=20Match=20RXs=20zero=20or=20more=20times,=20=
non-greedily.=0A+(+?=20RX...)=20=20=20=20=20=20Match=20RXs=20one=20or=20=
more=20times,=20non-greedily.=0A+(??=20RX...)=20=20=20=20=20=20Match=20=
RXs=20or=20the=20empty=20string,=20non-greedily.=0A+(=3D=20N=20RX...)=20=20=
=20=20=20Match=20RXs=20exactly=20N=20times.=0A+(>=3D=20N=20RX...)=20=20=20=
=20Match=20RXs=20N=20or=20more=20times.=0A+(**=20N=20M=20RX...)=20=20=
Match=20RXs=20N=20to=20M=20times.=20=20Alias:=20repeat=0A+(minimal-match=20=
RX)=20=20Match=20RX,=20with=20zero-or-more,=20one-or-more,=0A+=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20zero-or-one,=200+,=201+,=20opt,=20=
and=20optional=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20using=20=
non-greedy=20matching.=0A+(maximal-match=20RX)=20=20Match=20RX,=20with=20=
zero-or-more,=20one-or-more,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20zero-or-one,=200+,=201+,=20opt,=20and=20optional=0A+=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20using=20greedy=20matching,=20which=20is=20=
the=20default.=0A+=0A+(any=20SET...)=20=20=20=20Match=20a=20character=20=
from=20one=20of=20the=20SETs.=20=20Each=20SET=20is=20a=0A+=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20character,=20a=20string,=20a=20range=20=
as=20string=20\"A-Z\"=20or=20cons=0A+=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20(?A=20.=20?Z),=20or=20a=20character=20class=20(see=20below).=20=
=20Alias:=20in,=20char=0A+(not=20CHARSPEC)=20=20Match=20one=20character=20=
not=20matched=20by=20CHARSPEC.=20=20CHARSPEC=0A+=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20can=20be=20(any=20...),=20(syntax=20...),=20=
(category=20...),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20or=20=
a=20character=20class.=0A+not-newline=20=20=20=20=20Match=20any=20=
character=20except=20a=20newline.=20=20Alias:=20nonl=0A+anything=20=20=20=
=20=20=20=20=20Match=20any=20character.=0A+=0A+CHARCLASS=20=20=20=20=20=20=
=20Match=20a=20character=20from=20a=20character=20class.=20=20One=20of:=0A=
+=20alpha,=20alphabetic,=20letter=20=20=20alphabetic=20characters=20=
(defined=20by=20Unicode)=0A+=20alnum,=20alphanumeric=20=20=20=20=20=20=20=
=20=20alphabetic=20or=20decimal=20digit=20chars=20(Unicode)=0A+=20digit=20=
numeric,=20num=20=20=20=20=20=20=20=20=20=200-9=0A+=20xdigit,=20=
hex-digit,=20hex=20=20=20=20=20=200-9,=20A-F,=20a-f=0A+=20cntrl,=20=
control=20=20=20=20=20=20=20=20=20=20=20=20=20=20ASCII=20codes=200-31=0A=
+=20blank=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20horizontal=20whitespace=20(Unicode)=0A+=20space,=20whitespace,=20=
white=20=20=20=20chars=20with=20whitespace=20syntax=0A+=20lower,=20=
lower-case=20=20=20=20=20=20=20=20=20=20=20lower-case=20chars,=20from=20=
current=20case=20table=0A+=20upper,=20upper-case=20=20=20=20=20=20=20=20=20=
=20=20upper-case=20chars,=20from=20current=20case=20table=0A+=20graph,=20=
graphic=20=20=20=20=20=20=20=20=20=20=20=20=20=20graphic=20characters=20=
(Unicode)=0A+=20print,=20printing=20=20=20=20=20=20=20=20=20=20=20=20=20=
whitespace=20or=20graphic=20(Unicode)=0A+=20punct,=20punctuation=20=20=20=
=20=20=20=20=20=20=20not=20control,=20space,=20letter=20or=20digit=20=
(ASCII);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20not=20word=20syntax=20(non-ASCII)=0A+=20word,=20=
wordchar=20=20=20=20=20=20=20=20=20=20=20=20=20=20characters=20with=20=
word=20syntax=0A+=20ascii=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20ASCII=20characters=20(codes=200-127)=0A+=20nonascii=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20non-ASCII=20=
characters=20(but=20not=20raw=20bytes)=0A+=0A+(syntax=20SYNTAX)=20=20=
Match=20a=20character=20with=20syntax=20SYNTAX,=20being=20one=20of:=0A+=20=
=20whitespace,=20punctuation,=20word,=20symbol,=20open-parenthesis,=0A+=20=
=20close-parenthesis,=20expression-prefix,=20string-quote,=0A+=20=20=
paired-delimiter,=20escape,=20character-quote,=20comment-start,=0A+=20=20=
comment-end,=20string-delimiter,=20comment-delimiter=0A+=0A+(category=20=
CAT)=20=20=20Match=20a=20character=20in=20category=20CAT,=20being=20one=20=
of:=0A+=20=20space-for-indent,=20base,=20consonant,=20base-vowel,=0A+=20=20=
upper-diacritical-mark,=20lower-diacritical-mark,=20tone-mark,=20symbol,=0A=
+=20=20digit,=20vowel-modifying-diacritical-mark,=20vowel-sign,=0A+=20=20=
semivowel-lower,=20not-at-end-of-line,=20not-at-beginning-of-line,=0A+=20=
=20alpha-numeric-two-byte,=20chinese-two-byte,=20greek-two-byte,=0A+=20=20=
japanese-hiragana-two-byte,=20indian-two-byte,=0A+=20=20=
japanese-katakana-two-byte,=20strong-left-to-right,=0A+=20=20=
korean-hangul-two-byte,=20strong-right-to-left,=20cyrillic-two-byte,=0A+=20=
=20combining-diacritic,=20ascii,=20arabic,=20chinese,=20ethiopic,=20=
greek,=0A+=20=20korean,=20indian,=20japanese,=20japanese-katakana,=20=
latin,=20lao,=0A+=20=20tibetan,=20japanese-roman,=20thai,=20vietnamese,=20=
hebrew,=20cyrillic,=0A+=20=20can-break=0A+=0A+Zero-width=20assertions:=20=
these=20all=20match=20the=20empty=20string=20in=20specific=20places.=0A+=20=
line-start=20=20=20=20=20=20=20=20=20at=20the=20beginning=20of=20a=20=
line.=20=20Alias:=20bol=0A+=20line-end=20=20=20=20=20=20=20=20=20=20=20=
at=20the=20end=20of=20a=20line.=20=20Alias:=20eol=0A+=20string-start=20=20=
=20=20=20=20=20at=20the=20start=20of=20the=20string=20or=20buffer.=0A+=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Alias:=20=
buffer-start,=20bos,=20bot=0A+=20string-end=20=20=20=20=20=20=20=20=20at=20=
the=20end=20of=20the=20string=20or=20buffer.=0A+=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20Alias:=20buffer-end,=20eos,=20eot=0A=
+=20point=20=20=20=20=20=20=20=20=20=20=20=20=20=20at=20point.=0A+=20=
word-start=20=20=20=20=20=20=20=20=20at=20the=20beginning=20of=20a=20=
word.=0A+=20word-end=20=20=20=20=20=20=20=20=20=20=20at=20the=20end=20of=20=
a=20word.=0A+=20word-boundary=20=20=20=20=20=20at=20the=20beginning=20or=20=
end=20of=20a=20word.=0A+=20not-word-boundary=20=20not=20at=20the=20=
beginning=20or=20end=20of=20a=20word.=0A+=20symbol-start=20=20=20=20=20=20=
=20at=20the=20beginning=20of=20a=20symbol.=0A+=20symbol-end=20=20=20=20=20=
=20=20=20=20at=20the=20end=20of=20a=20symbol.=0A+=0A+(group=20RX...)=20=20=
Match=20RXs=20and=20define=20a=20capture=20group.=20=20Alias:=20submatch=0A=
+(group-n=20N=20RX...)=20Match=20RXs=20and=20define=20capture=20group=20=
N.=20=20Alias:=20submatch-n=0A+(backref=20N)=20=20=20=20Match=20the=20=
text=20that=20capture=20group=20N=20matched.=0A+=0A+(literal=20EXPR)=20=
Match=20the=20literal=20string=20from=20evaluating=20the=20EXPR=20at=20=
run=20time.=0A+(regexp=20EXPR)=20=20Match=20the=20string=20regexp=20from=20=
evaluating=20EXPR=20at=20run=20time.=0A+(eval=20EXPR)=20=20=20=20Match=20=
the=20rx=20sexp=20from=20evaluating=20EXPR=20at=20compile=20time."=0A=20=20=
=20(let*=20((rx--compile-to-lisp=20t)=0A=20=20=20=20=20=20=20=20=20=20=
(re=20(cond=20((null=20regexps)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20(error=20"No=20regexp"))=0A--=20=0A2.20.1=20=
(Apple=20Git-117)=0A=0A=

--Apple-Mail=_4EE8477A-8B77-4C86-A6A0-ED3F0D46DD21--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 09:08:25 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 05:08:25 2019
Received: from localhost ([127.0.0.1]:54219 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjggC-0004ch-TU
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 05:08:25 -0400
Received: from eggs.gnu.org ([209.51.188.92]:37803)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1hjgg8-0004cR-79
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 05:08:22 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:52185)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <eliz@HIDDEN>)
 id 1hjgg2-0004Kc-Px; Sat, 06 Jul 2019 05:08:14 -0400
Received: from [176.228.60.248] (port=1390 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1hjgg1-0005hD-TQ; Sat, 06 Jul 2019 05:08:14 -0400
Date: Sat, 06 Jul 2019 12:08:08 +0300
Message-Id: <83r2738r9j.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
In-reply-to: <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN> (message from
 Mattias =?utf-8?Q?Engdeg=C3=A5rd?= on Fri, 5 Jul 2019 16:13:52 +0200)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Mattias Engdegård <mattiase@HIDDEN>
> Date: Fri, 5 Jul 2019 16:13:52 +0200
> Cc: 36496 <at> debbugs.gnu.org
> 
> > This is a large section.  The ELisp reference is already a large book,
> > printed in two separate volumes.  So I think if we want to include
> > this section, it will have to be on a separate file that is
> > conditionally included @ifnottex.
> > 
> > Alternatively, we could make this a separate manual.
> 
> It is about 7-8 pages in all.

It's more that 2500 lines.  We have in doc/misc/ separate manuals much
smaller than this.  So making a separate manual out of this is not
radically different from what we have already.

> One page could be saved by combining the character class descriptions with the existing ones; they are basically the same. However, that would probably preclude separation into separate files or manuals.
> 
> The category names also take up about one page, but that information isn't available anywhere else, since those names are specific to rx. (It would be nice if the names were defined along with the categories, but that isn't the case at present.)

I don't think we should go out of our way to make this text shorter.
it is well written, and doesn't waste words, so any attempt to make it
shorter will IMO make it less useful.

> I would prefer @ifnottex to having a separate manual

Either alternative is fine with me.

> The revised patch (attached) does not separate the contents, because I wanted to hear your opinion on the matter first.

Opinion on which matter? on whether or not make it a separate manual?
If so, you now have my opinion.

> >> +@xref{Syntax Class Table} for details.  Please note that
> >                            ^
> > Comma missing there.
> 
> Ah, yes. Apparently, a comma is inserted automatically in the TeX version, so that we get the desired "See Section XIV, page 123, for details"; this is documented. In the info and html versions there is no page number, so a comma doesn't feel like proper English: "See Section XIV, for details" has a distinct German tone to my ears.
> Explicit comma after @xref seems to be common in the Emacs manuals, so rather than to fight it out I castled the clauses.

The comma is common because older versions of makeinfo insisted on
having it, and would complain if there weren't one.  The latest
versions no longer complain, but we would still like to support the
old versions, as they are ~15 times faster, so some people still keep
them around.

Thanks.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 06:47:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Jul 06 02:47:54 2019
Received: from localhost ([127.0.0.1]:54141 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjeUE-00011S-GV
	for submit <at> debbugs.gnu.org; Sat, 06 Jul 2019 02:47:54 -0400
Received: from eggs.gnu.org ([209.51.188.92]:36232)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1hjeUD-00011E-8J
 for 36496 <at> debbugs.gnu.org; Sat, 06 Jul 2019 02:47:53 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:51032)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <eliz@HIDDEN>)
 id 1hjeU7-00078e-Sf; Sat, 06 Jul 2019 02:47:47 -0400
Received: from [176.228.60.248] (port=4504 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1hjeTv-0002Ni-DP; Sat, 06 Jul 2019 02:47:35 -0400
Date: Sat, 06 Jul 2019 09:47:30 +0300
Message-Id: <83a7draccd.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: rms@HIDDEN
In-reply-to: <E1hjYHa-0005qu-Ox@HIDDEN> (message from Richard
 Stallman on Fri, 05 Jul 2019 20:10:26 -0400)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN> <E1hjYHa-0005qu-Ox@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: mattiase@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Richard Stallman <rms@HIDDEN>
> Cc: mattiase@HIDDEN, 36496 <at> debbugs.gnu.org
> Date: Fri, 05 Jul 2019 20:10:26 -0400
> 
> In the past, various practical factors have made rx somewhat inconvenient,
> and that prevented rx from competing with the regexp syntax.
> Recently we have made some improvements in rx; are they enough to
> make rx a real competitor for regexps?

I cannot answer the question without knowing which practical factors
made rx inconvenient in the past.  Where can one find this
information?




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 00:10:37 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Jul 05 20:10:37 2019
Received: from localhost ([127.0.0.1]:54020 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjYHk-0008Rj-N7
	for submit <at> debbugs.gnu.org; Fri, 05 Jul 2019 20:10:36 -0400
Received: from eggs.gnu.org ([209.51.188.92]:33475)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <rms@HIDDEN>) id 1hjYHi-0008RI-Jy
 for 36496 <at> debbugs.gnu.org; Fri, 05 Jul 2019 20:10:36 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:44298)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <rms@HIDDEN>)
 id 1hjYHd-0000Xs-AT; Fri, 05 Jul 2019 20:10:29 -0400
Received: from rms by fencepost.gnu.org with local (Exim 4.82)
 (envelope-from <rms@HIDDEN>)
 id 1hjYHa-0005qu-Ox; Fri, 05 Jul 2019 20:10:26 -0400
Content-Type: text/plain; charset=Utf-8
From: Richard Stallman <rms@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
In-Reply-To: <838stdbw8e.fsf@HIDDEN> (message from Eli Zaretskii on Thu, 04
 Jul 2019 19:28:01 +0300)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN>
Message-Id: <E1hjYHa-0005qu-Ox@HIDDEN>
Date: Fri, 05 Jul 2019 20:10:26 -0400
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: mattiase@HIDDEN, 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Reply-To: rms@HIDDEN
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

The ideal goal of rx is to make that the way most people write regexps
for Emacs.  That would be an improvement because rx syntax is more
understandable.  If this happens, we will need to have rx syntax in the
Emacs Lisp Manual.

In the past, various practical factors have made rx somewhat inconvenient,
and that prevented rx from competing with the regexp syntax.
Recently we have made some improvements in rx; are they enough to
make rx a real competitor for regexps?


-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)






Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 5 Jul 2019 14:14:07 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Jul 05 10:14:07 2019
Received: from localhost ([127.0.0.1]:53601 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hjOyV-0002d0-8Z
	for submit <at> debbugs.gnu.org; Fri, 05 Jul 2019 10:14:07 -0400
Received: from mail1422c50.megamailservers.eu ([91.136.14.22]:51744
 helo=mail102c50.megamailservers.eu)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <mattiase@HIDDEN>) id 1hjOyQ-0002cI-L2
 for 36496 <at> debbugs.gnu.org; Fri, 05 Jul 2019 10:14:04 -0400
X-Authenticated-User: mattiase@HIDDEN
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu;
 s=maildub; t=1562336035;
 bh=gAT+HO94RGASG9d+XSNOIyvt7oIaHh/mBOjW54pRm5E=;
 h=From:Subject:Date:In-Reply-To:Cc:To:References:From;
 b=sVgM/GWXapxShQ2ZZXMsSNNL8+gTMkIVQd0quTyBa/dPPd6JBXhgG6f8jvP//1Kgd
 puiFU1KRGITJYOFvbxP1lk3lWBfbdqCJ9fXYZHRvRTQn6PoleAcso5Ksh7yrmlC63S
 ullcRmddXqWxkiYEVEoZ3QL5X7z4Wu/H5iU+EKgI=
Feedback-ID: mattiase@HIDDEN
Received: from [192.168.1.64] (c-e636e253.032-75-73746f71.bbcust.telenor.se
 [83.226.54.230]) (authenticated bits=0)
 by mail102c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x65EDrug003193; 
 Fri, 5 Jul 2019 14:13:54 +0000
From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= <mattiase@HIDDEN>
Message-Id: <AF152105-C741-45BD-85C6-1584DDE91800@HIDDEN>
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_D28F5A43-DC10-41C8-9F84-6454D3CF8910"
Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\))
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
Date: Fri, 5 Jul 2019 16:13:52 +0200
In-Reply-To: <838stdbw8e.fsf@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
 <838stdbw8e.fsf@HIDDEN>
X-Mailer: Apple Mail (2.3445.104.11)
X-CTCH-RefID: str=0001.0A0B0212.5D1F5B23.0047, ss=1, re=0.000, recu=0.000,
 reip=0.000, cl=1, cld=1, fgs=0
X-CTCH-VOD: Unknown
X-CTCH-Spam: Unknown
X-CTCH-Score: 0.000
X-CTCH-Rules: 
X-CTCH-Flags: 0
X-CTCH-ScoreCust: 0.000
X-CSC: 0
X-CHA: v=2.3 cv=RfS+9Wlv c=1 sm=1 tr=0 a=M+GU/qJco4WXjv8D6jB2IA==:117
 a=M+GU/qJco4WXjv8D6jB2IA==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19
 a=mDV3o1hIAAAA:8 a=N3lGIljWuHaA1jC4_XoA:9 a=CjuIK1q_8ugA:10
 a=AZtGIUqoNFVW1yBK4W8A:9 a=B2y7HmGcmWMA:10 a=_FVE-zBwftR9WsbkzFJk:22
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: 36496
Cc: 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.0 (/)


--Apple-Mail=_D28F5A43-DC10-41C8-9F84-6454D3CF8910
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

4 juli 2019 kl. 18.28 skrev Eli Zaretskii <eliz@HIDDEN>:
>=20
> This is a large section.  The ELisp reference is already a large book,
> printed in two separate volumes.  So I think if we want to include
> this section, it will have to be on a separate file that is
> conditionally included @ifnottex.
>=20
> Alternatively, we could make this a separate manual.

It is about 7-8 pages in all. One page could be saved by combining the =
character class descriptions with the existing ones; they are basically =
the same. However, that would probably preclude separation into separate =
files or manuals.

The category names also take up about one page, but that information =
isn't available anywhere else, since those names are specific to rx. (It =
would be nice if the names were defined along with the categories, but =
that isn't the case at present.)

I would prefer @ifnottex to having a separate manual, since one of the =
points is to make rx feel like a part of elisp and a genuine, practical =
alternative to regexp strings rather than an add-on. For example, the =
"Complex Regexp Example" turned out to be a good place for an rx =
version.

The revised patch (attached) does not separate the contents, because I =
wanted to hear your opinion on the matter first.

>> The existing `rx' doc string can be left unchanged, or reduced to =
something more concise, perhaps without a description of the entire rx =
language but with a manual reference. Suggestions are welcome.
>=20
> Yes, the doc string should be reduced to the summary of the
> constructs.

Good, let's do that when the changes to the manual are done.

>> +Bind the name @var{ref} to a submatch that matches =
@var{rx-expr}@enddots{}.
>   ^^^^^^^^^^^^^^^^^^^^^^^
> "Bind the symbol @var{ref}", no?

Yes, thank you.

>> +or, using shorter synonyms and written more compactly,
>=20
> This last line needs @noindent before it.

Added, and in another place.

>> +@table @asis
>> +@item @code{"some-string"}
>=20
> Why @code{"..."} and not @samp{...}?  The latter will look better both
> in print and in Info format.

I looked at the result in all formats (pdf, info, html) and came to the =
opposite conclusion; it makes it clear that it's about a string literal. =
It's not a strongly held opinion, however.

>> +Corresponding string regexp: @samp{AB@dots{}} (subexpressions in =
sequence).
>                                ^^^^^^^^^^^^^^^^
> I think this should use @samp{@var{a}@var{b}@dots{}} instead. And
> likewise for the other "corresponding string regexps".  The reason is
> that neither A nor B stand for themselves, literally, they are
> meta-variables.

Right; again I made experiments, and ended up with =
@samp{var{A}@var{B}@dots{}}. The upper-case variables looked much better =
in print and html.

>> +Match the @var{rx}s once or not at all.@*
>=20
> "Match @var{rx} or an empty string" sounds better to me.

Much better, thank you. Changed in all places.

>> +Match the @var{rx}s zero or more times, non-greedily.@*
>=20
> I would add here a cross-reference to where greedy matching is
> described.

Done, with a separate sub subheading for the non-greedy stuff.

>> +@item @code{(any @var{charset}@dots{})}
>=20
> Please don't call this "charset", as that term is already taken by a
> very different creature in Emacs.  I suggest "character set" instead.

Yes, I ended up using "set" since it's shorter and even better in this =
case.

>> +Each @var{charset} is a character, a string representing the set of
>> +its characters, a range or a character class.  A range is either a
>> +hyphen-separated string like @code{"A-Z"}, or a cons of characters
>> +like @code{(?A . ?Z)}.
>=20
> Again, a cross-reference to where "character class" described would be
> good here, as would a @cindex entry for "character class in rx".

Done; the cross-reference is just a "see below" since it's very near.

>> +@item @code{space}, @code{whitespace}, @code{white}
>> +Match any character that has whitespace syntax.
>=20
> Only ASCII or also non-ASCII?  This should be spelled out.

It's a matter of the syntax table; I used the exact formulation of the =
existing char class description.

>> +@xref{Syntax Class Table} for details.  Please note that
>                            ^
> Comma missing there.

Ah, yes. Apparently, a comma is inserted automatically in the TeX =
version, so that we get the desired "See Section XIV, page 123, for =
details"; this is documented. In the info and html versions there is no =
page number, so a comma doesn't feel like proper English: "See Section =
XIV, for details" has a distinct German tone to my ears.
Explicit comma after @xref seems to be common in the Emacs manuals, so =
rather than to fight it out I castled the clauses.


--Apple-Mail=_D28F5A43-DC10-41C8-9F84-6454D3CF8910
Content-Disposition: attachment;
	filename=0001-Describe-the-rx-notation-in-the-elisp-manual-bug-364.patch
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="0001-Describe-the-rx-notation-in-the-elisp-manual-bug-364.patch"
Content-Transfer-Encoding: quoted-printable

=46rom=20fde854686146a1642c958e2871c4b376b1fe09a1=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20=
<mattiase@HIDDEN>=0ADate:=20Thu,=204=20Jul=202019=2013:01:52=20+0200=0A=
Subject:=20[PATCH]=20Describe=20the=20rx=20notation=20in=20the=20elisp=20=
manual=20(bug#36496)=0A=0A*=20doc/lispref/searching.texi=20(Regular=20=
Expressions):=20New=20menu=20entry.=0A(Regexp=20Example):=20Add=20rx=20=
form=20of=20the=20example.=0A(Rx=20Notation,=20Rx=20Constructs,=20Rx=20=
Functions):=20New=20nodes.=0A*=20doc/lispref/control.texi=20(pcase=20=
Macro):=20Describe=20the=20rx=20pattern.=0A---=0A=20=
doc/lispref/control.texi=20=20=20|=20=2023=20++=0A=20=
doc/lispref/searching.texi=20|=20559=20=
+++++++++++++++++++++++++++++++++++++=0A=202=20files=20changed,=20582=20=
insertions(+)=0A=0Adiff=20--git=20a/doc/lispref/control.texi=20=
b/doc/lispref/control.texi=0Aindex=20e308d68b75..625964774d=20100644=0A=
---=20a/doc/lispref/control.texi=0A+++=20b/doc/lispref/control.texi=0A@@=20=
-618,6=20+618,29=20@@=20pcase=20Macro=0A=20to=20@var{body-forms}=20(thus=20=
avoiding=20an=20evaluation=20error=20on=20match),=0A=20if=20any=20of=20=
the=20sub-patterns=20let-binds=20a=20set=20of=20symbols,=0A=20they=20=
@emph{must}=20all=20bind=20the=20same=20set=20of=20symbols.=0A+=0A=
+@anchor{rx=20in=20pcase}=0A+@item=20(rx=20@var{rx-expr}@dots{})=0A=
+Matches=20strings=20against=20the=20regexp=20@var{rx-expr}@dots{},=20=
using=20the=0A+@code{rx}=20regexp=20notation=20(@pxref{Rx=20Notation}),=20=
as=20if=20by=0A+@code{string-match}.=0A+=0A+In=20addition=20to=20the=20=
usual=20@code{rx}=20syntax,=20@var{rx-expr}@dots{}=20can=0A+contain=20=
the=20following=20constructs:=0A+=0A+@table=20@code=0A+@item=20(let=20=
@var{ref}=20@var{rx-expr}@dots{})=0A+Bind=20the=20symbol=20@var{ref}=20=
to=20a=20submatch=20that=20matches=0A+@var{rx-expr}@enddots{}.=20=20=
@var{ref}=20is=20bound=20in=20@var{body-forms}=20to=0A+the=20string=20of=20=
the=20submatch=20or=20nil,=20but=20can=20also=20be=20used=20in=0A=
+@code{backref}.=0A+=0A+@item=20(backref=20@var{ref})=0A+Like=20the=20=
standard=20@code{backref}=20construct,=20but=20@var{ref}=20can=20here=0A=
+also=20be=20a=20name=20introduced=20by=20a=20previous=20@code{(let=20=
@var{ref}=20@dots{})}=0A+construct.=0A+@end=20table=0A+=0A=20@end=20=
table=0A=20=0A=20@anchor{pcase-example-0}=0Adiff=20--git=20=
a/doc/lispref/searching.texi=20b/doc/lispref/searching.texi=0Aindex=20=
ef1cffc446..40a9cb523b=20100644=0A---=20a/doc/lispref/searching.texi=0A=
+++=20b/doc/lispref/searching.texi=0A@@=20-254,6=20+254,7=20@@=20Regular=20=
Expressions=0A=20@menu=0A=20*=20Syntax=20of=20Regexps::=20=20=20=20=20=20=
=20Rules=20for=20writing=20regular=20expressions.=0A=20*=20Regexp=20=
Example::=20=20=20=20=20=20=20=20=20=20Illustrates=20regular=20=
expression=20syntax.=0A+*=20Rx=20Notation::=20=20=20=20=20=20=20=20=20=20=
=20=20=20An=20alternative,=20structured=20regexp=20notation.=0A=20*=20=
Regexp=20Functions::=20=20=20=20=20=20=20=20Functions=20for=20operating=20=
on=20regular=20expressions.=0A=20@end=20menu=0A=20=0A@@=20-359,6=20=
+360,7=20@@=20Regexp=20Special=0A=20preceding=20expression=20either=20=
once=20or=20not=20at=20all.=20=20For=20example,=0A=20@samp{ca?r}=20=
matches=20@samp{car}=20or=20@samp{cr};=20nothing=20else.=0A=20=0A=
+@anchor{Non-greedy=20repetition}=0A=20@item=20@samp{*?},=20@samp{+?},=20=
@samp{??}=0A=20@cindex=20non-greedy=20repetition=20characters=20in=20=
regexp=0A=20These=20are=20@dfn{non-greedy}=20variants=20of=20the=20=
operators=20@samp{*},=20@samp{+}=0A@@=20-951,6=20+953,563=20@@=20Regexp=20=
Example=0A=20beyond=20the=20minimum=20needed=20to=20end=20a=20sentence.=0A=
=20@end=20table=0A=20=0A+In=20the=20@code{rx}=20notation=20(@pxref{Rx=20=
Notation}),=20the=20regexp=20could=20be=20written=0A+=0A+@example=0A=
+@group=0A+(rx=20(any=20".?!")=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20;=20Punctuation=20ending=20sentence.=0A+=20=20=20=20=
(zero-or-more=20(any=20"\"')]@}"))=20=20;=20Closing=20quotes=20or=20=
brackets.=0A+=20=20=20=20(or=20line-end=0A+=20=20=20=20=20=20=20=20(seq=20=
"=20"=20line-end)=0A+=20=20=20=20=20=20=20=20"\t"=0A+=20=20=20=20=20=20=20=
=20"=20=20")=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20;=20Two=20spaces.=0A+=20=20=20=20(zero-or-more=20(any=20"\t\n=20")))=20=
=20;=20Optional=20extra=20whitespace.=0A+@end=20group=0A+@end=20example=0A=
+=0A+Since=20@code{rx}=20regexps=20are=20just=20S-expressions,=20they=20=
can=20be=20formatted=0A+and=20commented=20as=20such.=0A+=0A+@node=20Rx=20=
Notation=0A+@subsection=20The=20@code{rx}=20Structured=20Regexp=20=
Notation=0A+@cindex=20rx=0A+@cindex=20regexp=20syntax=0A+=0A+=20=20As=20=
an=20alternative=20to=20the=20string-based=20syntax,=20Emacs=20provides=20=
the=0A+structured=20@code{rx}=20notation=20based=20on=20Lisp=20=
S-expressions.=20=20This=0A+notation=20is=20usually=20easier=20to=20=
read,=20write=20and=20maintain=20than=20regexp=0A+strings,=20and=20can=20=
be=20indented=20and=20commented=20freely.=20=20It=20requires=20a=0A=
+conversion=20into=20string=20form=20since=20that=20is=20what=20regexp=20=
functions=0A+expect,=20but=20that=20conversion=20typically=20takes=20=
place=20during=0A+byte-compilation=20rather=20than=20when=20the=20Lisp=20=
code=20using=20the=20regexp=20is=0A+run.=0A+=0A+=20=20Here=20is=20an=20=
@code{rx}=20regexp@footnote{It=20could=20be=20written=20much=0A+simpler=20=
with=20non-greedy=20operators=20(how?),=20but=20that=20would=20make=20=
the=0A+example=20less=20interesting.}=20that=20matches=20a=20block=20=
comment=20in=20the=20C=0A+programming=20language:=0A+=0A+@example=0A=
+@group=0A+(rx=20"/*"=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20;=20Initial=20/*=0A+=20=20=20=20(zero-or-more=0A=
+=20=20=20=20=20(or=20(not=20(any=20"*"))=20=20=20=20=20=20=20=20=20=20;=20=
=20Either=20non-*,=0A+=20=20=20=20=20=20=20=20=20(seq=20"*"=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20;=20=20or=20*=20followed=20by=0A+=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20(not=20(any=20"/")))))=20=20;=20=20=
non-/=0A+=20=20=20=20(one-or-more=20"*")=20=20=20=20=20=20=20=20=20=20=20=
=20=20;=20At=20least=20one=20star,=0A+=20=20=20=20"/")=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=20and=20the=20=
final=20/=0A+@end=20group=0A+@end=20example=0A+=0A+@noindent=0A+or,=20=
using=20shorter=20synonyms=20and=20written=20more=20compactly,=0A+=0A=
+@example=0A+@group=0A+(rx=20"/*"=0A+=20=20=20=20(*=20(|=20(not=20(any=20=
"*"))=0A+=20=20=20=20=20=20=20=20=20=20(:=20"*"=20(not=20(any=20"/")))))=0A=
+=20=20=20=20(+=20"*")=20"/")=0A+@end=20group=0A+@end=20example=0A+=0A=
+@noindent=0A+In=20conventional=20string=20syntax,=20it=20would=20be=20=
written=0A+=0A+@example=0A+"/\\*\\(?:[^*]\\|\\*[^/]\\)*\\*+/"=0A+@end=20=
example=0A+=0A+The=20@code{rx}=20notation=20is=20mainly=20useful=20in=20=
Lisp=20code;=20it=20cannot=20be=0A+used=20in=20most=20interactive=20=
situations=20where=20a=20regexp=20is=20requested,=20such=0A+as=20when=20=
running=20@code{query-replace-regexp}=20or=20in=20variable=0A=
+customisation.=0A+=0A+@menu=0A+*=20Rx=20Constructs::=20=20=20=20=20=20=20=
Constructs=20valid=20in=20rx=20forms.=0A+*=20Rx=20Functions::=20=20=20=20=
=20=20=20=20Functions=20and=20macros=20that=20use=20rx=20forms.=0A+@end=20=
menu=0A+=0A+@node=20Rx=20Constructs=0A+@subsubsection=20Constructs=20in=20=
@code{rx}=20regexps=0A+=0A+The=20various=20forms=20in=20@code{rx}=20=
regexps=20are=20described=20below.=20=20The=0A+shorthand=20@var{rx}=20=
represents=20any=20@code{rx}=20form,=20and=20@var{rx}@dots{}=0A+means=20=
one=20or=20more=20@code{rx}=20forms.=20=20Where=20the=20corresponding=20=
string=0A+regexp=20syntax=20is=20given,=20@var{A},=20@var{B},=20@dots{}=20=
are=20string=20regexp=0A+subexpressions.=0A+@c=20With=20the=20new=20=
implementation=20of=20rx,=20this=20can=20be=20changed=20from=0A+@c=20=
'one=20or=20more'=20to=20'zero=20or=20more'.=0A+=0A+@subsubheading=20=
Literals=0A+=0A+@table=20@asis=0A+@item=20@code{"some-string"}=0A+Match=20=
the=20string=20@samp{some-string}=20literally.=20=20There=20are=20no=0A=
+characters=20with=20special=20meaning,=20unlike=20in=20string=20=
regexps.=0A+=0A+@item=20@code{?C}=0A+Match=20the=20character=20@samp{C}=20=
literally.=0A+@end=20table=0A+=0A+@subsubheading=20Fundamental=20=
structure=0A+=0A+@table=20@asis=0A+@item=20@code{(seq=20=
@var{rx}@dots{})}=0A+@cindex=20@code{seq}=20in=20rx=0A+@itemx=20=
@code{(sequence=20@var{rx}@dots{})}=0A+@cindex=20@code{sequence}=20in=20=
rx=0A+@itemx=20@code{(:=20@var{rx}@dots{})}=0A+@cindex=20@code{:}=20in=20=
rx=0A+@itemx=20@code{(and=20@var{rx}@dots{})}=0A+@cindex=20@code{and}=20=
in=20rx=0A+Match=20the=20@var{rx}s=20in=20sequence.=20=20Without=20=
arguments,=20the=20expression=0A+matches=20the=20empty=20string.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}@var{B}@dots{}}=0A=
+(subexpressions=20in=20sequence).=0A+=0A+@item=20@code{(or=20=
@var{rx}@dots{})}=0A+@cindex=20@code{or}=20in=20rx=0A+@itemx=20@code{(|=20=
@var{rx}@dots{})}=0A+@cindex=20@code{|}=20in=20rx=0A+Match=20exactly=20=
one=20of=20the=20@var{rx}s,=20trying=20from=20left=20to=20right.=0A=
+Without=20arguments,=20the=20expression=20will=20not=20match=20anything=20=
at=20all.@*=0A+Corresponding=20string=20regexp:=20=
@samp{@var{A}\|@var{B}\|@dots{}}.=0A+@end=20table=0A+=0A+@subsubheading=20=
Repetition=0A+=0A+@table=20@code=0A+@item=20(zero-or-more=20=
@var{rx}@dots{})=0A+@cindex=20@code{zero-or-more}=20in=20rx=0A+@itemx=20=
(0+=20@var{rx}@dots{})=0A+@cindex=20@code{0+}=20in=20rx=0A+@itemx=20(*=20=
@var{rx}@dots{})=0A+@cindex=20@code{*}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20zero=20or=20more=20times.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}*}=0A+=0A+@item=20(one-or-more=20@var{rx}@dots{})=0A=
+@cindex=20@code{one-or-more}=20in=20rx=0A+@itemx=20(1+=20=
@var{rx}@dots{})=0A+@cindex=20@code{1+}=20in=20rx=0A+@itemx=20(+=20=
@var{rx}@dots{})=0A+@cindex=20@code{+}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20one=20or=20more=20times.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}+}=0A+=0A+@item=20(zero-or-one=20@var{rx}@dots{})=0A=
+@cindex=20@code{zero-or-one}=20in=20rx=0A+@itemx=20(optional=20=
@var{rx}@dots{})=0A+@cindex=20@code{optional}=20in=20rx=0A+@itemx=20(opt=20=
@var{rx}@dots{})=0A+@cindex=20@code{opt}=20in=20rx=0A+@itemx=20(?=20=
@var{rx}@dots{})=0A+@cindex=20@code{?}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20once=20or=20an=20empty=20string.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}?}=0A+=0A+@item=20(=3D=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@code{=3D}=20in=20rx=0A+@itemx=20(repeat=20=
@var{n}=20@var{rx})=0A+Match=20the=20@var{rx}s=20exactly=20@var{n}=20=
times.@*=0A+Corresponding=20string=20regexp:=20=
@samp{@var{A}\@{@var{n}\@}}=0A+=0A+@item=20(>=3D=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@code{>=3D}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20@var{n}=20or=20more=20times.@*=0A+Corresponding=20string=20=
regexp:=20@samp{@var{A}\@{@var{n},\@}}=0A+=0A+@item=20(**=20@var{n}=20=
@var{m}=20@var{rx}@dots{})=0A+@cindex=20@code{**}=20in=20rx=0A+@itemx=20=
(repeat=20@var{n}=20@var{m}=20@var{rx}@dots{})=0A+@cindex=20=
@code{repeat}=20in=20rx=0A+Match=20the=20@var{rx}s=20at=20least=20=
@var{n}=20but=20no=20more=20than=20@var{m}=20times.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}\@{@var{n},@var{m}\@}}=0A+@end=20table=0A=
+=0A+@subsubheading=20Non-greedy=20repetition=0A+=0A+Normally,=20=
repetition=20forms=20are=20greedy,=20in=20that=20they=20attempt=20to=20=
match=0A+as=20many=20times=20as=20possible.=20=20The=20following=20three=20=
forms=20are=20non-greedy;=20they=0A+try=20to=20match=20as=20few=20times=20=
as=20possible=20(@pxref{Non-greedy=20repetition}).=0A+=0A+@table=20@code=0A=
+@item=20(*?=20@var{rx}@dots{})=0A+@cindex=20@code{*?}=20in=20rx=0A=
+Match=20the=20@var{rx}s=20zero=20or=20more=20times,=20non-greedily.@*=0A=
+Corresponding=20string=20regexp:=20@samp{@var{A}*?}=0A+=0A+@item=20(+?=20=
@var{rx}@dots{})=0A+@cindex=20@code{+?}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20one=20or=20more=20times,=20non-greedily.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}+?}=0A+=0A+@item=20(??=20=
@var{rx}@dots{})=0A+@cindex=20@code{??}=20in=20rx=0A+Match=20the=20=
@var{rx}s=20or=20an=20empty=20string,=20non-greedily.@*=0A+Corresponding=20=
string=20regexp:=20@samp{@var{A}??}=0A+@end=20table=0A+=0A+The=20=
greediness=20of=20some=20repetition=20forms=20can=20be=20controlled=20=
using=20the=0A+following=20constructs.=20=20However,=20it=20is=20usually=20=
better=20to=20use=20the=0A+explicit=20non-greedy=20forms=20above=20=
instead.=0A+=0A+@table=20@code=0A+@item=20(minimal-match=20@var{rx})=0A=
+@cindex=20@code{minimal-match}=20in=20rx=0A+Match=20@var{rx},=20with=20=
@code{zero-or-more},=20@code{0+},=0A+@code{one-or-more},=20@code{1+},=20=
@code{zero-or-one},=20@code{opt}=20and=0A+@code{option}=20using=20=
non-greedy=20matching.=0A+=0A+@item=20(maximal-match=20@var{rx})=0A=
+@cindex=20@code{maximal-match}=20in=20rx=0A+Match=20@var{rx},=20with=20=
@code{zero-or-more},=20@code{0+},=0A+@code{one-or-more},=20@code{1+},=20=
@code{zero-or-one},=20@code{opt}=20and=0A+@code{option}=20using=20=
non-greedy=20matching.=20=20This=20is=20the=20default.=0A+@end=20table=0A=
+=0A+@subsubheading=20Matching=20single=20characters=0A+=0A+@table=20=
@asis=0A+@item=20@code{(any=20@var{set}@dots{})}=0A+@cindex=20@code{any}=20=
in=20rx=0A+@itemx=20@code{(char=20@var{set}@dots{})}=0A+@cindex=20=
@code{char}=20in=20rx=0A+@itemx=20@code{(in=20@var{set}@dots{})}=0A=
+@cindex=20@code{in}=20in=20rx=0A+@cindex=20character=20class=20in=20rx=0A=
+Match=20a=20single=20character=20from=20one=20of=20the=20@var{set}s.=20=20=
Each=20@var{set}=0A+is=20a=20character,=20a=20string=20representing=20=
the=20set=20of=20its=20characters,=20a=0A+range=20or=20a=20character=20=
class=20(see=20below).=20=20A=20range=20is=20either=20a=0A=
+hyphen-separated=20string=20like=20@code{"A-Z"},=20or=20a=20cons=20of=20=
characters=0A+like=20@code{(?A=20.=20?Z)}.=0A+=0A+Note=20that=20hyphen=20=
(@code{-})=20is=20special=20in=20strings=20in=20this=20construct,=0A=
+since=20it=20acts=20as=20a=20range=20separator.=20=20To=20include=20a=20=
hyphen,=20add=20it=20as=20a=0A+separate=20character=20or=20=
single-character=20string.@*=0A+Corresponding=20string=20regexp:=20=
@samp{[@dots{}]}=0A+=0A+@item=20@code{(not=20@var{charspec})}=0A+@cindex=20=
@code{not}=20in=20rx=0A+Match=20a=20character=20not=20included=20in=20=
@var{charspec}.=20=20@var{charspec}=20can=0A+be=20an=20@code{any},=20=
@code{syntax}=20or=20@code{category}=20form,=20or=20a=0A+character=20=
class.@*=0A+Corresponding=20string=20regexp:=20@samp{[^@dots{}]},=20=
@samp{\S@var{code}},=0A+@samp{\C@var{code}}=0A+=0A+@item=20=
@code{not-newline},=20@code{nonl}=0A+@cindex=20@code{not-newline}=20in=20=
rx=0A+@cindex=20@code{nonl}=20in=20rx=0A+Match=20any=20character=20=
except=20a=20newline.@*=0A+Corresponding=20string=20regexp:=20@samp{.}=20=
(dot)=0A+=0A+@item=20@code{anything}=0A+@cindex=20@code{anything}=20in=20=
rx=0A+Match=20any=20character.@*=0A+Corresponding=20string=20regexp:=20=
@samp{.\|\n}=20(for=20example)=0A+=0A+@item=20character=20class=0A=
+@cindex=20character=20class=20in=20rx=0A+Match=20a=20character=20from=20=
a=20named=20character=20class:=0A+=0A+@table=20@asis=0A+@item=20=
@code{alpha},=20@code{alphabetic},=20@code{letter}=0A+Match=20alphabetic=20=
characters.=20=20More=20precisely,=20match=20characters=20whose=0A=
+Unicode=20@samp{general-category}=20property=20indicates=20that=20they=20=
are=0A+alphabetic.=0A+=0A+@item=20@code{alnum},=20@code{alphanumeric}=0A=
+Match=20alphabetic=20characters=20and=20digits.=20=20More=20precisely,=20=
match=0A+characters=20whose=20Unicode=20@samp{general-category}=20=
property=20indicates=0A+that=20they=20are=20alphabetic=20or=20decimal=20=
digits.=0A+=0A+@item=20@code{digit},=20@code{numeric},=20@code{num}=0A=
+Match=20the=20digits=20@samp{0}--@samp{9}.=0A+=0A+@item=20=
@code{xdigit},=20@code{hex-digit},=20@code{hex}=0A+Match=20the=20=
hexadecimal=20digits=20@samp{0}--@samp{9},=20@samp{A}--@samp{F}=0A+and=20=
@samp{a}--@samp{f}.=0A+=0A+@item=20@code{cntrl},=20@code{control}=0A=
+Match=20any=20character=20whose=20code=20is=20in=20the=20range=200--31.=0A=
+=0A+@item=20@code{blank}=0A+Match=20horizontal=20whitespace.=20=20More=20=
precisely,=20match=20characters=20whose=0A+Unicode=20=
@samp{general-category}=20property=20indicates=20that=20they=20are=0A=
+spacing=20separators.=0A+=0A+@item=20@code{space},=20@code{whitespace},=20=
@code{white}=0A+Match=20any=20character=20that=20has=20whitespace=20=
syntax=0A+(@pxref{Syntax=20Class=20Table}).=0A+=0A+@item=20@code{lower},=20=
@code{lower-case}=0A+Match=20anything=20lower-case,=20as=20determined=20=
by=20the=20current=20case=20table.=0A+If=20@code{case-fold-search}=20is=20=
non-nil,=20this=20also=20matches=20any=0A+upper-case=20letter.=0A+=0A=
+@item=20@code{upper},=20@code{upper-case}=0A+Match=20anything=20=
upper-case,=20as=20determined=20by=20the=20current=20case=20table.=0A+If=20=
@code{case-fold-search}=20is=20non-nil,=20this=20also=20matches=20any=0A=
+lower-case=20letter.=0A+=0A+@item=20@code{graph},=20@code{graphic}=0A=
+Match=20any=20character=20except=20whitespace,=20@acronym{ASCII}=20and=0A=
+non-@acronym{ASCII}=20control=20characters,=20surrogates,=20and=20=
codepoints=0A+unassigned=20by=20Unicode,=20as=20indicated=20by=20the=20=
Unicode=0A+@samp{general-category}=20property.=0A+=0A+@item=20=
@code{print},=20@code{printing}=0A+Match=20whitespace=20or=20a=20=
character=20matched=20by=20@code{graph}.=0A+=0A+@item=20@code{punct},=20=
@code{punctuation}=0A+Match=20any=20punctuation=20character.=20=20(At=20=
present,=20for=20multibyte=0A+characters,=20anything=20that=20has=20=
non-word=20syntax.)=0A+=0A+@item=20@code{word},=20@code{wordchar}=0A=
+Match=20any=20character=20that=20has=20word=20syntax=20(@pxref{Syntax=20=
Class=20Table}).=0A+=0A+@item=20@code{ascii}=0A+Match=20any=20=
@acronym{ASCII}=20character=20(codes=200--127).=0A+=0A+@item=20=
@code{nonascii}=0A+Match=20any=20non-@acronym{ASCII}=20character=20(but=20=
not=20raw=20bytes).=0A+@end=20table=0A+=0A+Corresponding=20string=20=
regexp:=20@samp{[[:@var{class}:]]}=0A+=0A+@item=20@code{(syntax=20=
@var{syntax})}=0A+@cindex=20@code{syntax}=20in=20rx=0A+Match=20a=20=
character=20with=20syntax=20@var{syntax},=20being=20one=20of=20the=20=
following=0A+names:=0A+=0A+@multitable=20{@code{close-parenthesis}}=20=
{Syntax=20character}=0A+@headitem=20Syntax=20name=20=20=20=20=20=20=20=20=
=20=20@tab=20Syntax=20character=0A+@item=20@code{whitespace}=20=20=20=20=20=
=20=20=20@tab=20@code{-}=0A+@item=20@code{punctuation}=20=20=20=20=20=20=20=
@tab=20@code{.}=0A+@item=20@code{word}=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20@tab=20@code{w}=0A+@item=20@code{symbol}=20=20=20=20=20=20=20=20=20=
=20=20=20@tab=20@code{_}=0A+@item=20@code{open-parenthesis}=20=20@tab=20=
@code{(}=0A+@item=20@code{close-parenthesis}=20@tab=20@code{)}=0A+@item=20=
@code{expression-prefix}=20@tab=20@code{'}=0A+@item=20=
@code{string-quote}=20=20=20=20=20=20@tab=20@code{"}=0A+@item=20=
@code{paired-delimiter}=20=20@tab=20@code{$}=0A+@item=20@code{escape}=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{\}=0A+@item=20=
@code{character-quote}=20=20=20@tab=20@code{/}=0A+@item=20=
@code{comment-start}=20=20=20=20=20@tab=20@code{<}=0A+@item=20=
@code{comment-end}=20=20=20=20=20=20=20@tab=20@code{>}=0A+@item=20=
@code{string-delimiter}=20=20@tab=20@code{|}=0A+@item=20=
@code{comment-delimiter}=20@tab=20@code{!}=0A+@end=20multitable=0A+=0A=
+For=20details,=20@pxref{Syntax=20Class=20Table}.=20=20Please=20note=20=
that=0A+@code{(syntax=20punctuation)}=20is=20@emph{not}=20equivalent=20=
to=20the=20character=20class=0A+@code{punctuation}.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\s@var{code}}=0A+=0A+@item=20@code=20{(category=20=
@var{category})}=0A+@cindex=20@code{category}=20in=20rx=0A+Match=20a=20=
character=20in=20category=20@var{category},=20which=20is=20either=20one=20=
of=0A+the=20names=20below=20or=20its=20category=20character.=0A+=0A=
+@multitable=20{@code{vowel-modifying-diacritical-mark}}=20{Category=20=
character}=0A+@headitem=20Category=20name=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20@tab=20Category=20character=0A+@item=20=
@code{space-for-indent}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20space=0A+@item=20@code{base}=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{.}=0A+@item=20=
@code{consonant}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{0}=0A+@item=20@code{base-vowel}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{1}=0A=
+@item=20@code{upper-diacritical-mark}=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{2}=0A+@item=20@code{lower-diacritical-mark}=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{3}=0A+@item=20@code{tone-mark}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{4}=0A=
+@item=20@code{symbol}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{5}=0A+@item=20@code{digit}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{6}=0A+@item=20@code{vowel-modifying-diacritical-mark}=20=
@tab=20@code{7}=0A+@item=20@code{vowel-sign}=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{8}=0A+@item=20=
@code{semivowel-lower}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{9}=0A+@item=20@code{not-at-end-of-line}=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20@tab=20@code{<}=0A+@item=20=
@code{not-at-beginning-of-line}=20=20=20=20=20=20=20=20=20@tab=20=
@code{>}=0A+@item=20@code{alpha-numeric-two-byte}=20=20=20=20=20=20=20=20=
=20=20=20@tab=20@code{A}=0A+@item=20@code{chinese-two-byte}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{C}=0A+@item=20=
@code{greek-two-byte}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{G}=0A+@item=20@code{japanese-hiragana-two-byte}=20=20=20=20=
=20=20=20@tab=20@code{H}=0A+@item=20@code{indian-two-byte}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{I}=0A+@item=20=
@code{japanese-katakana-two-byte}=20=20=20=20=20=20=20@tab=20@code{K}=0A=
+@item=20@code{strong-left-to-right}=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{L}=0A+@item=20@code{korean-hangul-two-byte}=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{N}=0A+@item=20@code{strong-right-to-left}=20=20=
=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{R}=0A+@item=20=
@code{cyrillic-two-byte}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{Y}=0A+@item=20@code{combining-diacritic}=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{^}=0A+@item=20@code{ascii}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{a}=0A+@item=20@code{arabic}=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{b}=0A+@item=20=
@code{chinese}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20@tab=20@code{c}=0A+@item=20@code{ethiopic}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20=
@code{e}=0A+@item=20@code{greek}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{g}=0A+@item=20=
@code{korean}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{h}=0A+@item=20@code{indian}=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{i}=0A+@item=20@code{japanese}=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{j}=0A+@item=20=
@code{japanese-katakana}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{k}=0A+@item=20@code{latin}=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{l}=0A+@item=20=
@code{lao}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20@tab=20@code{o}=0A+@item=20@code{tibetan}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{q}=0A+@item=20@code{japanese-roman}=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{r}=0A+@item=20@code{thai}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20@tab=20@code{t}=0A+@item=20@code{vietnamese}=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{v}=0A+@item=20=
@code{hebrew}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{w}=0A+@item=20@code{cyrillic}=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20=
@code{y}=0A+@item=20@code{can-break}=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{|}=0A+@end=20multitable=0A=
+=0A+For=20more=20information=20about=20currently=20defined=20=
categories,=20run=20the=0A+command=20@kbd{M-x=20describe-categories=20=
@key{RET}}.=20=20For=20how=20to=20define=0A+new=20categories,=20=
@pxref{Categories}.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\c@var{code}}=0A+@end=20table=0A+=0A+@subsubheading=20Zero-width=20=
assertions=0A+=0A+These=20all=20match=20the=20empty=20string,=20but=20=
only=20in=20specific=20places.=0A+=0A+@table=20@asis=0A+@item=20=
@code{line-start},=20@code{bol}=0A+@cindex=20@code{line-start}=20in=20rx=0A=
+@cindex=20@code{bol}=20in=20rx=0A+Match=20at=20the=20beginning=20of=20a=20=
line.@*=0A+Corresponding=20string=20regexp:=20@samp{^}=0A+=0A+@item=20=
@code{line-end},=20@code{eol}=0A+@cindex=20@code{line-end}=20in=20rx=0A=
+@cindex=20@code{eol}=20in=20rx=0A+Match=20at=20the=20end=20of=20a=20=
line.@*=0A+Corresponding=20string=20regexp:=20@samp{$}=0A+=0A+@item=20=
@code{string-start},=20@code{bos},=20@code{buffer-start},=20@code{bot}=0A=
+@cindex=20@code{string-start}=20in=20rx=0A+@cindex=20@code{bos}=20in=20=
rx=0A+@cindex=20@code{buffer-start}=20in=20rx=0A+@cindex=20@code{bot}=20=
in=20rx=0A+Match=20at=20the=20start=20of=20the=20string=20or=20buffer=20=
being=20matched=20against.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\`}=0A+=0A+@item=20@code{string-end},=20@code{eos},=20=
@code{buffer-end},=20@code{eot}=0A+@cindex=20@code{string-end}=20in=20rx=0A=
+@cindex=20@code{eos}=20in=20rx=0A+@cindex=20@code{buffer-end}=20in=20rx=0A=
+@cindex=20@code{eot}=20in=20rx=0A+Match=20at=20the=20end=20of=20the=20=
string=20or=20buffer=20being=20matched=20against.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\'}=0A+=0A+@item=20@code{point}=0A+@cindex=20=
@code{point}=20in=20rx=0A+Match=20at=20point.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\=3D}=0A+=0A+@item=20@code{word-start}=0A=
+@cindex=20@code{word-start}=20in=20rx=0A+Match=20at=20the=20beginning=20=
of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20@samp{\<}=0A+=0A=
+@item=20@code{word-end}=0A+@cindex=20@code{word-end}=20in=20rx=0A+Match=20=
at=20the=20end=20of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\>}=0A+=0A+@item=20@code{word-boundary}=0A+@cindex=20=
@code{word-boundary}=20in=20rx=0A+Match=20at=20the=20beginning=20or=20=
end=20of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20@samp{\b}=0A=
+=0A+@item=20@code{not-word-boundary}=0A+@cindex=20=
@code{not-word-boundary}=20in=20rx=0A+Match=20anywhere=20but=20at=20the=20=
beginning=20or=20end=20of=20a=20word.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\B}=0A+=0A+@item=20@code{symbol-start}=0A+@cindex=20=
@code{symbol-start}=20in=20rx=0A+Match=20at=20the=20beginning=20of=20a=20=
symbol.@*=0A+Corresponding=20string=20regexp:=20@samp{\_<}=0A+=0A+@item=20=
@code{symbol-end}=0A+@cindex=20@code{symbol-end}=20in=20rx=0A+Match=20at=20=
the=20end=20of=20a=20symbol.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\_>}=0A+@end=20table=0A+=0A+@subsubheading=20Capture=20groups=0A+=0A=
+@table=20@code=0A+@item=20(group=20@var{rx}@dots{})=0A+@cindex=20=
@code{group}=20in=20rx=0A+@itemx=20(submatch=20@var{rx}@dots{})=0A=
+@cindex=20@code{submatch}=20in=20rx=0A+Match=20the=20@var{rx}s,=20=
making=20the=20matched=20text=20and=20position=20accessible=0A+in=20the=20=
match=20data.=20=20The=20first=20group=20in=20a=20regexp=20is=20numbered=20=
1;=0A+subsequent=20groups=20will=20be=20numbered=20one=20higher=20than=20=
the=20previous=0A+group.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\(@dots{}\)}=0A+=0A+@item=20(group-n=20@var{n}=20@var{rx}@dots{})=0A=
+@cindex=20@code{group-n}=20in=20rx=0A+@itemx=20(submatch-n=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@code{submatch-n}=20in=20rx=0A+Like=20=
@code{group},=20but=20explicitly=20assign=20the=20group=20number=20=
@var{n}.=0A+@var{n}=20must=20be=20positive.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\(?@var{n}:@dots{}\)}=0A+=0A+@item=20(backref=20@var{n})=0A=
+@cindex=20@code{backref}=20in=20rx=0A+Match=20the=20text=20previously=20=
matched=20by=20group=20number=20@var{n}.=0A+@var{n}=20must=20be=20in=20=
the=20range=201--9.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\@var{n}}=0A+@end=20table=0A+=0A+@subsubheading=20Dynamic=20=
inclusion=0A+=0A+@table=20@code=0A+@item=20(literal=20@var{expr})=0A=
+@cindex=20@code{literal}=20in=20rx=0A+Match=20the=20literal=20string=20=
that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A+expression=20=
@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20call=20time,=20=
in=0A+the=20current=20lexical=20environment.=0A+=0A+@item=20(regexp=20=
@var{expr})=0A+@cindex=20@code{regexp}=20in=20rx=0A+@itemx=20(regex=20=
@var{expr})=0A+@cindex=20@code{regex}=20in=20rx=0A+Match=20the=20string=20=
regexp=20that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A=
+expression=20@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20=
call=20time,=20in=0A+the=20current=20lexical=20environment.=0A+=0A+@item=20=
(eval=20@var{expr})=0A+@cindex=20@code{eval}=20in=20rx=0A+Match=20the=20=
rx=20form=20that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A=
+expression=20@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20=
macro-expansion=0A+time=20for=20@code{rx},=20at=20call=20time=20for=20=
@code{rx-to-string},=0A+in=20the=20current=20global=20environment.=0A=
+@end=20table=0A+=0A+@node=20Rx=20Functions=0A+@subsubsection=20=
Functions=20and=20macros=20using=20@code{rx}=20regexps=0A+=0A+@defmac=20=
rx=20rx-expr@dots{}=0A+Translate=20the=20@var{rx-expr}s=20to=20a=20=
string=20regexp,=20as=20if=20they=20were=20the=0A+body=20of=20a=20=
@code{(seq=20@dots{})}=20form.=20=20The=20@code{rx}=20macro=20expands=20=
to=20a=0A+string=20constant,=20or,=20if=20@code{literal}=20or=20=
@code{regexp}=20forms=20are=0A+used,=20a=20Lisp=20expression=20that=20=
evaluates=20to=20a=20string.=0A+@end=20defmac=0A+=0A+@defun=20=
rx-to-string=20rx-expr=20&optional=20no-group=0A+Translate=20=
@var{rx-expr}=20to=20a=20string=20regexp=20which=20is=20returned.=0A+If=20=
@var{no-group}=20is=20absent=20or=20nil,=20bracket=20the=20result=20in=20=
a=0A+non-capturing=20group,=20@samp{\(?:@dots{}\)},=20if=20necessary=20=
to=20ensure=20that=0A+a=20postfix=20operator=20appended=20to=20it=20will=20=
apply=20to=20the=20whole=20expression.=0A+=0A+Arguments=20to=20=
@code{literal}=20and=20@code{regexp}=20forms=20in=20@var{rx-expr}=0A=
+must=20be=20string=20literals.=0A+@end=20defun=0A+=0A+The=20=
@code{pcase}=20macro=20can=20use=20@code{rx}=20expressions=20as=20=
patterns=0A+directly;=20@pxref{rx=20in=20pcase}.=0A+=0A=20@node=20Regexp=20=
Functions=0A=20@subsection=20Regular=20Expression=20Functions=0A=20=0A--=20=
=0A2.20.1=20(Apple=20Git-117)=0A=0A=

--Apple-Mail=_D28F5A43-DC10-41C8-9F84-6454D3CF8910--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 4 Jul 2019 16:28:19 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Jul 04 12:28:19 2019
Received: from localhost ([127.0.0.1]:51809 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hj4ao-0006UN-RW
	for submit <at> debbugs.gnu.org; Thu, 04 Jul 2019 12:28:19 -0400
Received: from eggs.gnu.org ([209.51.188.92]:34812)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1hj4an-0006U9-GV
 for 36496 <at> debbugs.gnu.org; Thu, 04 Jul 2019 12:28:17 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:60506)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <eliz@HIDDEN>)
 id 1hj4ai-0008CR-7k; Thu, 04 Jul 2019 12:28:12 -0400
Received: from [176.228.60.248] (port=2465 helo=home-c4e4a596f7)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <eliz@HIDDEN>)
 id 1hj4ah-00067g-0z; Thu, 04 Jul 2019 12:28:11 -0400
Date: Thu, 04 Jul 2019 19:28:01 +0300
Message-Id: <838stdbw8e.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= <mattiase@HIDDEN>
In-reply-to: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN> (message from
 Mattias =?utf-8?Q?Engdeg=C3=A5rd?= on Thu, 4 Jul 2019 14:13:26 +0200)
Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
Cc: 36496 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Mattias Engdegård <mattiase@HIDDEN>
> Date: Thu, 4 Jul 2019 14:13:26 +0200
> 
> The rx notation is useful and complex enough to merit inclusion in the manual.
> 
> Right now, it's mainly described in the `rx' doc string, which is fairly well-written but quite long and a bit unstructured. Describing it in the manual permits a different pace and style of exposition, the inclusion of examples and related information, structured into separate sections with cross-references.
> 
> Proposed patch attached. It covers all rx features, functions, macros, including the pcase pattern, and a mention of the corresponding string regexp constructs.

This is a large section.  The ELisp reference is already a large book,
printed in two separate volumes.  So I think if we want to include
this section, it will have to be on a separate file that is
conditionally included @ifnottex.

Alternatively, we could make this a separate manual.

> The existing `rx' doc string can be left unchanged, or reduced to something more concise, perhaps without a description of the entire rx language but with a manual reference. Suggestions are welcome.

Yes, the doc string should be reduced to the summary of the
constructs.

> +@table @code
> +@item (let @var{ref} @var{rx-expr}@dots{})
> +Bind the name @var{ref} to a submatch that matches @var{rx-expr}@enddots{}.
   ^^^^^^^^^^^^^^^^^^^^^^^
"Bind the symbol @var{ref}", no?

> +@example
> +@group
> +(rx "/*"                          ; Initial /*
> +    (zero-or-more
> +     (or (not (any "*"))          ;  Either non-*,
> +         (seq "*"                 ;  or * followed by
> +              (not (any "/")))))  ;  non-/
> +    (one-or-more "*")             ; At least one star,
> +    "/")                          ; and the final /
> +@end group
> +@end example
> +
> +or, using shorter synonyms and written more compactly,

This last line needs @noindent before it.

> +@table @asis
> +@item @code{"some-string"}

Why @code{"..."} and not @samp{...}?  The latter will look better both
in print and in Info format.

> +Corresponding string regexp: @samp{AB@dots{}} (subexpressions in sequence).
                                ^^^^^^^^^^^^^^^^
I think this should use @samp{@var{a}@var{b}@dots{}} instead.  And
likewise for the other "corresponding string regexps".  The reason is
that neither A nor B stand for themselves, literally, they are
meta-variables.

> +Match the @var{rx}s once or not at all.@*

"Match @var{rx} or an empty string" sounds better to me.

> +Match the @var{rx}s zero or more times, non-greedily.@*

I would add here a cross-reference to where greedy matching is
described.

> +@item @code{(any @var{charset}@dots{})}

Please don't call this "charset", as that term is already taken by a
very different creature in Emacs.  I suggest "character set" instead.

> +Each @var{charset} is a character, a string representing the set of
> +its characters, a range or a character class.  A range is either a
> +hyphen-separated string like @code{"A-Z"}, or a cons of characters
> +like @code{(?A . ?Z)}.

Again, a cross-reference to where "character class" described would be
good here, as would a @cindex entry for "character class in rx".

> +@item @code{space}, @code{whitespace}, @code{white}
> +Match any character that has whitespace syntax.

Only ASCII or also non-ASCII?  This should be spelled out.

> +@xref{Syntax Class Table} for details.  Please note that
                            ^
Comma missing there.

> +@kbd{M-x describe-categories @key{RET}}.  @xref{Categories} for how
                                                              ^
Likewise.

Thanks.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at 36496 <at> debbugs.gnu.org:


Received: (at 36496) by debbugs.gnu.org; 4 Jul 2019 15:01:43 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Jul 04 11:01:43 2019
Received: from localhost ([127.0.0.1]:51701 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hj3F1-0001TL-G8
	for submit <at> debbugs.gnu.org; Thu, 04 Jul 2019 11:01:43 -0400
Received: from aserp2120.oracle.com ([141.146.126.78]:58832)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <drew.adams@HIDDEN>) id 1hj3Ez-0001N9-Gy
 for 36496 <at> debbugs.gnu.org; Thu, 04 Jul 2019 11:01:42 -0400
Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1])
 by aserp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x64EwxJ8152288;
 Thu, 4 Jul 2019 15:01:34 GMT
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com;
 h=mime-version :
 message-id : date : from : sender : to : subject : references :
 in-reply-to : content-type : content-transfer-encoding; s=corp-2018-07-02;
 bh=WNS6yKN6cXz4IwkNxEdfTlYjwJnFG/yvUbIVDlq0xXM=;
 b=khV4iyQs75gnQDAzogzeRW87Oks2gBM/g+FO4ZXBxg4XKTm2cmlu07A4riHzQg5O7BE5
 3Sq+e4qL1rnLUWWVadpBL1FvVXyPEqKxni8c+7FlVBUvSTuD7Pacr2qGYJxb0Cd7iozB
 5Ii2gGZGMP35X41weh0Rn2OpG1GVb2+tCZ/xoA6eaFlqTyuJbmPeay/9EeKLVUVZGkry
 /OXaJnA6lBjm81UiiXuTPTX/qGkkcu15lRWpnMpxFht1Fq6R1J6TsXvFy31Z6VoosP3S
 a0ywrJeXEAbpQsiA5A64z4pqoalARy9sSrHPYz3rdYu1HnVMJ8lG+thiTMDdYfmbw+cy hg== 
Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70])
 by aserp2120.oracle.com with ESMTP id 2te5tbyaj8-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);
 Thu, 04 Jul 2019 15:01:34 +0000
Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1])
 by aserp3020.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x64EwAWC172697;
 Thu, 4 Jul 2019 14:59:34 GMT
Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235])
 by aserp3020.oracle.com with ESMTP id 2th9ec0vjx-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK);
 Thu, 04 Jul 2019 14:59:34 +0000
Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23])
 by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id x64ExXgK009521;
 Thu, 4 Jul 2019 14:59:33 GMT
MIME-Version: 1.0
Message-ID: <93733c07-dfdb-44e7-9d74-88f0c35a3108@default>
Date: Thu, 4 Jul 2019 07:59:31 -0700 (PDT)
From: Drew Adams <drew.adams@HIDDEN>
To: =?iso-8859-1?B?TWF0dGlhcyBFbmdkZWflcmQ=?= <mattiase@HIDDEN>,
 36496 <at> debbugs.gnu.org
Subject: RE: bug#36496: [PATCH] Describe the rx notation in the lisp manual
References: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
In-Reply-To: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
X-Priority: 3
X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.9.1  (1003210) [OL
 16.0.4861.0 (x86)]
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9307
 signatures=668688
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0
 malwarescore=0
 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=801
 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1
 engine=8.0.1-1810050000 definitions=main-1907040189
X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9307
 signatures=668688
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0
 priorityscore=1501 malwarescore=0
 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011
 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=871 adultscore=0
 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000
 definitions=main-1907040189
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 36496
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> The rx notation is useful and complex enough to merit inclusion in the
> manual.
>
> Right now, it's mainly described in the `rx' doc string, which is fairly
> well-written but quite long and a bit unstructured. Describing it in the
> manual permits a different pace and style of exposition, the inclusion of
> examples and related information, structured into separate sections with
> cross-references.

Indeed.  Bonne initiative !
Thanks for working on this.

Like `cl-loop' and Unix or GNU/Linux `find',
`rx' is practically a language unto itself.
But fortunately (unlike `cl-loop') it is
quite Lispy.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 4 Jul 2019 12:13:41 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Jul 04 08:13:41 2019
Received: from localhost ([127.0.0.1]:50502 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hj0cP-0008HS-7G
	for submit <at> debbugs.gnu.org; Thu, 04 Jul 2019 08:13:41 -0400
Received: from lists.gnu.org ([209.51.188.17]:59802)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <mattiase@HIDDEN>) id 1hj0cM-0008HJ-DS
 for submit <at> debbugs.gnu.org; Thu, 04 Jul 2019 08:13:39 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:38767)
 by lists.gnu.org with esmtp (Exim 4.86_2)
 (envelope-from <mattiase@HIDDEN>) id 1hj0cL-00034i-FF
 for bug-gnu-emacs@HIDDEN; Thu, 04 Jul 2019 08:13:38 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,URIBL_BLOCKED
 autolearn=disabled version=3.3.2
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <mattiase@HIDDEN>) id 1hj0cK-0002Tk-39
 for bug-gnu-emacs@HIDDEN; Thu, 04 Jul 2019 08:13:37 -0400
Received: from mail202c50.megamailservers.eu ([91.136.10.212]:33340
 helo=mail193c50.megamailservers.eu)
 by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)
 (Exim 4.71) (envelope-from <mattiase@HIDDEN>) id 1hj0cJ-0002R1-7W
 for bug-gnu-emacs@HIDDEN; Thu, 04 Jul 2019 08:13:36 -0400
X-Authenticated-User: mattiase@HIDDEN
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu;
 s=maildub; t=1562242409;
 bh=HCflxMh9LeueWq4EQrI+y2N4iTlY/ASbWaz6/bqTodQ=;
 h=From:Subject:Date:To:From;
 b=WShy64rgHklLe+Tc8EcjFnyVWiSc29j8crtdqp0E1WFiEOtvP48MAWI6tPpgXSVDB
 +dp4UJu0cs7mjS5q54F3NGKtJcb4qFjpnMejbDiIPXu08fSRjX5Tfw8ju2Vt7AYmto
 +mvcOLwxZGEB1x1234EjuUKsfp8pls60O28ce34E=
Feedback-ID: mattiase@HIDDEN
Received: from [192.168.1.64] (c-e636e253.032-75-73746f71.bbcust.telenor.se
 [83.226.54.230]) (authenticated bits=0)
 by mail193c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x64CDQwU032390
 for <bug-gnu-emacs@HIDDEN>; Thu, 4 Jul 2019 12:13:28 +0000
From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= <mattiase@HIDDEN>
Content-Type: multipart/mixed;
 boundary="Apple-Mail=_E9E5D2A6-19E7-48F8-AEEE-166FC0867929"
Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\))
Subject: [PATCH] Describe the rx notation in the lisp manual
Message-Id: <0C783D67-9502-408B-B845-5599BD596361@HIDDEN>
Date: Thu, 4 Jul 2019 14:13:26 +0200
To: bug-gnu-emacs@HIDDEN
X-Mailer: Apple Mail (2.3445.104.11)
X-CTCH-RefID: str=0001.0A0B0213.5D1DED68.0061, ss=1, re=0.000, recu=0.000,
 reip=0.000, cl=1, cld=1, fgs=0
X-CTCH-VOD: Unknown
X-CTCH-Spam: Unknown
X-CTCH-Score: 0.000
X-CTCH-Rules: 
X-CTCH-Flags: 0
X-CTCH-ScoreCust: 0.000
X-CSC: 0
X-CHA: v=2.3 cv=KsZjJ1eN c=1 sm=1 tr=0 a=M+GU/qJco4WXjv8D6jB2IA==:117
 a=M+GU/qJco4WXjv8D6jB2IA==:17 a=skeJG0nVuyxeInlwYjwA:9 a=CjuIK1q_8ugA:10
 a=Mc4eKmbE7MwFId0pkWMA:9 a=B2y7HmGcmWMA:10
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no
 timestamps) [generic]
X-Received-From: 91.136.10.212
X-Spam-Score: -1.3 (-)
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.3 (--)


--Apple-Mail=_E9E5D2A6-19E7-48F8-AEEE-166FC0867929
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

The rx notation is useful and complex enough to merit inclusion in the =
manual.

Right now, it's mainly described in the `rx' doc string, which is fairly =
well-written but quite long and a bit unstructured. Describing it in the =
manual permits a different pace and style of exposition, the inclusion =
of examples and related information, structured into separate sections =
with cross-references.

Proposed patch attached. It covers all rx features, functions, macros, =
including the pcase pattern, and a mention of the corresponding string =
regexp constructs.

The existing `rx' doc string can be left unchanged, or reduced to =
something more concise, perhaps without a description of the entire rx =
language but with a manual reference. Suggestions are welcome.


--Apple-Mail=_E9E5D2A6-19E7-48F8-AEEE-166FC0867929
Content-Disposition: attachment;
	filename=0001-Describe-the-rx-notation-in-the-elisp-manual.patch
Content-Type: application/octet-stream;
	x-unix-mode=0644;
	name="0001-Describe-the-rx-notation-in-the-elisp-manual.patch"
Content-Transfer-Encoding: quoted-printable

=46rom=20770ce5fad60ea6449881cc2578c365c2724eda56=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20=
<mattiase@HIDDEN>=0ADate:=20Thu,=204=20Jul=202019=2013:01:52=20+0200=0A=
Subject:=20[PATCH]=20Describe=20the=20rx=20notation=20in=20the=20elisp=20=
manual=0A=0A*=20doc/lispref/searching.texi=20(Regular=20Expressions):=20=
New=20menu=20entry.=0A(Regexp=20Example):=20Add=20rx=20form=20of=20the=20=
example.=0A(Rx=20Notation,=20Rx=20Constructs,=20Rx=20Functions):=20New=20=
nodes.=0A*=20doc/lispref/control.texi=20(pcase=20Macro):=20Describe=20=
the=20rx=20pattern.=0A---=0A=20doc/lispref/control.texi=20=20=20|=20=20=
21=20++=0A=20doc/lispref/searching.texi=20|=20525=20=
+++++++++++++++++++++++++++++++++++++=0A=202=20files=20changed,=20546=20=
insertions(+)=0A=0Adiff=20--git=20a/doc/lispref/control.texi=20=
b/doc/lispref/control.texi=0Aindex=20e308d68b75..f7361fed11=20100644=0A=
---=20a/doc/lispref/control.texi=0A+++=20b/doc/lispref/control.texi=0A@@=20=
-618,6=20+618,27=20@@=20pcase=20Macro=0A=20to=20@var{body-forms}=20(thus=20=
avoiding=20an=20evaluation=20error=20on=20match),=0A=20if=20any=20of=20=
the=20sub-patterns=20let-binds=20a=20set=20of=20symbols,=0A=20they=20=
@emph{must}=20all=20bind=20the=20same=20set=20of=20symbols.=0A+=0A+@item=20=
(rx=20@var{rx-expr}@dots{})=0A+Matches=20strings=20against=20the=20=
regexp=20@var{rx-expr}@dots{},=20using=20the=0A+@code{rx}=20regexp=20=
notation=20(@pxref{Rx=20Notation}),=20as=20if=20by=0A=
+@code{string-match}.=0A+=0A+In=20addition=20to=20the=20usual=20=
@code{rx}=20syntax,=20@var{rx-expr}@dots{}=20can=0A+contain=20the=20=
following=20constructs:=0A+=0A+@table=20@code=0A+@item=20(let=20=
@var{ref}=20@var{rx-expr}@dots{})=0A+Bind=20the=20name=20@var{ref}=20to=20=
a=20submatch=20that=20matches=20@var{rx-expr}@enddots{}.=0A+@var{ref}=20=
is=20bound=20in=20@var{body-forms}=20to=20the=20string=20of=20the=20=
submatch=0A+or=20nil,=20but=20can=20also=20be=20used=20in=20=
@code{backref}.=0A+=0A+@item=20(backref=20@var{ref})=0A+Like=20the=20=
standard=20@code{backref}=20construct,=20but=20@var{ref}=20can=20here=0A=
+also=20be=20a=20name=20introduced=20by=20a=20previous=20@code{(let=20=
@var{ref}=20@dots{})}=0A+construct.=0A+@end=20table=0A+=0A=20@end=20=
table=0A=20=0A=20@anchor{pcase-example-0}=0Adiff=20--git=20=
a/doc/lispref/searching.texi=20b/doc/lispref/searching.texi=0Aindex=20=
ef1cffc446..b3b4ed3638=20100644=0A---=20a/doc/lispref/searching.texi=0A=
+++=20b/doc/lispref/searching.texi=0A@@=20-254,6=20+254,7=20@@=20Regular=20=
Expressions=0A=20@menu=0A=20*=20Syntax=20of=20Regexps::=20=20=20=20=20=20=
=20Rules=20for=20writing=20regular=20expressions.=0A=20*=20Regexp=20=
Example::=20=20=20=20=20=20=20=20=20=20Illustrates=20regular=20=
expression=20syntax.=0A+*=20Rx=20Notation::=20=20=20=20=20=20=20=20=20=20=
=20=20=20An=20alternative,=20structured=20regexp=20notation.=0A=20*=20=
Regexp=20Functions::=20=20=20=20=20=20=20=20Functions=20for=20operating=20=
on=20regular=20expressions.=0A=20@end=20menu=0A=20=0A@@=20-951,6=20=
+952,530=20@@=20Regexp=20Example=0A=20beyond=20the=20minimum=20needed=20=
to=20end=20a=20sentence.=0A=20@end=20table=0A=20=0A+In=20the=20@code{rx}=20=
notation=20(@pxref{Rx=20Notation}),=20the=20regexp=20could=20be=20=
written=0A+=0A+@example=0A+@group=0A+(rx=20(any=20".?!")=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=20Punctuation=20ending=20=
sentence.=0A+=20=20=20=20(zero-or-more=20(any=20"\"')]@}"))=20=20;=20=
Closing=20quotes=20or=20brackets.=0A+=20=20=20=20(or=20line-end=0A+=20=20=
=20=20=20=20=20=20(seq=20"=20"=20line-end)=0A+=20=20=20=20=20=20=20=20=
"\t"=0A+=20=20=20=20=20=20=20=20"=20=20")=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20;=20Two=20spaces.=0A+=20=20=20=20=
(zero-or-more=20(any=20"\t\n=20")))=20=20;=20Optional=20extra=20=
whitespace.=0A+@end=20group=0A+@end=20example=0A+=0A+Since=20@code{rx}=20=
regexps=20are=20just=20S-expressions,=20they=20can=20be=20formatted=0A=
+and=20commented=20as=20such.=0A+=0A+@node=20Rx=20Notation=0A=
+@subsection=20The=20@code{rx}=20Structured=20Regexp=20Notation=0A=
+@cindex=20rx=0A+@cindex=20regexp=20syntax=0A+=0A+=20=20As=20an=20=
alternative=20to=20the=20string-based=20syntax,=20Emacs=20provides=20the=0A=
+structured=20@code{rx}=20notation=20based=20on=20Lisp=20forms.=20=20=
This=20notation=20is=0A+usually=20easier=20to=20read,=20write=20and=20=
maintain=20than=20regexp=20strings,=20and=0A+can=20be=20indented=20and=20=
commented=20freely.=20=20It=20requires=20a=20conversion=20into=0A+string=20=
form=20since=20that=20is=20what=20regexp=20functions=20expect,=20but=20=
that=0A+conversion=20typically=20takes=20place=20during=20=
byte-compilation=20rather=20than=0A+when=20the=20Lisp=20code=20using=20=
the=20regexp=20is=20run.=0A+=0A+=20=20Here=20is=20an=20@code{rx}=20=
regexp@footnote{It=20could=20be=20written=20much=0A+simpler=20with=20=
non-greedy=20operators=20(how?),=20but=20that=20would=20make=20the=0A=
+example=20less=20interesting.}=20that=20matches=20a=20block=20comment=20=
in=20the=20C=0A+programming=20language:=0A+=0A+@example=0A+@group=0A+(rx=20=
"/*"=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20;=20Initial=20/*=0A+=20=20=20=20(zero-or-more=0A+=20=20=20=20=20=
(or=20(not=20(any=20"*"))=20=20=20=20=20=20=20=20=20=20;=20=20Either=20=
non-*,=0A+=20=20=20=20=20=20=20=20=20(seq=20"*"=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20;=20=20or=20*=20followed=20by=0A+=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20(not=20(any=20"/")))))=20=20;=20=20non-/=0A+=20=20=
=20=20(one-or-more=20"*")=20=20=20=20=20=20=20=20=20=20=20=20=20;=20At=20=
least=20one=20star,=0A+=20=20=20=20"/")=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=20and=20the=20final=20/=0A=
+@end=20group=0A+@end=20example=0A+=0A+or,=20using=20shorter=20synonyms=20=
and=20written=20more=20compactly,=0A+=0A+@example=0A+@group=0A+(rx=20=
"/*"=0A+=20=20=20=20(*=20(|=20(not=20(any=20"*"))=0A+=20=20=20=20=20=20=20=
=20=20=20(:=20"*"=20(not=20(any=20"/")))))=0A+=20=20=20=20(+=20"*")=20=
"/")=0A+@end=20group=0A+@end=20example=0A+=0A+In=20conventional=20string=20=
syntax,=20it=20would=20be=20written=0A+=0A+@example=0A=
+"/\\*\\(?:[^*]\\|\\*[^/]\\)*\\*+/"=0A+@end=20example=0A+=0A+The=20=
@code{rx}=20notation=20is=20mainly=20useful=20in=20Lisp=20code;=20it=20=
cannot=20be=0A+used=20in=20most=20interactive=20situations=20where=20a=20=
regexp=20is=20requested,=20such=0A+as=20when=20running=20=
@code{query-replace-regexp}=20or=20in=20variable=0A+customisation.=0A+=0A=
+@menu=0A+*=20Rx=20Constructs::=20=20=20=20=20=20=20Constructs=20valid=20=
in=20rx=20forms.=0A+*=20Rx=20Functions::=20=20=20=20=20=20=20=20=
Functions=20and=20macros=20that=20use=20rx=20forms.=0A+@end=20menu=0A+=0A=
+@node=20Rx=20Constructs=0A+@subsubsection=20Constructs=20in=20@code{rx}=20=
regexps=0A+=0A+The=20various=20forms=20in=20@code{rx}=20regexps=20are=20=
described=20below.=20=20The=0A+shorthand=20@var{rx}=20represents=20any=20=
@code{rx}=20form,=20and=20@var{rx}@dots{}=0A+means=20one=20or=20more=20=
@code{rx}=20forms.=20=20Where=20the=20corresponding=20string=0A+regexp=20=
syntax=20is=20given,=20@samp{A},=20@samp{B},=20@dots{}=20are=20string=20=
regexp=0A+subexpressions.=0A+@c=20With=20the=20new=20implementation=20of=20=
rx,=20this=20can=20be=20changed=20from=0A+@c=20'one=20or=20more'=20to=20=
'zero=20or=20more'.=0A+=0A+@subsubheading=20Literals=0A+=0A+@table=20=
@asis=0A+@item=20@code{"some-string"}=0A+Matches=20the=20string=20=
@samp{some-string}=20literally.=20=20There=20are=20no=0A+characters=20=
with=20special=20meaning,=20unlike=20in=20string=20regexps.=0A+=0A+@item=20=
@code{?C}=0A+Matches=20the=20character=20@samp{C}=20literally.=0A+@end=20=
table=0A+=0A+@subsubheading=20Fundamental=20structure=0A+=0A+@table=20=
@asis=0A+@item=20@code{(seq=20@var{rx}@dots{})}=0A+@cindex=20@samp{seq}=20=
in=20rx=0A+@itemx=20@code{(sequence=20@var{rx}@dots{})}=0A+@cindex=20=
@samp{sequence}=20in=20rx=0A+@itemx=20@code{(:=20@var{rx}@dots{})}=0A=
+@cindex=20@samp{:}=20in=20rx=0A+@itemx=20@code{(and=20@var{rx}@dots{})}=0A=
+@cindex=20@samp{and}=20in=20rx=0A+Match=20the=20@var{rx}s=20in=20=
sequence.=20=20Without=20arguments,=20the=20expression=0A+matches=20the=20=
empty=20string.@*=0A+Corresponding=20string=20regexp:=20@samp{AB@dots{}}=20=
(subexpressions=20in=20sequence).=0A+=0A+@item=20@code{(or=20=
@var{rx}@dots{})}=0A+@cindex=20@samp{or}=20in=20rx=0A+@itemx=20@code{(|=20=
@var{rx}@dots{})}=0A+@cindex=20@samp{|}=20in=20rx=0A+Match=20exactly=20=
one=20of=20the=20@var{rx}s,=20trying=20from=20left=20to=20right.=0A=
+Without=20arguments,=20the=20expression=20will=20not=20match=20anything=20=
at=20all.@*=0A+Corresponding=20string=20regexp:=20@samp{A\|B\|@dots{}}.=0A=
+@end=20table=0A+=0A+@subsubheading=20Repetition=0A+=0A+@table=20@code=0A=
+@item=20(zero-or-more=20@var{rx}@dots{})=0A+@cindex=20=
@samp{zero-or-more}=20in=20rx=0A+@itemx=20(0+=20@var{rx}@dots{})=0A=
+@cindex=20@samp{0+}=20in=20rx=0A+@itemx=20(*=20@var{rx}@dots{})=0A=
+@cindex=20@samp{*}=20in=20rx=0A+Match=20the=20@var{rx}s=20zero=20or=20=
more=20times.@*=0A+Corresponding=20string=20regexp:=20@samp{A*}=0A+=0A=
+@item=20(one-or-more=20@var{rx}@dots{})=0A+@cindex=20@samp{one-or-more}=20=
in=20rx=0A+@itemx=20(1+=20@var{rx}@dots{})=0A+@cindex=20@samp{1+}=20in=20=
rx=0A+@itemx=20(+=20@var{rx}@dots{})=0A+@cindex=20@samp{+}=20in=20rx=0A=
+Match=20the=20@var{rx}s=20one=20or=20more=20times.@*=0A+Corresponding=20=
string=20regexp:=20@samp{A+}=0A+=0A+@item=20(zero-or-one=20=
@var{rx}@dots{})=0A+@cindex=20@samp{zero-or-one}=20in=20rx=0A+@itemx=20=
(optional=20@var{rx}@dots{})=0A+@cindex=20@samp{optional}=20in=20rx=0A=
+@itemx=20(opt=20@var{rx}@dots{})=0A+@cindex=20@samp{opt}=20in=20rx=0A=
+@itemx=20(?=20@var{rx}@dots{})=0A+@cindex=20@samp{?}=20in=20rx=0A+Match=20=
the=20@var{rx}s=20once=20or=20not=20at=20all.@*=0A+Corresponding=20=
string=20regexp:=20@samp{A?}=0A+=0A+@item=20(*?=20@var{rx}@dots{})=0A=
+@cindex=20@samp{*?}=20in=20rx=0A+Match=20the=20@var{rx}s=20zero=20or=20=
more=20times,=20non-greedily.@*=0A+Corresponding=20string=20regexp:=20=
@samp{A*?}=0A+=0A+@item=20(+?=20@var{rx}@dots{})=0A+@cindex=20@samp{+?}=20=
in=20rx=0A+Match=20the=20@var{rx}s=20one=20or=20more=20times,=20=
non-greedily.@*=0A+Corresponding=20string=20regexp:=20@samp{A+?}=0A+=0A=
+@item=20(??=20@var{rx}@dots{})=0A+@cindex=20@samp{??}=20in=20rx=0A=
+Match=20the=20@var{rx}s=20once=20or=20not=20at=20all,=20non-greedily.@*=0A=
+Corresponding=20string=20regexp:=20@samp{A??}=0A+=0A+@item=20(=3D=20=
@var{n}=20@var{rx}@dots{})=0A+@cindex=20@samp{=3D}=20in=20rx=0A+@itemx=20=
(repeat=20@var{n}=20@var{rx})=0A+Match=20the=20@var{rx}s=20exactly=20=
@var{n}=20times.@*=0A+Corresponding=20string=20regexp:=20=
@samp{A\@{@var{n}\@}}=0A+=0A+@item=20(>=3D=20@var{n}=20@var{rx}@dots{})=0A=
+@cindex=20@samp{>=3D}=20in=20rx=0A+Match=20the=20@var{rx}s=20@var{n}=20=
or=20more=20times.@*=0A+Corresponding=20string=20regexp:=20=
@samp{A\@{@var{n},\@}}=0A+=0A+@item=20(**=20@var{n}=20@var{m}=20=
@var{rx}@dots{})=0A+@cindex=20@samp{**}=20in=20rx=0A+@itemx=20(repeat=20=
@var{n}=20@var{m}=20@var{rx}@dots{})=0A+@cindex=20@samp{repeat}=20in=20=
rx=0A+Match=20the=20@var{rx}s=20at=20least=20@var{n}=20but=20no=20more=20=
than=20@var{m}=20times.@*=0A+Corresponding=20string=20regexp:=20=
@samp{A\@{@var{n},@var{m}\@}}=0A+=0A+@item=20(minimal-match=20@var{rx})=0A=
+@cindex=20@samp{minimal-match}=20in=20rx=0A+Match=20@var{rx},=20with=20=
@code{zero-or-more},=20@code{one-or-more}=20and=0A+@code{zero-or-more}=20=
and=20their=20synonyms=20@emph{except}=20@code{*},=0A+@code{+}=20and=20=
@code{?}=20using=20non-greedy=20matching.=0A+=0A+@item=20(maximal-match=20=
@var{rx})=0A+@cindex=20@samp{maximal-match}=20in=20rx=0A+Match=20=
@var{rx},=20with=20@code{zero-or-more},=20@code{one-or-more}=20and=0A=
+@code{zero-or-more}=20and=20their=20synonyms=20using=20greedy=20=
matching.=0A+This=20is=20the=20default.=0A+@end=20table=0A+=0A=
+@subsubheading=20Matching=20single=20characters=0A+=0A+@table=20@asis=0A=
+@item=20@code{(any=20@var{charset}@dots{})}=0A+@cindex=20@samp{any}=20=
in=20rx=0A+@itemx=20@code{(char=20@var{charset}@dots{})}=0A+@cindex=20=
@samp{char}=20in=20rx=0A+@itemx=20@code{(in=20@var{charset}@dots{})}=0A=
+@cindex=20@samp{in}=20in=20rx=0A+Match=20a=20single=20character=20from=20=
one=20of=20the=20@var{charset}s.=0A+Each=20@var{charset}=20is=20a=20=
character,=20a=20string=20representing=20the=20set=20of=0A+its=20=
characters,=20a=20range=20or=20a=20character=20class.=20=20A=20range=20=
is=20either=20a=0A+hyphen-separated=20string=20like=20@code{"A-Z"},=20or=20=
a=20cons=20of=20characters=0A+like=20@code{(?A=20.=20?Z)}.=0A+=0A+Note=20=
that=20hyphen=20(@code{-})=20is=20special=20in=20strings=20in=20this=20=
construct,=0A+since=20it=20acts=20as=20a=20range=20separator.=20=20To=20=
include=20a=20hyphen,=20add=20it=20as=20a=0A+separate=20character=20or=20=
single-character=20string.@*=0A+Corresponding=20string=20regexp:=20=
@samp{[@dots{}]}=0A+=0A+@item=20@code{(not=20@var{charspec})}=0A+@cindex=20=
@samp{not}=20in=20rx=0A+Match=20a=20character=20not=20included=20in=20=
@var{charspec}.=20=20@var{charspec}=20can=0A+be=20an=20@code{any},=20=
@code{syntax}=20or=20@code{category}=20form,=20or=20a=0A+character=20=
class.@*=0A+Corresponding=20string=20regexp:=20@samp{[^@dots{}]},=20=
@samp{\S@var{code}},=0A+@samp{\C@var{code}}=0A+=0A+@item=20=
@code{not-newline},=20@code{nonl}=0A+@cindex=20@samp{not-newline}=20in=20=
rx=0A+@cindex=20@samp{nonl}=20in=20rx=0A+Match=20any=20character=20=
except=20a=20newline.@*=0A+Corresponding=20string=20regexp:=20@samp{.}=20=
(dot)=0A+=0A+@item=20@code{anything}=0A+@cindex=20@samp{anything}=20in=20=
rx=0A+Match=20any=20character.@*=0A+Corresponding=20string=20regexp:=20=
@samp{.\|\n}=20(for=20example)=0A+=0A+@item=20character=20class=0A=
+@cindex=20character=20class=20in=20rx=0A+Match=20a=20character=20from=20=
a=20named=20character=20class:=0A+=0A+@table=20@asis=0A+@item=20=
@code{alpha},=20@code{alphabetic},=20@code{letter}=0A+Match=20alphabetic=20=
characters.=20=20More=20precisely,=20match=20characters=20whose=0A=
+Unicode=20@samp{general-category}=20property=20indicates=20that=20they=20=
are=0A+alphabetic.=0A+=0A+@item=20@code{alnum},=20@code{alphanumeric}=0A=
+Match=20alphabetic=20characters=20and=20digits.=20=20More=20precisely,=20=
match=0A+characters=20whose=20Unicode=20@samp{general-category}=20=
property=20indicates=0A+that=20they=20are=20alphabetic=20or=20decimal=20=
digits.=0A+=0A+@item=20@code{digit},=20@code{numeric},=20@code{num}=0A=
+Match=20the=20digits=200--9.=0A+=0A+@item=20@code{xdigit},=20=
@code{hex-digit},=20@code{hex}=0A+Match=200--9,=20A--F=20and=20a--f.=0A+=0A=
+@item=20@code{cntrl},=20@code{control}=0A+Match=20any=20character=20=
whose=20code=20is=20in=20the=20range=200--31.=0A+=0A+@item=20=
@code{space},=20@code{whitespace},=20@code{white}=0A+Match=20any=20=
character=20that=20has=20whitespace=20syntax.=0A+=0A+@item=20=
@code{lower},=20@code{lower-case}=0A+Match=20anything=20lower-case,=20as=20=
determined=20by=20the=20current=20case=20table.=0A+If=20=
@code{case-fold-search}=20is=20non-nil,=20this=20also=20matches=20any=0A=
+upper-case=20letter.=0A+=0A+@item=20@code{upper},=20@code{upper-case}=0A=
+Match=20anything=20upper-case,=20as=20determined=20by=20the=20current=20=
case=20table.=0A+If=20@code{case-fold-search}=20is=20non-nil,=20this=20=
also=20matches=20any=0A+lower-case=20letter.=0A+=0A+@item=20=
@code{graph},=20@code{graphic}=0A+Match=20any=20character=20except=20=
whitespace,=20ASCII=20and=20non-ASCII=20control=0A+characters,=20=
surrogates,=20and=20codepoints=20unassigned=20by=20Unicode,=20as=0A=
+indicated=20by=20the=20Unicode=20@samp{general-category}=20property.=0A=
+=0A+@item=20@code{print},=20@code{printing}=0A+Match=20whitespace=20or=20=
a=20character=20matched=20by=20@code{graph}.=0A+=0A+@item=20=
@code{punct},=20@code{punctuation}=0A+Match=20any=20punctuation=20=
character.=20=20(At=20present,=20for=20multibyte=0A+characters,=20=
anything=20that=20has=20non-word=20syntax.)=0A+=0A+@item=20@code{word},=20=
@code{wordchar}=0A+Match=20any=20character=20that=20has=20word=20syntax=20=
(@pxref{Syntax=20Class=20Table}).=0A+@end=20table=0A+=0A+Corresponding=20=
string=20regexp:=20@samp{[[:@var{class}:]]}=0A+=0A+@item=20@code{(syntax=20=
@var{syntax})}=0A+@cindex=20@samp{syntax}=20in=20rx=0A+Match=20a=20=
character=20with=20syntax=20@var{syntax},=20being=20one=20of=20the=20=
following=0A+names:=0A+=0A+@multitable=20{@code{close-parenthesis}}=20=
{Syntax=20character}=0A+@headitem=20Syntax=20name=20=20=20=20=20=20=20=20=
=20=20@tab=20Syntax=20character=0A+@item=20@code{whitespace}=20=20=20=20=20=
=20=20=20@tab=20@code{-}=0A+@item=20@code{punctuation}=20=20=20=20=20=20=20=
@tab=20@code{.}=0A+@item=20@code{word}=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20@tab=20@code{w}=0A+@item=20@code{symbol}=20=20=20=20=20=20=20=20=20=
=20=20=20@tab=20@code{_}=0A+@item=20@code{open-parenthesis}=20=20@tab=20=
@code{(}=0A+@item=20@code{close-parenthesis}=20@tab=20@code{)}=0A+@item=20=
@code{expression-prefix}=20@tab=20@code{'}=0A+@item=20=
@code{string-quote}=20=20=20=20=20=20@tab=20@code{"}=0A+@item=20=
@code{paired-delimiter}=20=20@tab=20@code{$}=0A+@item=20@code{escape}=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{\}=0A+@item=20=
@code{character-quote}=20=20=20@tab=20@code{/}=0A+@item=20=
@code{comment-start}=20=20=20=20=20@tab=20@code{<}=0A+@item=20=
@code{comment-end}=20=20=20=20=20=20=20@tab=20@code{>}=0A+@item=20=
@code{string-delimiter}=20=20@tab=20@code{|}=0A+@item=20=
@code{comment-delimiter}=20@tab=20@code{!}=0A+@end=20multitable=0A+=0A=
+@xref{Syntax=20Class=20Table}=20for=20details.=20=20Please=20note=20=
that=0A+@code{(syntax=20punctuation)}=20is=20@emph{not}=20equivalent=20=
to=20the=20character=20class=0A+@code{punctuation}.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\s@var{code}}=0A+=0A+@item=20@code=20{(category=20=
@var{category})}=0A+@cindex=20@samp{category}=20in=20rx=0A+Match=20a=20=
character=20in=20category=20@var{category},=20which=20is=20either=20one=20=
of=0A+the=20names=20below=20or=20its=20category=20character.=0A+=0A=
+@multitable=20{@code{vowel-modifying-diacritical-mark}}=20{Category=20=
character}=0A+@headitem=20Category=20name=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20@tab=20Category=20character=0A+@item=20=
@code{space-for-indent}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20space=0A+@item=20@code{base}=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{.}=0A+@item=20=
@code{consonant}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{0}=0A+@item=20@code{base-vowel}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{1}=0A=
+@item=20@code{upper-diacritical-mark}=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{2}=0A+@item=20@code{lower-diacritical-mark}=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{3}=0A+@item=20@code{tone-mark}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{4}=0A=
+@item=20@code{symbol}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{5}=0A+@item=20@code{digit}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{6}=0A+@item=20@code{vowel-modifying-diacritical-mark}=20=
@tab=20@code{7}=0A+@item=20@code{vowel-sign}=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{8}=0A+@item=20=
@code{semivowel-lower}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{9}=0A+@item=20@code{not-at-end-of-line}=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20@tab=20@code{<}=0A+@item=20=
@code{not-at-beginning-of-line}=20=20=20=20=20=20=20=20=20@tab=20=
@code{>}=0A+@item=20@code{alpha-numeric-two-byte}=20=20=20=20=20=20=20=20=
=20=20=20@tab=20@code{A}=0A+@item=20@code{chinese-two-byte}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{C}=0A+@item=20=
@code{greek-two-byte}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20@tab=20@code{G}=0A+@item=20@code{japanese-hiragana-two-byte}=20=20=20=20=
=20=20=20@tab=20@code{H}=0A+@item=20@code{indian-two-byte}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{I}=0A+@item=20=
@code{japanese-katakana-two-byte}=20=20=20=20=20=20=20@tab=20@code{K}=0A=
+@item=20@code{strong-left-to-right}=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{L}=0A+@item=20@code{korean-hangul-two-byte}=20=20=20=20=20=20=
=20=20=20=20=20@tab=20@code{N}=0A+@item=20@code{strong-right-to-left}=20=20=
=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{R}=0A+@item=20=
@code{cyrillic-two-byte}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{Y}=0A+@item=20@code{combining-diacritic}=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{^}=0A+@item=20@code{ascii}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{a}=0A+@item=20@code{arabic}=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{b}=0A+@item=20=
@code{chinese}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20@tab=20@code{c}=0A+@item=20@code{ethiopic}=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20=
@code{e}=0A+@item=20@code{greek}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{g}=0A+@item=20=
@code{korean}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{h}=0A+@item=20@code{indian}=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{i}=0A+@item=20@code{japanese}=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{j}=0A+@item=20=
@code{japanese-katakana}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{k}=0A+@item=20@code{latin}=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{l}=0A+@item=20=
@code{lao}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20@tab=20@code{o}=0A+@item=20@code{tibetan}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
@tab=20@code{q}=0A+@item=20@code{japanese-roman}=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20@tab=20@code{r}=0A+@item=20@code{thai}=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20@tab=20@code{t}=0A+@item=20@code{vietnamese}=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{v}=0A+@item=20=
@code{hebrew}=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20@tab=20@code{w}=0A+@item=20@code{cyrillic}=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20@tab=20=
@code{y}=0A+@item=20@code{can-break}=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20@tab=20@code{|}=0A+@end=20multitable=0A=
+=0A+For=20more=20information=20about=20currently=20defined=20=
categories,=20run=20the=20command=0A+@kbd{M-x=20describe-categories=20=
@key{RET}}.=20=20@xref{Categories}=20for=20how=0A+to=20define=20new=20=
categories.@*=0A+Corresponding=20string=20regexp:=20@samp{\c@var{code}}=0A=
+@end=20table=0A+=0A+@subsubheading=20Zero-width=20assertions=0A+=0A=
+These=20all=20match=20the=20empty=20string,=20but=20only=20in=20=
specific=20places.=0A+=0A+@table=20@asis=0A+@item=20@code{line-start},=20=
@code{bol}=0A+@cindex=20@samp{line-start}=20in=20rx=0A+@cindex=20=
@samp{bol}=20in=20rx=0A+Match=20at=20the=20beginning=20of=20a=20line.@*=0A=
+Corresponding=20string=20regexp:=20@samp{^}=0A+=0A+@item=20=
@code{line-end},=20@code{eol}=0A+@cindex=20@samp{line-end}=20in=20rx=0A=
+@cindex=20@samp{eol}=20in=20rx=0A+Match=20at=20the=20end=20of=20a=20=
line.@*=0A+Corresponding=20string=20regexp:=20@samp{$}=0A+=0A+@item=20=
@code{string-start},=20@code{bos},=20@code{buffer-start},=20@code{bot}=0A=
+@cindex=20@samp{string-start}=20in=20rx=0A+@cindex=20@samp{bos}=20in=20=
rx=0A+@cindex=20@samp{buffer-start}=20in=20rx=0A+@cindex=20@samp{bot}=20=
in=20rx=0A+Match=20at=20the=20start=20of=20the=20string=20or=20buffer=20=
being=20matched=20against.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\`}=0A+=0A+@item=20@code{string-end},=20@code{eos},=20=
@code{buffer-end},=20@code{eot}=0A+@cindex=20@samp{string-end}=20in=20rx=0A=
+@cindex=20@samp{eos}=20in=20rx=0A+@cindex=20@samp{buffer-end}=20in=20rx=0A=
+@cindex=20@samp{eot}=20in=20rx=0A+Match=20at=20the=20end=20of=20the=20=
string=20or=20buffer=20being=20matched=20against.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\'}=0A+=0A+@item=20@code{point}=0A+@cindex=20=
@samp{point}=20in=20rx=0A+Matches=20at=20point.@*=0A+Corresponding=20=
string=20regexp:=20@samp{\=3D}=0A+=0A+@item=20@code{word-start}=0A=
+@cindex=20@samp{word-start}=20in=20rx=0A+Matches=20at=20the=20beginning=20=
of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20@samp{\<}=0A+=0A=
+@item=20@code{word-end}=0A+@cindex=20@samp{word-end}=20in=20rx=0A=
+Matches=20at=20the=20end=20of=20a=20word.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\>}=0A+=0A+@item=20@code{word-boundary}=0A+@cindex=20=
@samp{word-boundary}=20in=20rx=0A+Matches=20at=20the=20beginning=20or=20=
end=20of=20a=20word.@*=0A+Corresponding=20string=20regexp:=20@samp{\b}=0A=
+=0A+@item=20@code{not-word-boundary}=0A+@cindex=20=
@samp{not-word-boundary}=20in=20rx=0A+Matches=20anywhere=20but=20at=20=
the=20beginning=20or=20end=20of=20a=20word.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\B}=0A+=0A+@item=20@code{symbol-start}=0A+@cindex=20=
@samp{symbol-start}=20in=20rx=0A+Matches=20at=20the=20beginning=20of=20a=20=
symbol.@*=0A+Corresponding=20string=20regexp:=20@samp{\_<}=0A+=0A+@item=20=
@code{symbol-end}=0A+@cindex=20@samp{symbol-end}=20in=20rx=0A+Matches=20=
at=20the=20end=20of=20a=20symbol.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\_>}=0A+@end=20table=0A+=0A+@subsubheading=20Capture=20groups=0A+=0A=
+@table=20@code=0A+@item=20(group=20@var{rx}@dots{})=0A+@cindex=20=
@samp{group}=20in=20rx=0A+@itemx=20(submatch=20@var{rx}@dots{})=0A=
+@cindex=20@samp{submatch}=20in=20rx=0A+Match=20the=20@var{rx}s,=20=
making=20the=20matched=20text=20and=20position=20accessible=0A+in=20the=20=
match=20data.=20=20The=20first=20group=20in=20a=20regexp=20is=20numbered=20=
1;=0A+subsequent=20groups=20will=20be=20numbered=20one=20higher=20than=20=
the=20previous=0A+group.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\(@dots{}\)}=0A+=0A+@item=20(group-n=20@var{n}=20@var{rx}@dots{})=0A=
+@cindex=20@samp{group-n}=20in=20rx=0A+@itemx=20(submatch-n=20@var{n}=20=
@var{rx}@dots{})=0A+@cindex=20@samp{submatch-n}=20in=20rx=0A+Like=20=
@code{group},=20but=20explicitly=20assign=20the=20group=20number=20=
@var{n}.=0A+@var{n}=20must=20be=20positive.@*=0A+Corresponding=20string=20=
regexp:=20@samp{\(?@var{n}:@dots{}\)}=0A+=0A+@item=20(backref=20@var{n})=0A=
+@cindex=20@samp{backref}=20in=20rx=0A+Match=20the=20text=20previously=20=
matched=20by=20group=20number=20@var{n}.=0A+@var{n}=20must=20be=20=
positive=20and=20less=20than=2010.@*=0A+Corresponding=20string=20regexp:=20=
@samp{\@var{n}}=0A+@end=20table=0A+=0A+@subsubheading=20Dynamic=20=
inclusion=0A+=0A+@table=20@code=0A+@item=20(literal=20@var{expr})=0A=
+@cindex=20@samp{literal}=20in=20rx=0A+Match=20the=20literal=20string=20=
that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A+expression=20=
@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20call=20time,=20=
in=0A+the=20current=20lexical=20environment.=0A+=0A+@item=20(regexp=20=
@var{expr})=0A+@cindex=20@samp{regexp}=20in=20rx=0A+@itemx=20(regex=20=
@var{expr})=0A+@cindex=20@samp{regex}=20in=20rx=0A+Match=20the=20string=20=
regexp=20that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A=
+expression=20@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20=
call=20time,=20in=0A+the=20current=20lexical=20environment.=0A+=0A+@item=20=
(eval=20@var{expr})=0A+@cindex=20@samp{eval}=20in=20rx=0A+Match=20the=20=
rx=20form=20that=20is=20the=20result=20from=20evaluating=20the=20Lisp=0A=
+expression=20@var{expr}.=20=20The=20evaluation=20takes=20place=20at=20=
macro-expansion=0A+time=20for=20@code{rx},=20at=20call=20time=20for=20=
@code{rx-to-string},=0A+in=20the=20current=20global=20environment.=0A=
+@end=20table=0A+=0A+@node=20Rx=20Functions=0A+@subsubsection=20=
Functions=20and=20macros=20using=20@code{rx}=20regexps=0A+=0A+@defmac=20=
rx=20rx-expr@dots{}=0A+Translate=20the=20@var{rx-expr}s=20to=20a=20=
string=20regexp,=20as=20if=20they=20were=20the=0A+body=20of=20a=20=
@code{(seq=20@dots{})}=20form.=20=20The=20@code{rx}=20macro=20expands=20=
to=20a=0A+string=20constant,=20or,=20if=20@code{literal}=20or=20=
@code{regexp}=20forms=20are=0A+used,=20a=20Lisp=20expression=20that=20=
evaluates=20to=20a=20string.=0A+@end=20defmac=0A+=0A+@defun=20=
rx-to-string=20rx-expr=20&optional=20no-group=0A+Translate=20=
@var{rx-expr}=20to=20a=20string=20regexp=20which=20is=20returned.=0A+If=20=
@var{no-group}=20is=20absent=20or=20nil,=20bracket=20the=20result=20in=20=
a=0A+non-capturing=20group,=20@samp{\(?:@dots{}\)},=20if=20necessary=20=
to=20ensure=20that=0A+a=20postfix=20operator=20appended=20to=20it=20will=20=
apply=20to=20the=20whole=20expression.=0A+=0A+Arguments=20to=20=
@code{literal}=20and=20@code{regexp}=20forms=20in=20@var{rx-expr}=0A=
+must=20be=20string=20literals.=0A+@end=20defun=0A+=0A+The=20=
@code{pcase}=20macro=20can=20use=20@code{rx}=20expressions=20as=20=
patterns=0A+directly;=20@pxref{pcase=20Macro}.=0A+=0A=20@node=20Regexp=20=
Functions=0A=20@subsection=20Regular=20Expression=20Functions=0A=20=0A--=20=
=0A2.20.1=20(Apple=20Git-117)=0A=0A=

--Apple-Mail=_E9E5D2A6-19E7-48F8-AEEE-166FC0867929--




Acknowledgement sent to Mattias Engdegård <mattiase@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#36496; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Mon, 25 Nov 2019 12:00:02 UTC

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