From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 04 08:13:41 2019 Received: (at submit) by debbugs.gnu.org; 4 Jul 2019 12:13:41 +0000 Received: from localhost ([127.0.0.1]:50502 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hj0cP-0008HS-7G for submit@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 ) id 1hj0cM-0008HJ-DS for submit@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 ) id 1hj0cL-00034i-FF for bug-gnu-emacs@gnu.org; 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 ) id 1hj0cK-0002Tk-39 for bug-gnu-emacs@gnu.org; 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 ) id 1hj0cJ-0002R1-7W for bug-gnu-emacs@gnu.org; Thu, 04 Jul 2019 08:13:36 -0400 X-Authenticated-User: mattiase@bredband.net 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@acm.or 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 ; Thu, 4 Jul 2019 12:13:28 +0000 From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= 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@acm.org> Date: Thu, 4 Jul 2019 14:13:26 +0200 To: bug-gnu-emacs@gnu.org 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@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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= =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-- From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 04 11:01:43 2019 Received: (at 36496) by debbugs.gnu.org; 4 Jul 2019 15:01:43 +0000 Received: from localhost ([127.0.0.1]:51701 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hj3F1-0001TL-G8 for submit@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 ) id 1hj3Ez-0001N9-Gy for 36496@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 To: =?iso-8859-1?B?TWF0dGlhcyBFbmdkZWflcmQ=?= , 36496@debbugs.gnu.org Subject: RE: bug#36496: [PATCH] Describe the rx notation in the lisp manual References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> In-Reply-To: <0C783D67-9502-408B-B845-5599BD596361@acm.org> 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@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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. From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 04 12:28:19 2019 Received: (at 36496) by debbugs.gnu.org; 4 Jul 2019 16:28:19 +0000 Received: from localhost ([127.0.0.1]:51809 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hj4ao-0006UN-RW for submit@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 ) id 1hj4an-0006U9-GV for 36496@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 ) 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 ) 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@gnu.org> From: Eli Zaretskii To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= In-reply-to: <0C783D67-9502-408B-B845-5599BD596361@acm.org> (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@acm.org> 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@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Mattias Engdegård > 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. From debbugs-submit-bounces@debbugs.gnu.org Fri Jul 05 10:14:07 2019 Received: (at 36496) by debbugs.gnu.org; 5 Jul 2019 14:14:07 +0000 Received: from localhost ([127.0.0.1]:53601 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjOyV-0002d0-8Z for submit@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 ) id 1hjOyQ-0002cI-L2 for 36496@debbugs.gnu.org; Fri, 05 Jul 2019 10:14:04 -0400 X-Authenticated-User: mattiase@bredband.net 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@acm.or 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?= Message-Id: 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@gnu.org> To: Eli Zaretskii References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> 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@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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 : >=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= =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-- From debbugs-submit-bounces@debbugs.gnu.org Fri Jul 05 20:10:37 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 00:10:37 +0000 Received: from localhost ([127.0.0.1]:54020 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjYHk-0008Rj-N7 for submit@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 ) id 1hjYHi-0008RI-Jy for 36496@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 ) 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 ) id 1hjYHa-0005qu-Ox; Fri, 05 Jul 2019 20:10:26 -0400 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Eli Zaretskii In-Reply-To: <838stdbw8e.fsf@gnu.org> (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@acm.org> <838stdbw8e.fsf@gnu.org> Message-Id: 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@acm.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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) From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 02:47:54 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 06:47:54 +0000 Received: from localhost ([127.0.0.1]:54141 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjeUE-00011S-GV for submit@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 ) id 1hjeUD-00011E-8J for 36496@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 ) 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 ) 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@gnu.org> From: Eli Zaretskii To: rms@gnu.org In-reply-to: (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@acm.org> <838stdbw8e.fsf@gnu.org> 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@acm.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Richard Stallman > Cc: mattiase@acm.org, 36496@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? From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 05:08:25 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 09:08:25 +0000 Received: from localhost ([127.0.0.1]:54219 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjggC-0004ch-TU for submit@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 ) id 1hjgg8-0004cR-79 for 36496@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 ) 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 ) 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@gnu.org> From: Eli Zaretskii To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= In-reply-to: (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@acm.org> <838stdbw8e.fsf@gnu.org> 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@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Mattias Engdegård > Date: Fri, 5 Jul 2019 16:13:52 +0200 > Cc: 36496@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. From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 07:33:46 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 11:33:46 +0000 Received: from localhost ([127.0.0.1]:54266 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjiws-0001nu-Fr for submit@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 ) id 1hjiwp-0001nf-MU for 36496@debbugs.gnu.org; Sat, 06 Jul 2019 07:33:45 -0400 X-Authenticated-User: mattiase@bredband.net 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@acm.or 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?= Message-Id: 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@gnu.org> To: Eli Zaretskii References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> 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@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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 : >=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= =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= =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-- From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 07:41:41 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 11:41:41 +0000 Received: from localhost ([127.0.0.1]:54272 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjj4X-0001zn-Ed for submit@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 ) id 1hjj4V-0001zb-Of for 36496@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 ) 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 ) 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@gnu.org> From: Eli Zaretskii To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= In-reply-to: (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@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> 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@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Mattias Engdegård > Date: Sat, 6 Jul 2019 13:33:35 +0200 > Cc: 36496@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. From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 07:59:14 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 11:59:14 +0000 Received: from localhost ([127.0.0.1]:54310 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjjLW-0002RQ-75 for submit@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 ) id 1hjjLU-0002RB-8Z for 36496@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@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 To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> Date: Sat, 06 Jul 2019 07:59:03 -0400 In-Reply-To: ("Mattias \=\?utf-8\?Q\?Engdeg\=C3\=A5rd\=22's\?\= message of "Sat, 6 Jul 2019 13:33:35 +0200") Message-ID: <87sgrj4bnc.fsf@gmail.com> 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 , 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Mattias Engdeg=C3=A5rd 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. From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 14:57:06 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 18:57:06 +0000 Received: from localhost ([127.0.0.1]:55901 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjpru-00010T-BQ for submit@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 ) id 1hjprr-000101-AD for 36496@debbugs.gnu.org; Sat, 06 Jul 2019 14:57:04 -0400 X-Authenticated-User: mattiase@bredband.net 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@acm.or 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?= Message-Id: 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@gnu.org> To: Eli Zaretskii , Noam Postavsky References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> <83k1cv8k5z.fsf@gnu.org> 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@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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 : >=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 : >=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= =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= =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-- From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 15:10:52 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 19:10:52 +0000 Received: from localhost ([127.0.0.1]:55906 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjq5D-0001Mc-Mu for submit@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 ) id 1hjq5B-0001MQ-F5 for 36496@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 ) 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 ) 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@gnu.org> From: Eli Zaretskii To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= In-reply-to: (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@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> <83k1cv8k5z.fsf@gnu.org> 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@gmail.com, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Mattias Engdegård > Date: Sat, 6 Jul 2019 20:56:57 +0200 > Cc: 36496@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. From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 15:12:47 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 19:12:47 +0000 Received: from localhost ([127.0.0.1]:55910 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjq73-0001Q3-55 for submit@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 ) id 1hjq71-0001Pm-TA for 36496@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@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 To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> <83k1cv8k5z.fsf@gnu.org> Date: Sat, 06 Jul 2019 15:12:36 -0400 In-Reply-To: ("Mattias \=\?utf-8\?Q\?Engdeg\=C3\=A5rd\=22's\?\= message of "Sat, 6 Jul 2019 20:56:57 +0200") Message-ID: <87bly73rkr.fsf@gmail.com> 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 , 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Mattias Engdeg=C3=A5rd 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. From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 15:46:07 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 19:46:07 +0000 Received: from localhost ([127.0.0.1]:55918 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjqdK-0002LA-OI for submit@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 ) id 1hjqdG-0002KY-UZ for 36496@debbugs.gnu.org; Sat, 06 Jul 2019 15:46:04 -0400 X-Authenticated-User: mattiase@bredband.net 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@acm.or 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?= Message-Id: 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@gnu.org> To: Eli Zaretskii References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> <83k1cv8k5z.fsf@gnu.org> <83zhlr6ksx.fsf@gnu.org> 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 , 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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 : > > 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= =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-- From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 19:56:41 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 23:56:41 +0000 Received: from localhost ([127.0.0.1]:55997 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjuXo-0000GS-RI for submit@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 ) id 1hjuXm-0000GF-Lj for 36496@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 ) 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 ) id 1hjuXe-0004eV-EL; Sat, 06 Jul 2019 19:56:30 -0400 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Mattias =?iso-8859-1?Q?Engdeg=C3=A5rd?= In-Reply-To: (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@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> Message-Id: 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@gnu.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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) From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 19:59:57 2019 Received: (at 36496) by debbugs.gnu.org; 6 Jul 2019 23:59:57 +0000 Received: from localhost ([127.0.0.1]:56001 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjuay-0000Kz-Jy for submit@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 ) id 1hjuaw-0000Kn-SF for 36496@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 ) 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 ) id 1hjuap-0001MR-Qx; Sat, 06 Jul 2019 19:59:48 -0400 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Eli Zaretskii In-Reply-To: <83a7draccd.fsf@gnu.org> (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@acm.org> <838stdbw8e.fsf@gnu.org> <83a7draccd.fsf@gnu.org> Message-Id: 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@acm.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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) From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 20:36:54 2019 Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 00:36:54 +0000 Received: from localhost ([127.0.0.1]:56023 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjvAk-0001EB-FY for submit@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 ) id 1hjvAi-0001Dv-Nq for 36496@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 To: rms@gnu.org, Eli Zaretskii Subject: RE: bug#36496: [PATCH] Describe the rx notation in the lisp manual References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83a7draccd.fsf@gnu.org> In-Reply-To: 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@acm.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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.) From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 06 22:29:33 2019 Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 02:29:33 +0000 Received: from localhost ([127.0.0.1]:56050 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hjwvl-0003nV-2f for submit@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 ) id 1hjwvi-0003nG-OB for 36496@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 ) 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 ) 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@gnu.org> From: Eli Zaretskii To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= In-reply-to: (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@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> <83k1cv8k5z.fsf@gnu.org> <83zhlr6ksx.fsf@gnu.org> 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@gmail.com, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Mattias Engdegård > Date: Sat, 6 Jul 2019 21:45:58 +0200 > Cc: Noam Postavsky , 36496@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. From debbugs-submit-bounces@debbugs.gnu.org Sun Jul 07 06:15:21 2019 Received: (at control) by debbugs.gnu.org; 7 Jul 2019 10:15:21 +0000 Received: from localhost ([127.0.0.1]:56170 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hk4CV-0001ea-8V for submit@debbugs.gnu.org; Sun, 07 Jul 2019 06:15:19 -0400 Received: from mail152c50.megamailservers.eu ([91.136.10.162]:38330 helo=mail50c50.megamailservers.eu) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hk4CS-0001eQ-47 for control@debbugs.gnu.org; Sun, 07 Jul 2019 06:15:17 -0400 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1562494514; bh=M6aHQSbKcqgQM8Fmftrh1+GIM2S+2UoYvIRD7yNgDVY=; h=From:Subject:Date:To:From; b=OEQBoZOvqER7WNHVdzncp2fDzJ0jDNNZuMm1kLgjBmWg3BmB7Q2uAYOuNRrhIx8FD XKEvq1DkMe0eYWl7JPuNjD5IJEdZ8AgR0vzPd3gx1aRqF+s+kKfIJCtJqSPCqKvnFg BVRpfv/qFrIm+Z7H0CcYjwgDU8hHN3Vjw/wlrGp8= Feedback-ID: mattiase@acm.or Received: from [192.168.0.4] ([188.150.171.71]) (authenticated bits=0) by mail50c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x67AFCoh004048 for ; Sun, 7 Jul 2019 10:15:14 +0000 From: =?utf-8?Q?Mattias_Engdeg=C3=A5rd?= Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\)) Subject: control Message-Id: <31EBCCF4-5D4B-40CE-8363-8D8E1F21494D@acm.org> Date: Sun, 7 Jul 2019 12:15:12 +0200 To: control@debbugs.gnu.org X-Mailer: Apple Mail (2.3445.104.11) X-CTCH-RefID: str=0001.0A0B0215.5D21C632.0025, 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=U/y889ju c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=kj9zAlcOel0A:10 a=s5fXwV-Aa2I0pu-rdTkA:9 a=CjuIK1q_8ugA:10 a=pHzHmUro8NiASowvMSCR:22 a=nt3jZW36AmriUCFCBwmW:22 X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) merge 31698 36496 quit From debbugs-submit-bounces@debbugs.gnu.org Sun Jul 07 07:31:13 2019 Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 11:31:13 +0000 Received: from localhost ([127.0.0.1]:56206 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hk5Nx-0006uo-8m for submit@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 ) id 1hk5Nu-0006qz-KZ for 36496@debbugs.gnu.org; Sun, 07 Jul 2019 07:31:11 -0400 X-Authenticated-User: mattiase@bredband.net 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@acm.or 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?= In-Reply-To: <83y31a7f27.fsf@gnu.org> Date: Sun, 7 Jul 2019 13:31:06 +0200 Content-Transfer-Encoding: quoted-printable Message-Id: References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> <83k1cv8k5z.fsf@gnu.org> <83zhlr6ksx.fsf@gnu.org> <83y31a7f27.fsf@gnu.org> To: Eli Zaretskii 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 , Richard Stallman , 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) 7 juli 2019 kl. 04.29 skrev Eli Zaretskii : > Thanks, LGTM. Thanks for reviewing! Pushed to master. 7 juli 2019 kl. 01.56 skrev Richard Stallman : > 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? From debbugs-submit-bounces@debbugs.gnu.org Sun Jul 07 10:33:41 2019 Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 14:33:41 +0000 Received: from localhost ([127.0.0.1]:57277 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hk8EX-0008RL-Er for submit@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 ) id 1hk8EV-0008R5-2o for 36496@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 ) 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 ) 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@gnu.org> From: Eli Zaretskii To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= In-reply-to: (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@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> <83k1cv8k5z.fsf@gnu.org> <83zhlr6ksx.fsf@gnu.org> <83y31a7f27.fsf@gnu.org> 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@gmail.com, rms@gnu.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Mattias Engdegård > Date: Sun, 7 Jul 2019 13:31:06 +0200 > Cc: Noam Postavsky , 36496@debbugs.gnu.org, > Richard Stallman > > 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. From debbugs-submit-bounces@debbugs.gnu.org Sun Jul 07 19:51:33 2019 Received: (at 36496) by debbugs.gnu.org; 7 Jul 2019 23:51:33 +0000 Received: from localhost ([127.0.0.1]:57570 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hkGwP-0005jc-5S for submit@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 ) id 1hkGwN-0005jP-2Y for 36496@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 ) 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 ) id 1hkGwG-0005Ic-6y; Sun, 07 Jul 2019 19:51:24 -0400 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Drew Adams 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@acm.org> <838stdbw8e.fsf@gnu.org> <83a7draccd.fsf@gnu.org> <0458803b-c701-4706-9843-174b7373cf23@default> Message-Id: 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@acm.org, eliz@gnu.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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) From debbugs-submit-bounces@debbugs.gnu.org Sun Jul 07 20:56:56 2019 Received: (at 36496) by debbugs.gnu.org; 8 Jul 2019 00:56:56 +0000 Received: from localhost ([127.0.0.1]:57599 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hkHxg-0007DC-3Z for submit@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 ) id 1hkHxd-0007Cy-Ve for 36496@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 To: rms@gnu.org Subject: RE: bug#36496: [PATCH] Describe the rx notation in the lisp manual References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83a7draccd.fsf@gnu.org> <0458803b-c701-4706-9843-174b7373cf23@default> In-Reply-To: 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@acm.org, eliz@gnu.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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'? From debbugs-submit-bounces@debbugs.gnu.org Mon Jul 08 19:44:30 2019 Received: (at 36496) by debbugs.gnu.org; 8 Jul 2019 23:44:30 +0000 Received: from localhost ([127.0.0.1]:59981 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hkdJ8-00067N-4B for submit@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 ) id 1hkdJ5-000677-Tn for 36496@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 ) 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 ) id 1hkdIk-0006iT-At; Mon, 08 Jul 2019 19:44:06 -0400 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman to: drew.adams@oracle.com, mattiase@acm.org, 36496@debbugs.gnu.org In-Reply-To: (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@acm.org> <838stdbw8e.fsf@gnu.org> <83a7draccd.fsf@gnu.org> <0458803b-c701-4706-9843-174b7373cf23@default> Message-Id: 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@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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) From debbugs-submit-bounces@debbugs.gnu.org Mon Jul 08 19:46:49 2019 Received: (at 36496) by debbugs.gnu.org; 8 Jul 2019 23:46:49 +0000 Received: from localhost ([127.0.0.1]:59985 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hkdLM-0007lU-Ja for submit@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 ) id 1hkdLK-0007fS-Rx for 36496@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 ) 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 ) id 1hkdLB-0007Bx-2K; Mon, 08 Jul 2019 19:46:37 -0400 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Drew Adams 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@acm.org> <838stdbw8e.fsf@gnu.org> <83a7draccd.fsf@gnu.org> <0458803b-c701-4706-9843-174b7373cf23@default> <2a29fbfb-7e94-4022-bbde-42d8b9f90fc8@default> Message-Id: 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@acm.org, eliz@gnu.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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) From debbugs-submit-bounces@debbugs.gnu.org Mon Jul 08 20:19:50 2019 Received: (at 36496) by debbugs.gnu.org; 9 Jul 2019 00:19:50 +0000 Received: from localhost ([127.0.0.1]:60017 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hkdrJ-0000fy-QP for submit@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 ) id 1hkdrH-0000fl-Df for 36496@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: Date: Mon, 8 Jul 2019 17:19:32 -0700 (PDT) From: Drew Adams To: rms@gnu.org Subject: RE: bug#36496: [PATCH] Describe the rx notation in the lisp manual References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83a7draccd.fsf@gnu.org> <0458803b-c701-4706-9843-174b7373cf23@default> <2a29fbfb-7e94-4022-bbde-42d8b9f90fc8@default> In-Reply-To: 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@acm.org, eliz@gnu.org, 36496@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" 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.) From debbugs-submit-bounces@debbugs.gnu.org Tue Jul 16 20:28:13 2019 Received: (at control) by debbugs.gnu.org; 17 Jul 2019 00:28:13 +0000 Received: from localhost ([127.0.0.1]:51367 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hnXnp-00077Q-K4 for submit@debbugs.gnu.org; Tue, 16 Jul 2019 20:28:13 -0400 Received: from mail-io1-f53.google.com ([209.85.166.53]:45918) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hnXnn-00077D-Di for control@debbugs.gnu.org; Tue, 16 Jul 2019 20:28:12 -0400 Received: by mail-io1-f53.google.com with SMTP id g20so42952739ioc.12 for ; Tue, 16 Jul 2019 17:28:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version; bh=YAD8cG844pwRhfuWBF0PO7K02/oVN2snsqm//B9CgNU=; b=dwaO6bYPbwIcH3qd+oWQc9ssiZUxZdq1qZlPXdh0N57tj0cT3cXggPosmZeoIshnNR Ua2ul+OR3YHafqQ90U/Z+ipVjfqW9a/YJ23EKH5863fIHEZotxBdf+0AtLlE63y9CAyz FO2IMBPxpouWC50OfvyeLEkWZBZGB1mB6VBrIGpL5pjyR+LK8ngVH7Ca5eyq3nZmFtm5 op7JIIX82wXEvAr3I+JkERCDw1PGJ5+Np2/HhUt3DoAyNQ6kIMsH3UphlyWb5lAs3TRq L3pvddmSVBQY7aCfAC6asBfG7ygjs2pXCdeiNLtkT/CMaaXk9ebfiyvOCB5Km/B4yAJN L6VQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version; bh=YAD8cG844pwRhfuWBF0PO7K02/oVN2snsqm//B9CgNU=; b=sn4GutXoT4HqHTEskyuPbbXF/MJMvj2wbtoYpo1xEyiB4wOlgubx+IDTCOJ/jp+vEg QT//+JbbhT1RDLT65xsqVAnZQK73yFXpdkGiz4Is6MYjp4W8p+5vcexgR3UX+Ohq3gOi AQEGvGpwTLBmbbPaHSJRYnUhwFbbNyLPKUopkLOAZhvbMwyJb2UgBjQQ6dn6/FOM9N6b wHNy4Jm308otxRMEq9FK0+XSAe5dEntrqmbPPWzf5i5kVyKvcyhLThaAEg4YUWDyO0IP Axm0xvHMON6m85gN7MimVYiHzcq4q1kiB0UZ2Ofj/TJvQh/8CBVl5vZF7TDP7nUOamC/ JRxg== X-Gm-Message-State: APjAAAX+p8Je1e9+X0g5cobEf6rGhSyHVNcBntrrf+W3jQBYjfQxLVWC FVZXuS2QoKHBIp3BfxzJnSvHLf8x X-Google-Smtp-Source: APXvYqxzrEivNXgJCL2vQxhwv93qIgCkE/6olX0dZPq/5Wt4FmnGYosUX1RTzeVGdGeUQZN23O2tAw== X-Received: by 2002:a5e:9747:: with SMTP id h7mr34165227ioq.299.1563323285486; Tue, 16 Jul 2019 17:28:05 -0700 (PDT) Received: from minid (cbl-45-2-119-34.yyz.frontiernetworks.ca. [45.2.119.34]) by smtp.gmail.com with ESMTPSA id e22sm17309363iob.66.2019.07.16.17.28.04 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 16 Jul 2019 17:28:04 -0700 (PDT) From: Noam Postavsky To: control@debbugs.gnu.org Subject: control message for bug #36496 Date: Tue, 16 Jul 2019 20:28:03 -0400 Message-ID: <87h87lzer0.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) # the patch was pushed to master, bug left open for possible further improvements tags 36496 - patch quit From debbugs-submit-bounces@debbugs.gnu.org Mon Apr 25 11:12:47 2022 Received: (at 36496) by debbugs.gnu.org; 25 Apr 2022 15:12:48 +0000 Received: from localhost ([127.0.0.1]:35835 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nj0ON-0003qo-Nn for submit@debbugs.gnu.org; Mon, 25 Apr 2022 11:12:47 -0400 Received: from quimby.gnus.org ([95.216.78.240]:51334) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nj0OL-0003qW-R4 for 36496@debbugs.gnu.org; Mon, 25 Apr 2022 11:12:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnus.org; s=20200322; h=Content-Transfer-Encoding:Content-Type:MIME-Version:Message-ID :In-Reply-To:Date:References:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=1IsCxXZnDn82b1eHzJ6ZGqcbkHhCgxfsueUCAj+zQtE=; b=RvleeUuQevEwDSEG1IdMsjaDU7 iu/fD83dVu3Dz0GQr0KBKPGxEyZ339BiFp+0pduEM9GPkhfgTOFmQh7T6wBuH7SHb+FOJ+vx/t2Ry uOvxEBCEBgL4pNocyN6miCAQH+6kYel+MUZg4tkhPD+5lMW8MOqYzEkP+VkKtixXXxGQ=; Received: from [84.212.220.105] (helo=xo) by quimby.gnus.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nj0OD-0004G5-3v; Mon, 25 Apr 2022 17:12:39 +0200 From: Lars Ingebrigtsen To: Mattias =?utf-8?Q?Engdeg=C3=A5rd?= Subject: Re: bug#36496: [PATCH] Describe the rx notation in the lisp manual References: <0C783D67-9502-408B-B845-5599BD596361@acm.org> <838stdbw8e.fsf@gnu.org> <83r2738r9j.fsf@gnu.org> <83k1cv8k5z.fsf@gnu.org> <83zhlr6ksx.fsf@gnu.org> <83y31a7f27.fsf@gnu.org> X-Now-Playing: Yukihiro Takahashi's _Blue Moon Blue_: "In This Life" Date: Mon, 25 Apr 2022 17:12:35 +0200 In-Reply-To: ("Mattias =?utf-8?Q?Engdeg=C3=A5rd=22's?= message of "Sun, 7 Jul 2019 13:31:06 +0200") Message-ID: <87ilqx19jw.fsf@gnus.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Report: Spam detection software, running on the system "quimby.gnus.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see @@CONTACT_ADDRESS@@ for details. Content preview: Mattias Engdegård writes: > Thanks for reviewing! Pushed to master. The discussion then turned to other matters, but as far as I can tell, the issue was fixed (i.e., Mattias added rx documentation to the manual), so I'm closing this bug report. Content analysis details: (-2.9 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 36496 Cc: Eli Zaretskii , 36496@debbugs.gnu.org, Noam Postavsky , Richard Stallman X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Mattias Engdeg=C3=A5rd writes: > Thanks for reviewing! Pushed to master. The discussion then turned to other matters, but as far as I can tell, the issue was fixed (i.e., Mattias added rx documentation to the manual), so I'm closing this bug report. --=20 (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no From debbugs-submit-bounces@debbugs.gnu.org Mon Apr 25 11:12:51 2022 Received: (at control) by debbugs.gnu.org; 25 Apr 2022 15:12:51 +0000 Received: from localhost ([127.0.0.1]:35838 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nj0OQ-0003r4-Uy for submit@debbugs.gnu.org; Mon, 25 Apr 2022 11:12:51 -0400 Received: from quimby.gnus.org ([95.216.78.240]:51352) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nj0OP-0003qg-QA for control@debbugs.gnu.org; Mon, 25 Apr 2022 11:12:50 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnus.org; s=20200322; h=Subject:From:To:Message-Id:Date:Sender:Reply-To:Cc: MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=H/g6rIrjQgDFQm80rh5dYma93UCmQKCyT7Zjo86oN2A=; b=bBqC6Lk3kYDfk0tmHd0pyXq8YN EkzKaUtkTXL0jnzgocLv01nlIolXEk2YEJAVbCv3Z9HmM85TGC63zpM4o+Y7AiVEoNoxsIXeK6Lde 3PVI4IBz/tKrYsEs/mzE9eXSuSpo4d2h0i0xbsRsHxQQQkYnnGzvXGX4owuB2hSsdRLQ=; Received: from [84.212.220.105] (helo=xo) by quimby.gnus.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nj0OI-0004GF-DY for control@debbugs.gnu.org; Mon, 25 Apr 2022 17:12:44 +0200 Date: Mon, 25 Apr 2022 17:12:41 +0200 Message-Id: <87h76h19jq.fsf@gnus.org> To: control@debbugs.gnu.org From: Lars Ingebrigtsen Subject: control message for bug #36496 X-Spam-Report: Spam detection software, running on the system "quimby.gnus.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see @@CONTACT_ADDRESS@@ for details. Content preview: close 36496 quit Content analysis details: (-2.9 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) close 36496 quit From unknown Sat Jun 14 04:56:40 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Tue, 24 May 2022 11:24:10 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator