xref: /vim-8.2.3635/runtime/syntax/raku.vim (revision 11e3c5ba)
1*11e3c5baSBram Moolenaar" Vim syntax file
2*11e3c5baSBram Moolenaar" Language:      Raku
3*11e3c5baSBram Moolenaar" Maintainer:    vim-perl <[email protected]>
4*11e3c5baSBram Moolenaar" Homepage:      https://github.com/Raku/vim-raku
5*11e3c5baSBram Moolenaar" Bugs/requests: https://github.com/Raku/vim-raku/issues
6*11e3c5baSBram Moolenaar" Last Change:   2021-04-16
7*11e3c5baSBram Moolenaar
8*11e3c5baSBram Moolenaar" Contributors:  Luke Palmer <[email protected]>
9*11e3c5baSBram Moolenaar"                Moritz Lenz <[email protected]>
10*11e3c5baSBram Moolenaar"                Hinrik Örn Sigurðsson <[email protected]>
11*11e3c5baSBram Moolenaar"
12*11e3c5baSBram Moolenaar" This is a big undertaking.
13*11e3c5baSBram Moolenaar"
14*11e3c5baSBram Moolenaar" The ftdetect/raku.vim file in this repository takes care of setting the
15*11e3c5baSBram Moolenaar" right filetype for Raku files. To set it explicitly you can also add this
16*11e3c5baSBram Moolenaar" line near the bottom of your source file:
17*11e3c5baSBram Moolenaar"   # vim: filetype=raku
18*11e3c5baSBram Moolenaar
19*11e3c5baSBram Moolenaar" TODO:
20*11e3c5baSBram Moolenaar"   * Go over the list of keywords/types to see what's deprecated/missing
21*11e3c5baSBram Moolenaar"   * Add more support for folding (:help syn-fold)
22*11e3c5baSBram Moolenaar"
23*11e3c5baSBram Moolenaar" If you want to have Pir code inside Q:PIR// strings highlighted, do:
24*11e3c5baSBram Moolenaar"   let raku_embedded_pir=1
25*11e3c5baSBram Moolenaar"
26*11e3c5baSBram Moolenaar" The above requires pir.vim, which you can find in Parrot's repository:
27*11e3c5baSBram Moolenaar" https://github.com/parrot/parrot/tree/master/editor
28*11e3c5baSBram Moolenaar"
29*11e3c5baSBram Moolenaar" To highlight Perl 5 regexes (m:P5//):
30*11e3c5baSBram Moolenaar"   let raku_perl5_regexes=1
31*11e3c5baSBram Moolenaar"
32*11e3c5baSBram Moolenaar" To enable folding:
33*11e3c5baSBram Moolenaar"   let raku_fold=1
34*11e3c5baSBram Moolenaar
35*11e3c5baSBram Moolenaarif version < 704 | throw "raku.vim uses regex syntax which Vim <7.4 doesn't support. Try 'make fix_old_vim' in the vim-perl repository." | endif
36*11e3c5baSBram Moolenaar
37*11e3c5baSBram Moolenaar" For version 5.x: Clear all syntax items
38*11e3c5baSBram Moolenaar" For version 6.x: Quit when a syntax file was already loaded
39*11e3c5baSBram Moolenaarif version < 600
40*11e3c5baSBram Moolenaar    syntax clear
41*11e3c5baSBram Moolenaarelseif exists("b:current_syntax")
42*11e3c5baSBram Moolenaar    finish
43*11e3c5baSBram Moolenaarendif
44*11e3c5baSBram Moolenaarlet s:keepcpo= &cpo
45*11e3c5baSBram Moolenaarset cpo&vim
46*11e3c5baSBram Moolenaar
47*11e3c5baSBram Moolenaar" Patterns which will be interpolated by the preprocessor (tools/preproc.pl):
48*11e3c5baSBram Moolenaar"
49*11e3c5baSBram Moolenaar" @@IDENT_NONDIGIT@@     "[A-Za-z_\xC0-\xFF]"
50*11e3c5baSBram Moolenaar" @@IDENT_CHAR@@         "[A-Za-z_\xC0-\xFF0-9]"
51*11e3c5baSBram Moolenaar" @@IDENTIFIER@@         "\%(@@IDENT_NONDIGIT@@\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\@=\)*\)"
52*11e3c5baSBram Moolenaar" @@IDENTIFIER_START@@   "@@IDENT_CHAR@@\@1<!\%(@@IDENT_NONDIGIT@@[-']\)\@2<!"
53*11e3c5baSBram Moolenaar" @@IDENTIFIER_END@@     "\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\)\@!"
54*11e3c5baSBram Moolenaar" @@METAOP@@             #\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+#
55*11e3c5baSBram Moolenaar" @@ADVERBS@@            "\%(\_s*:!\?@@IDENTIFIER@@\%(([^)]*)\)\?\)*"
56*11e3c5baSBram Moolenaar"
57*11e3c5baSBram Moolenaar" Same but escaped, for use in string eval
58*11e3c5baSBram Moolenaar" @@IDENT_NONDIGIT_Q@@   "[A-Za-z_\\xC0-\\xFF]"
59*11e3c5baSBram Moolenaar" @@IDENT_CHAR_Q@@       "[A-Za-z_\\xC0-\\xFF0-9]"
60*11e3c5baSBram Moolenaar" @@IDENTIFIER_Q@@       "\\%(@@IDENT_NONDIGIT_Q@@\\%(@@IDENT_CHAR_Q@@\\|[-']@@IDENT_NONDIGIT_Q@@\\@=\\)*\\)"
61*11e3c5baSBram Moolenaar" @@IDENTIFIER_START_Q@@ "@@IDENT_CHAR_Q@@\\@1<!\\%(@@IDENT_NONDIGIT_Q@@[-']\\)\\@2<!"
62*11e3c5baSBram Moolenaar" @@IDENTIFIER_END_Q@@   "\\%(@@IDENT_CHAR_Q@@\\|[-']@@IDENT_NONDIGIT_Q@@\\)\\@!"
63*11e3c5baSBram Moolenaar
64*11e3c5baSBram Moolenaar" Identifiers (subroutines, methods, constants, classes, roles, etc)
65*11e3c5baSBram Moolenaarsyn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
66*11e3c5baSBram Moolenaar
67*11e3c5baSBram Moolenaarlet s:keywords = {
68*11e3c5baSBram Moolenaar \ "rakuInclude": [
69*11e3c5baSBram Moolenaar \   "use require import unit",
70*11e3c5baSBram Moolenaar \ ],
71*11e3c5baSBram Moolenaar \ "rakuConditional": [
72*11e3c5baSBram Moolenaar \   "if else elsif unless with orwith without once",
73*11e3c5baSBram Moolenaar \ ],
74*11e3c5baSBram Moolenaar \ "rakuVarStorage": [
75*11e3c5baSBram Moolenaar \   "let my our state temp has constant",
76*11e3c5baSBram Moolenaar \ ],
77*11e3c5baSBram Moolenaar \ "rakuRepeat": [
78*11e3c5baSBram Moolenaar \   "for loop repeat while until gather given",
79*11e3c5baSBram Moolenaar \   "supply react race hyper lazy quietly",
80*11e3c5baSBram Moolenaar \ ],
81*11e3c5baSBram Moolenaar \ "rakuFlowControl": [
82*11e3c5baSBram Moolenaar \   "take take-rw do when next last redo return return-rw",
83*11e3c5baSBram Moolenaar \   "start default exit make continue break goto leave",
84*11e3c5baSBram Moolenaar \   "proceed succeed whenever emit done",
85*11e3c5baSBram Moolenaar \ ],
86*11e3c5baSBram Moolenaar \ "rakuClosureTrait": [
87*11e3c5baSBram Moolenaar \   "BEGIN CHECK INIT FIRST ENTER LEAVE KEEP",
88*11e3c5baSBram Moolenaar \   "UNDO NEXT LAST PRE POST END CATCH CONTROL",
89*11e3c5baSBram Moolenaar \   "DOC QUIT CLOSE COMPOSE",
90*11e3c5baSBram Moolenaar \ ],
91*11e3c5baSBram Moolenaar \ "rakuException": [
92*11e3c5baSBram Moolenaar \   "die fail try warn",
93*11e3c5baSBram Moolenaar \ ],
94*11e3c5baSBram Moolenaar \ "rakuPragma": [
95*11e3c5baSBram Moolenaar \   "MONKEY-GUTS MONKEY-SEE-NO-EVAL MONKEY-TYPING MONKEY",
96*11e3c5baSBram Moolenaar \   "experimental fatal isms lib newline nqp precompilation",
97*11e3c5baSBram Moolenaar \   "soft strict trace variables worries",
98*11e3c5baSBram Moolenaar \ ],
99*11e3c5baSBram Moolenaar \ "rakuOperator": [
100*11e3c5baSBram Moolenaar \   "div xx x mod also leg cmp before after eq ne le lt not",
101*11e3c5baSBram Moolenaar \   "gt ge eqv ff fff and andthen or xor orelse lcm gcd o",
102*11e3c5baSBram Moolenaar \   "unicmp notandthen minmax",
103*11e3c5baSBram Moolenaar \ ],
104*11e3c5baSBram Moolenaar \ "rakuType": [
105*11e3c5baSBram Moolenaar \   "int int1 int2 int4 int8 int16 int32 int64",
106*11e3c5baSBram Moolenaar \   "rat rat1 rat2 rat4 rat8 rat16 rat32 rat64",
107*11e3c5baSBram Moolenaar \   "buf buf1 buf2 buf4 buf8 buf16 buf32 buf64",
108*11e3c5baSBram Moolenaar \   "blob blob1 blob2 blob4 blob8 blob16 blob32 blob64",
109*11e3c5baSBram Moolenaar \   "uint uint1 uint2 uint4 uint8 uint16 uint32 bit bool",
110*11e3c5baSBram Moolenaar \   "uint64 utf8 utf16 utf32 bag set mix complex",
111*11e3c5baSBram Moolenaar \   "num num32 num64 long longlong Pointer size_t str void",
112*11e3c5baSBram Moolenaar \   "ulong ulonglong ssize_t atomicint",
113*11e3c5baSBram Moolenaar \ ],
114*11e3c5baSBram Moolenaar\ }
115*11e3c5baSBram Moolenaar
116*11e3c5baSBram Moolenaar" These can be immediately followed by parentheses
117*11e3c5baSBram Moolenaarlet s:types = [
118*11e3c5baSBram Moolenaar \ "Object Any Cool Junction Whatever Capture Match",
119*11e3c5baSBram Moolenaar \ "Signature Proxy Matcher Package Module Class",
120*11e3c5baSBram Moolenaar \ "Grammar Scalar Array Hash KeyHash KeySet KeyBag",
121*11e3c5baSBram Moolenaar \ "Pair List Seq Range Set Bag Map Mapping Void Undef",
122*11e3c5baSBram Moolenaar \ "Failure Exception Code Block Routine Sub Macro",
123*11e3c5baSBram Moolenaar \ "Method Submethod Regex Str Blob Char Byte Parcel",
124*11e3c5baSBram Moolenaar \ "Codepoint Grapheme StrPos StrLen Version Num",
125*11e3c5baSBram Moolenaar \ "Complex Bit True False Order Same Less More",
126*11e3c5baSBram Moolenaar \ "Increasing Decreasing Ordered Callable AnyChar",
127*11e3c5baSBram Moolenaar \ "Positional Associative Ordering KeyExtractor",
128*11e3c5baSBram Moolenaar \ "Comparator OrderingPair IO KitchenSink Role",
129*11e3c5baSBram Moolenaar \ "Int Rat Buf UInt Abstraction Numeric Real",
130*11e3c5baSBram Moolenaar \ "Nil Mu SeekFromBeginning SeekFromEnd SeekFromCurrent",
131*11e3c5baSBram Moolenaar\ ]
132*11e3c5baSBram Moolenaar
133*11e3c5baSBram Moolenaar" We explicitly enumerate the alphanumeric infix operators allowed after [RSXZ]
134*11e3c5baSBram Moolenaar" to avoid matching package names that start with those letters.
135*11e3c5baSBram Moolenaarlet s:alpha_metaops = [
136*11e3c5baSBram Moolenaar \ "div mod gcd lcm xx x does but cmp leg eq ne gt ge lt le before after eqv",
137*11e3c5baSBram Moolenaar \ "min max not so andthen and or orelse unicmp coll minmax",
138*11e3c5baSBram Moolenaar\ ]
139*11e3c5baSBram Moolenaarlet s:words_space = join(s:alpha_metaops, " ")
140*11e3c5baSBram Moolenaarlet s:temp = split(s:words_space)
141*11e3c5baSBram Moolenaarlet s:alpha_metaops_or = join(s:temp, "\\|")
142*11e3c5baSBram Moolenaar
143*11e3c5baSBram Moolenaar" We don't use "syn keyword" here because that always has higher priority
144*11e3c5baSBram Moolenaar" than matches/regions, which would prevent these words from matching as
145*11e3c5baSBram Moolenaar" autoquoted strings before "=>".
146*11e3c5baSBram Moolenaarsyn match rakuKeywordStart display "\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!\)\@=[A-Za-z_\xC0-\xFF0-9]\@1<!\%([A-Za-z_\xC0-\xFF][-']\)\@2<!"
147*11e3c5baSBram Moolenaar    \ nextgroup=rakuAttention,rakuVariable,rakuInclude,rakuConditional,rakuVarStorage,rakuRepeat,rakuFlowControl,rakuClosureTrait,rakuException,rakuNumber,rakuPragma,rakuType,rakuOperator,rakuIdentifier
148*11e3c5baSBram Moolenaar
149*11e3c5baSBram Moolenaarfor [s:group, s:words_list] in items(s:keywords)
150*11e3c5baSBram Moolenaar    let s:words_space = join(s:words_list, " ")
151*11e3c5baSBram Moolenaar    let s:temp = split(s:words_space)
152*11e3c5baSBram Moolenaar    let s:words = join(s:temp, "\\|")
153*11e3c5baSBram Moolenaar    exec "syn match ". s:group ." display \"[.^]\\@1<!\\%(". s:words . "\\)(\\@!\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained"
154*11e3c5baSBram Moolenaarendfor
155*11e3c5baSBram Moolenaar
156*11e3c5baSBram Moolenaarlet s:words_space = join(s:types, " ")
157*11e3c5baSBram Moolenaarlet s:temp = split(s:words_space)
158*11e3c5baSBram Moolenaarlet s:words = join(s:temp, "\\|")
159*11e3c5baSBram Moolenaarexec "syn match rakuType display \"\\%(". s:words . "\\)\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained"
160*11e3c5baSBram Moolenaarunlet s:group s:words_list s:keywords s:types s:words_space s:temp s:words
161*11e3c5baSBram Moolenaar
162*11e3c5baSBram Moolenaarsyn match rakuPreDeclare display "[.^]\@1<!\<\%(multi\|proto\|only\)\>" nextgroup=rakuDeclare,rakuIdentifier skipwhite skipempty
163*11e3c5baSBram Moolenaarsyn match rakuDeclare display "[.^]\@1<!\<\%(macro\|sub\|submethod\|method\|module\|class\|role\|package\|enum\|grammar\|slang\|subset\)\>" nextgroup=rakuIdentifier skipwhite skipempty
164*11e3c5baSBram Moolenaarsyn match rakuDeclareRegex display "[.^]\@1<!\<\%(regex\|rule\|token\)\>" nextgroup=rakuRegexName skipwhite skipempty
165*11e3c5baSBram Moolenaar
166*11e3c5baSBram Moolenaarsyn match rakuTypeConstraint  display "\%([.^]\|^\s*\)\@<!\a\@=\%(does\|as\|but\|trusts\|of\|returns\|handles\|where\|augment\|supersede\)\>"
167*11e3c5baSBram Moolenaarsyn match rakuTypeConstraint  display "\%([.^]\|^\s*\)\@<![A-Za-z_\xC0-\xFF0-9]\@1<!\%([A-Za-z_\xC0-\xFF][-']\)\@2<!is\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuProperty
168*11e3c5baSBram Moolenaarsyn match rakuProperty        display "\a\@=\%(signature\|context\|also\|shape\|prec\|irs\|ofs\|ors\|export\|deep\|binary\|unary\|reparsed\|rw\|parsed\|cached\|readonly\|defequiv\|will\|ref\|copy\|inline\|tighter\|looser\|equiv\|assoc\|required\|DEPRECATED\|raw\|repr\|dynamic\|hidden-from-backtrace\|nodal\|pure\)" contained
169*11e3c5baSBram Moolenaar
170*11e3c5baSBram Moolenaar" packages, must come after all the keywords
171*11e3c5baSBram Moolenaarsyn match rakuIdentifier display "\%(::\)\@2<=\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)*"
172*11e3c5baSBram Moolenaarsyn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(::\)\@="
173*11e3c5baSBram Moolenaar
174*11e3c5baSBram Moolenaar" The sigil in ::*Package
175*11e3c5baSBram Moolenaarsyn match rakuPackageTwigil display "\%(::\)\@2<=\*"
176*11e3c5baSBram Moolenaar
177*11e3c5baSBram Moolenaar" some standard packages
178*11e3c5baSBram Moolenaarsyn match rakuType display "\%(::\)\@2<!\%(SeekType\%(::SeekFromBeginning\|::SeekFromCurrent\|::SeekFromEnd\)\|Order\%(::Same\|::More\|::Less\)\?\|Bool\%(::True\|::False\)\?\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!"
179*11e3c5baSBram Moolenaar
180*11e3c5baSBram Moolenaar" Don't put a "\+" at the end of the character class. That makes it so
181*11e3c5baSBram Moolenaar" greedy that the "%" " in "+%foo" won't be allowed to match as a sigil,
182*11e3c5baSBram Moolenaar" among other things
183*11e3c5baSBram Moolenaarsyn match rakuOperator display "[-+/*~?|=^!%&,<>».;\\∈∉∋∌∩∪≼≽⊂⊃⊄⊅⊆⊇⊈⊉⊍⊎⊖∅∘]"
184*11e3c5baSBram Moolenaarsyn match rakuOperator display "\%(:\@1<!::\@2!\|::=\|\.::\)"
185*11e3c5baSBram Moolenaar" these require whitespace on the left side
186*11e3c5baSBram Moolenaarsyn match rakuOperator display "\%(\s\|^\)\@1<=\%(xx=\)"
187*11e3c5baSBram Moolenaar" index overloading
188*11e3c5baSBram Moolenaarsyn match rakuOperator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)"
189*11e3c5baSBram Moolenaar
190*11e3c5baSBram Moolenaar" Reduce metaoperators like [+]
191*11e3c5baSBram Moolenaarsyn match rakuReduceOp display "\%(^\|\s\|(\)\@1<=!*\%([RSXZ\[]\)*[&RSXZ]\?\[\+(\?\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+)\?]\+"
192*11e3c5baSBram Moolenaarsyn match rakuSetOp    display "R\?(\%([-^.+|&]\|[<>][=+]\?\|cont\|elem\))"
193*11e3c5baSBram Moolenaar
194*11e3c5baSBram Moolenaar" Reverse, cross, and zip metaoperators
195*11e3c5baSBram Moolenaarexec "syn match rakuRSXZOp display \"[RSXZ]:\\@!\\%(\\a\\@=\\%(". s:alpha_metaops_or . "\\)\\>\\|[[:alnum:]]\\@!\\%([.,]\\|[^[,.[:alnum:][:space:]]\\)\\+\\|\\s\\@=\\|$\\)\""
196*11e3c5baSBram Moolenaar
197*11e3c5baSBram Moolenaarsyn match rakuBlockLabel display "^\s*\zs\h\w*\s*::\@!\_s\@="
198*11e3c5baSBram Moolenaar
199*11e3c5baSBram Moolenaarsyn match rakuNumber     display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?Inf\|NaN\)"
200*11e3c5baSBram Moolenaarsyn match rakuNumber     display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?\%(\%(\d\|__\@!\)*[._]\@1<!\.\)\?_\@!\%(\d\|_\)\+_\@1<!\%([eE]-\?_\@!\%(\d\|_\)\+\)\?i\?"
201*11e3c5baSBram Moolenaarsyn match rakuNumber     display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?0[obxd]\@="  nextgroup=rakuOctBase,rakuBinBase,rakuHexBase,rakuDecBase
202*11e3c5baSBram Moolenaarsyn match rakuOctBase    display "o" contained nextgroup=rakuOctNumber
203*11e3c5baSBram Moolenaarsyn match rakuBinBase    display "b" contained nextgroup=rakuBinNumber
204*11e3c5baSBram Moolenaarsyn match rakuHexBase    display "x" contained nextgroup=rakuHexNumber
205*11e3c5baSBram Moolenaarsyn match rakuDecBase    display "d" contained nextgroup=rakuDecNumber
206*11e3c5baSBram Moolenaarsyn match rakuOctNumber  display "[0-7][0-7_]*" contained
207*11e3c5baSBram Moolenaarsyn match rakuBinNumber  display "[01][01_]*" contained
208*11e3c5baSBram Moolenaarsyn match rakuHexNumber  display "\x[[:xdigit:]_]*" contained
209*11e3c5baSBram Moolenaarsyn match rakuDecNumber  display "\d[[:digit:]_]*" contained
210*11e3c5baSBram Moolenaar
211*11e3c5baSBram Moolenaarsyn match rakuVersion    display "\<v\d\+\%(\.\%(\*\|\d\+\)\)*+\?"
212*11e3c5baSBram Moolenaar
213*11e3c5baSBram Moolenaar" Contextualizers
214*11e3c5baSBram Moolenaarsyn match rakuContext display "\<\%(item\|list\|slice\|hash\)\>"
215*11e3c5baSBram Moolenaarsyn match rakuContext display "\%(\$\|@\|%\|&\)(\@="
216*11e3c5baSBram Moolenaar
217*11e3c5baSBram Moolenaar" Quoting
218*11e3c5baSBram Moolenaar
219*11e3c5baSBram Moolenaar" one cluster for every quote adverb
220*11e3c5baSBram Moolenaarsyn cluster rakuInterp_scalar
221*11e3c5baSBram Moolenaar    \ add=rakuInterpScalar
222*11e3c5baSBram Moolenaar
223*11e3c5baSBram Moolenaarsyn cluster rakuInterp_array
224*11e3c5baSBram Moolenaar    \ add=rakuInterpArray
225*11e3c5baSBram Moolenaar
226*11e3c5baSBram Moolenaarsyn cluster rakuInterp_hash
227*11e3c5baSBram Moolenaar    \ add=rakuInterpHash
228*11e3c5baSBram Moolenaar
229*11e3c5baSBram Moolenaarsyn cluster rakuInterp_function
230*11e3c5baSBram Moolenaar    \ add=rakuInterpFunction
231*11e3c5baSBram Moolenaar
232*11e3c5baSBram Moolenaarsyn cluster rakuInterp_closure
233*11e3c5baSBram Moolenaar    \ add=rakuInterpClosure
234*11e3c5baSBram Moolenaar
235*11e3c5baSBram Moolenaarsyn cluster rakuInterp_q
236*11e3c5baSBram Moolenaar    \ add=rakuEscQQ
237*11e3c5baSBram Moolenaar    \ add=rakuEscBackSlash
238*11e3c5baSBram Moolenaar
239*11e3c5baSBram Moolenaarsyn cluster rakuInterp_backslash
240*11e3c5baSBram Moolenaar    \ add=@rakuInterp_q
241*11e3c5baSBram Moolenaar    \ add=rakuEscape
242*11e3c5baSBram Moolenaar    \ add=rakuEscOpenCurly
243*11e3c5baSBram Moolenaar    \ add=rakuEscCodePoint
244*11e3c5baSBram Moolenaar    \ add=rakuEscHex
245*11e3c5baSBram Moolenaar    \ add=rakuEscOct
246*11e3c5baSBram Moolenaar    \ add=rakuEscOctOld
247*11e3c5baSBram Moolenaar    \ add=rakuEscNull
248*11e3c5baSBram Moolenaar
249*11e3c5baSBram Moolenaarsyn cluster rakuInterp_qq
250*11e3c5baSBram Moolenaar    \ add=@rakuInterp_scalar
251*11e3c5baSBram Moolenaar    \ add=@rakuInterp_array
252*11e3c5baSBram Moolenaar    \ add=@rakuInterp_hash
253*11e3c5baSBram Moolenaar    \ add=@rakuInterp_function
254*11e3c5baSBram Moolenaar    \ add=@rakuInterp_closure
255*11e3c5baSBram Moolenaar    \ add=@rakuInterp_backslash
256*11e3c5baSBram Moolenaar    \ add=rakuMatchVarSigil
257*11e3c5baSBram Moolenaar
258*11e3c5baSBram Moolenaarsyn region rakuInterpScalar
259*11e3c5baSBram Moolenaar    \ start="\ze\z(\$\%(\%(\%(\d\+\|!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
260*11e3c5baSBram Moolenaar    \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\|\%(\d\+\|!\|/\|¢\)\)\)"
261*11e3c5baSBram Moolenaar    \ end="\z1\zs"
262*11e3c5baSBram Moolenaar    \ contained keepend
263*11e3c5baSBram Moolenaar    \ contains=TOP
264*11e3c5baSBram Moolenaar
265*11e3c5baSBram Moolenaarsyn region rakuInterpScalar
266*11e3c5baSBram Moolenaar    \ matchgroup=rakuContext
267*11e3c5baSBram Moolenaar    \ start="\$\ze()\@!"
268*11e3c5baSBram Moolenaar    \ skip="([^)]*)"
269*11e3c5baSBram Moolenaar    \ end=")\zs"
270*11e3c5baSBram Moolenaar    \ contained
271*11e3c5baSBram Moolenaar    \ contains=TOP
272*11e3c5baSBram Moolenaar
273*11e3c5baSBram Moolenaarsyn region rakuInterpArray
274*11e3c5baSBram Moolenaar    \ start="\ze\z(@\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
275*11e3c5baSBram Moolenaar    \ end="\z1\zs"
276*11e3c5baSBram Moolenaar    \ contained keepend
277*11e3c5baSBram Moolenaar    \ contains=TOP
278*11e3c5baSBram Moolenaar
279*11e3c5baSBram Moolenaarsyn region rakuInterpArray
280*11e3c5baSBram Moolenaar    \ matchgroup=rakuContext
281*11e3c5baSBram Moolenaar    \ start="@\ze()\@!"
282*11e3c5baSBram Moolenaar    \ skip="([^)]*)"
283*11e3c5baSBram Moolenaar    \ end=")\zs"
284*11e3c5baSBram Moolenaar    \ contained
285*11e3c5baSBram Moolenaar    \ contains=TOP
286*11e3c5baSBram Moolenaar
287*11e3c5baSBram Moolenaarsyn region rakuInterpHash
288*11e3c5baSBram Moolenaar    \ start="\ze\z(%\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
289*11e3c5baSBram Moolenaar    \ end="\z1\zs"
290*11e3c5baSBram Moolenaar    \ contained keepend
291*11e3c5baSBram Moolenaar    \ contains=TOP
292*11e3c5baSBram Moolenaar
293*11e3c5baSBram Moolenaarsyn region rakuInterpHash
294*11e3c5baSBram Moolenaar    \ matchgroup=rakuContext
295*11e3c5baSBram Moolenaar    \ start="%\ze()\@!"
296*11e3c5baSBram Moolenaar    \ skip="([^)]*)"
297*11e3c5baSBram Moolenaar    \ end=")\zs"
298*11e3c5baSBram Moolenaar    \ contained
299*11e3c5baSBram Moolenaar    \ contains=TOP
300*11e3c5baSBram Moolenaar
301*11e3c5baSBram Moolenaarsyn region rakuInterpFunction
302*11e3c5baSBram Moolenaar    \ start="\ze\z(&\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
303*11e3c5baSBram Moolenaar    \ end="\z1\zs"
304*11e3c5baSBram Moolenaar    \ contained keepend
305*11e3c5baSBram Moolenaar    \ contains=TOP
306*11e3c5baSBram Moolenaar
307*11e3c5baSBram Moolenaarsyn region rakuInterpFunction
308*11e3c5baSBram Moolenaar    \ matchgroup=rakuContext
309*11e3c5baSBram Moolenaar    \ start="&\ze()\@!"
310*11e3c5baSBram Moolenaar    \ skip="([^)]*)"
311*11e3c5baSBram Moolenaar    \ end=")\zs"
312*11e3c5baSBram Moolenaar    \ contained
313*11e3c5baSBram Moolenaar    \ contains=TOP
314*11e3c5baSBram Moolenaar
315*11e3c5baSBram Moolenaarsyn region rakuInterpClosure
316*11e3c5baSBram Moolenaar    \ start="\\\@1<!{}\@!"
317*11e3c5baSBram Moolenaar    \ skip="{[^}]*}"
318*11e3c5baSBram Moolenaar    \ end="}"
319*11e3c5baSBram Moolenaar    \ contained keepend
320*11e3c5baSBram Moolenaar    \ contains=TOP
321*11e3c5baSBram Moolenaar
322*11e3c5baSBram Moolenaar" generic escape
323*11e3c5baSBram Moolenaarsyn match rakuEscape          display "\\\S" contained
324*11e3c5baSBram Moolenaar
325*11e3c5baSBram Moolenaar" escaped closing delimiters
326*11e3c5baSBram Moolenaarsyn match rakuEscQuote        display "\\'" contained
327*11e3c5baSBram Moolenaarsyn match rakuEscDoubleQuote  display "\\\"" contained
328*11e3c5baSBram Moolenaarsyn match rakuEscCloseAngle   display "\\>" contained
329*11e3c5baSBram Moolenaarsyn match rakuEscCloseFrench  display "\\»" contained
330*11e3c5baSBram Moolenaarsyn match rakuEscBackTick     display "\\`" contained
331*11e3c5baSBram Moolenaarsyn match rakuEscForwardSlash display "\\/" contained
332*11e3c5baSBram Moolenaarsyn match rakuEscVerticalBar  display "\\|" contained
333*11e3c5baSBram Moolenaarsyn match rakuEscExclamation  display "\\!" contained
334*11e3c5baSBram Moolenaarsyn match rakuEscComma        display "\\," contained
335*11e3c5baSBram Moolenaarsyn match rakuEscDollar       display "\\\$" contained
336*11e3c5baSBram Moolenaarsyn match rakuEscCloseCurly   display "\\}" contained
337*11e3c5baSBram Moolenaarsyn match rakuEscCloseBracket display "\\\]" contained
338*11e3c5baSBram Moolenaar
339*11e3c5baSBram Moolenaar" matches :key, :!key, :$var, :key<var>, etc
340*11e3c5baSBram Moolenaar" Since we don't know in advance how the adverb ends, we use a trick.
341*11e3c5baSBram Moolenaar" Consume nothing with the start pattern (\ze at the beginning),
342*11e3c5baSBram Moolenaar" while capturing the whole adverb into \z1 and then putting it before
343*11e3c5baSBram Moolenaar" the match start (\zs) of the end pattern.
344*11e3c5baSBram Moolenaarsyn region rakuAdverb
345*11e3c5baSBram Moolenaar    \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)"
346*11e3c5baSBram Moolenaar    \ start="\ze\z(:!\?[@$%]\$*\%(::\|\%(\$\@1<=\d\+\|!\|/\|¢\)\|\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\)\|\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\)"
347*11e3c5baSBram Moolenaar    \ end="\z1\zs"
348*11e3c5baSBram Moolenaar    \ contained keepend
349*11e3c5baSBram Moolenaar    \ contains=TOP
350*11e3c5baSBram Moolenaar
351*11e3c5baSBram Moolenaar" <words>
352*11e3c5baSBram Moolenaar" Distinguishing this from the "less than" operator is tricky. For now,
353*11e3c5baSBram Moolenaar" it matches if any of the following is true:
354*11e3c5baSBram Moolenaar"
355*11e3c5baSBram Moolenaar" * There is whitespace missing on either side of the "<", since
356*11e3c5baSBram Moolenaar"   people tend to put spaces around "less than". We make an exception
357*11e3c5baSBram Moolenaar"   for " = < ... >" assignments though.
358*11e3c5baSBram Moolenaar" * It comes after "enum", "for", "any", "all", or "none"
359*11e3c5baSBram Moolenaar" * It's the first or last thing on a line (ignoring whitespace)
360*11e3c5baSBram Moolenaar" * It's preceded by "(\s*" or "=\s\+"
361*11e3c5baSBram Moolenaar" * It's empty and terminated on the same line (e.g. <> and < >)
362*11e3c5baSBram Moolenaar"
363*11e3c5baSBram Moolenaar" It never matches when:
364*11e3c5baSBram Moolenaar"
365*11e3c5baSBram Moolenaar" * Preceded by [<+~=!] (e.g. <<foo>>, =<$foo>, * !< 3)
366*11e3c5baSBram Moolenaar" * Followed by [-=] (e.g. <--, <=, <==, <->)
367*11e3c5baSBram Moolenaarsyn region rakuStringAngle
368*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
369*11e3c5baSBram Moolenaar    \ start="\%(\<\%(enum\|for\|any\|all\|none\)\>\s*(\?\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
370*11e3c5baSBram Moolenaar    \ start="\%(\s\|[<+~=!]\)\@<!<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
371*11e3c5baSBram Moolenaar    \ start="[<+~=!]\@1<!<\%(\s\|<\|=>\|\%([=-]\{1,2}>\|[=-]\{1,2}\)\)\@!"
372*11e3c5baSBram Moolenaar    \ start="\%(^\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
373*11e3c5baSBram Moolenaar    \ start="[<+~=!]\@1<!<\%(\s*$\)\@="
374*11e3c5baSBram Moolenaar    \ start="\%((\s*\|=\s\+\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
375*11e3c5baSBram Moolenaar    \ start="<\%(\s*>\)\@="
376*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\>"
377*11e3c5baSBram Moolenaar    \ end=">"
378*11e3c5baSBram Moolenaar    \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle
379*11e3c5baSBram Moolenaar
380*11e3c5baSBram Moolenaarsyn region rakuStringAngleFixed
381*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
382*11e3c5baSBram Moolenaar    \ start="<"
383*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\>"
384*11e3c5baSBram Moolenaar    \ end=">"
385*11e3c5baSBram Moolenaar    \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle
386*11e3c5baSBram Moolenaar    \ contained
387*11e3c5baSBram Moolenaar
388*11e3c5baSBram Moolenaarsyn region rakuInnerAnglesOne
389*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringAngle
390*11e3c5baSBram Moolenaar    \ start="\\\@1<!<"
391*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\>"
392*11e3c5baSBram Moolenaar    \ end=">"
393*11e3c5baSBram Moolenaar    \ transparent contained
394*11e3c5baSBram Moolenaar    \ contains=rakuInnerAnglesOne
395*11e3c5baSBram Moolenaar
396*11e3c5baSBram Moolenaar" <<words>>
397*11e3c5baSBram Moolenaarsyn region rakuStringAngles
398*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
399*11e3c5baSBram Moolenaar    \ start="<<=\@!"
400*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\>"
401*11e3c5baSBram Moolenaar    \ end=">>"
402*11e3c5baSBram Moolenaar    \ contains=rakuInnerAnglesTwo,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseAngle,rakuAdverb,rakuStringSQ,rakuStringDQ
403*11e3c5baSBram Moolenaar
404*11e3c5baSBram Moolenaarsyn region rakuInnerAnglesTwo
405*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringAngles
406*11e3c5baSBram Moolenaar    \ start="<<"
407*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\>"
408*11e3c5baSBram Moolenaar    \ end=">>"
409*11e3c5baSBram Moolenaar    \ transparent contained
410*11e3c5baSBram Moolenaar    \ contains=rakuInnerAnglesTwo
411*11e3c5baSBram Moolenaar
412*11e3c5baSBram Moolenaar" «words»
413*11e3c5baSBram Moolenaarsyn region rakuStringFrench
414*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
415*11e3c5baSBram Moolenaar    \ start="«"
416*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\»"
417*11e3c5baSBram Moolenaar    \ end="»"
418*11e3c5baSBram Moolenaar    \ contains=rakuInnerFrench,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseFrench,rakuAdverb,rakuStringSQ,rakuStringDQ
419*11e3c5baSBram Moolenaar
420*11e3c5baSBram Moolenaarsyn region rakuInnerFrench
421*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringFrench
422*11e3c5baSBram Moolenaar    \ start="\\\@1<!«"
423*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\»"
424*11e3c5baSBram Moolenaar    \ end="»"
425*11e3c5baSBram Moolenaar    \ transparent contained
426*11e3c5baSBram Moolenaar    \ contains=rakuInnerFrench
427*11e3c5baSBram Moolenaar
428*11e3c5baSBram Moolenaar" Hyperops. They need to come after "<>" and "«»" strings in order to override
429*11e3c5baSBram Moolenaar" them, but before other types of strings, to avoid matching those delimiters
430*11e3c5baSBram Moolenaar" as parts of hyperops.
431*11e3c5baSBram Moolenaarsyn match rakuHyperOp display #[^[:digit:][{('",:[:space:]][^[{('",:[:space:]]*\%(«\|<<\)#
432*11e3c5baSBram Moolenaarsyn match rakuHyperOp display "«\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+[«»]"
433*11e3c5baSBram Moolenaarsyn match rakuHyperOp display "»\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(«\|»\?\)"
434*11e3c5baSBram Moolenaarsyn match rakuHyperOp display "<<\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|>>\)"
435*11e3c5baSBram Moolenaarsyn match rakuHyperOp display ">>\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|\%(>>\)\?\)"
436*11e3c5baSBram Moolenaar
437*11e3c5baSBram Moolenaar" 'string'
438*11e3c5baSBram Moolenaarsyn region rakuStringSQ
439*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
440*11e3c5baSBram Moolenaar    \ start="'"
441*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\'"
442*11e3c5baSBram Moolenaar    \ end="'"
443*11e3c5baSBram Moolenaar    \ contains=@rakuInterp_q,rakuEscQuote
444*11e3c5baSBram Moolenaar    \ keepend extend
445*11e3c5baSBram Moolenaar
446*11e3c5baSBram Moolenaar" "string"
447*11e3c5baSBram Moolenaarsyn region rakuStringDQ
448*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
449*11e3c5baSBram Moolenaar    \ start=+"+
450*11e3c5baSBram Moolenaar    \ skip=+\\\@1<!\\"+
451*11e3c5baSBram Moolenaar    \ end=+"+
452*11e3c5baSBram Moolenaar    \ contains=@rakuInterp_qq,rakuEscDoubleQuote
453*11e3c5baSBram Moolenaar    \ keepend extend
454*11e3c5baSBram Moolenaar
455*11e3c5baSBram Moolenaar" Q// and friends
456*11e3c5baSBram Moolenaar
457*11e3c5baSBram Moolenaarsyn match rakuQuoteQStart display "\%(:\|\%(sub\|role\)\s\)\@5<![Qq]\@=" nextgroup=rakuQuoteQ,rakuQuoteQ_q,rakuQuoteQ_qww,rakuQuoteQ_qq,rakuQuoteQ_to,rakuQuoteQ_qto,rakuQuoteQ_qqto,rakuIdentifier
458*11e3c5baSBram Moolenaarsyn match rakuQuoteQ      display "Q\%(qq\|ww\|[abcfhpsqvwx]\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ skipwhite skipempty contained
459*11e3c5baSBram Moolenaarsyn match rakuQuoteQ_q    display "q[abcfhpsvwx]\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_q skipwhite skipempty contained
460*11e3c5baSBram Moolenaarsyn match rakuQuoteQ_qww  display "qww[A-Za-z(]\@!" nextgroup=rakuPairsQ_qww skipwhite skipempty contained
461*11e3c5baSBram Moolenaarsyn match rakuQuoteQ_qq   display "qq\%([pwx]\|ww\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_qq skipwhite skipempty contained
462*11e3c5baSBram Moolenaarsyn match rakuQuoteQ_to   display "Qto[A-Za-z(]\@!" nextgroup=rakuStringQ_to skipwhite skipempty contained
463*11e3c5baSBram Moolenaarsyn match rakuQuoteQ_qto  display "qto[A-Za-z(]\@!" nextgroup=rakuStringQ_qto skipwhite skipempty contained
464*11e3c5baSBram Moolenaarsyn match rakuQuoteQ_qqto display "qqto[A-Za-z(]\@!" nextgroup=rakuStringQ_qqto skipwhite skipempty contained
465*11e3c5baSBram Moolenaarsyn match rakuQuoteQ_qto  display "q\_s*\%(\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*:\%(to\|heredoc\)\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*(\@!\)\@=" nextgroup=rakuPairsQ_qto skipwhite skipempty contained
466*11e3c5baSBram Moolenaarsyn match rakuQuoteQ_qqto display "qq\_s*\%(\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*:\%(to\|heredoc\)\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*(\@!\)\@=" nextgroup=rakuPairsQ_qqto skipwhite skipempty contained
467*11e3c5baSBram Moolenaarsyn match rakuPairsQ      "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ
468*11e3c5baSBram Moolenaarsyn match rakuPairsQ_q    "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_q
469*11e3c5baSBram Moolenaarsyn match rakuPairsQ_qww  "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qww
470*11e3c5baSBram Moolenaarsyn match rakuPairsQ_qq   "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qq
471*11e3c5baSBram Moolenaarsyn match rakuPairsQ_qto  "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qto
472*11e3c5baSBram Moolenaarsyn match rakuPairsQ_qqto "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qqto
473*11e3c5baSBram Moolenaar
474*11e3c5baSBram Moolenaar
475*11e3c5baSBram Moolenaarif exists("raku_embedded_pir") || exists("raku_extended_all")
476*11e3c5baSBram Moolenaar    syn include @rakuPIR syntax/pir.vim
477*11e3c5baSBram Moolenaar    syn match rakuQuote_QPIR display "Q[A-Za-z(]\@!\%(\_s*:PIR\)\@=" nextgroup=rakuPairsQ_PIR skipwhite skipempty
478*11e3c5baSBram Moolenaar    syn match rakuPairs_QPIR contained "\_s*:PIR" transparent skipwhite skipempty nextgroup=rakuStringQ_PIR
479*11e3c5baSBram Moolenaarendif
480*11e3c5baSBram Moolenaar
481*11e3c5baSBram Moolenaar" hardcoded set of delimiters
482*11e3c5baSBram Moolenaarlet s:plain_delims = [
483*11e3c5baSBram Moolenaar  \ ["DQ",          "\\\"",         "\\\"", "rakuEscDoubleQuote",  "\\\\\\@1<!\\\\\\\""],
484*11e3c5baSBram Moolenaar  \ ["SQ",          "'",            "'",    "rakuEscQuote",        "\\\\\\@1<!\\\\'"],
485*11e3c5baSBram Moolenaar  \ ["Slash",       "/",            "/",    "rakuEscForwardSlash", "\\\\\\@1<!\\\\/"],
486*11e3c5baSBram Moolenaar  \ ["BackTick",    "`",            "`",    "rakuEscBackTick",     "\\\\\\@1<!\\\\`"],
487*11e3c5baSBram Moolenaar  \ ["Bar",         "|",            "|",    "rakuEscVerticalBar",  "\\\\\\@1<!\\\\|"],
488*11e3c5baSBram Moolenaar  \ ["Exclamation", "!",            "!",    "rakuEscExclamation",  "\\\\\\@1<!\\\\!"],
489*11e3c5baSBram Moolenaar  \ ["Comma",       ",",            ",",    "rakuEscComma",        "\\\\\\@1<!\\\\,"],
490*11e3c5baSBram Moolenaar  \ ["Dollar",      "\\$",          "\\$",  "rakuEscDollar",       "\\\\\\@1<!\\\\\\$"],
491*11e3c5baSBram Moolenaar\ ]
492*11e3c5baSBram Moolenaarlet s:bracketing_delims = [
493*11e3c5baSBram Moolenaar  \ ["Curly",   "{",            "}",    "rakuEscCloseCurly",   "\\%(\\\\\\@1<!\\\\}\\|{[^}]*}\\)"],
494*11e3c5baSBram Moolenaar  \ ["Angle",   "<",            ">",    "rakuEscCloseAngle",   "\\%(\\\\\\@1<!\\\\>\\|<[^>]*>\\)"],
495*11e3c5baSBram Moolenaar  \ ["French",  "«",            "»",    "rakuEscCloseFrench",  "\\%(\\\\\\@1<!\\\\»\\|«[^»]*»\\)"],
496*11e3c5baSBram Moolenaar  \ ["Bracket", "\\\[",         "]",    "rakuEscCloseBracket", "\\%(\\\\\\@1<!\\\\]\\|\\[^\\]]*]\\)"],
497*11e3c5baSBram Moolenaar  \ ["Paren",   "\\s\\@1<=(",   ")",    "rakuEscCloseParen",   "\\%(\\\\\\@1<!\\\\)\\|([^)]*)\\)"],
498*11e3c5baSBram Moolenaar\ ]
499*11e3c5baSBram Moolenaarlet s:all_delims = s:plain_delims + s:bracketing_delims
500*11e3c5baSBram Moolenaar
501*11e3c5baSBram Moolenaarfor [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:all_delims
502*11e3c5baSBram Moolenaar    exec "syn region rakuStringQ matchgroup=rakuQuote start=\"".s:start_delim."\" end=\"".s:end_delim."\" contained"
503*11e3c5baSBram Moolenaar    exec "syn region rakuStringQ_q matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_q,".s:end_group." contained"
504*11e3c5baSBram Moolenaar    exec "syn region rakuStringQ_qww matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_q,rakuStringSQ,rakuStringDQ".s:end_group." contained"
505*11e3c5baSBram Moolenaar    exec "syn region rakuStringQ_qq matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_qq,".s:end_group." contained"
506*11e3c5baSBram Moolenaar    exec "syn region rakuStringQ_to matchgroup=rakuQuote start=\"".s:start_delim."\\z([^".s:end_delim."]\\+\\)".s:end_delim."\" end=\"^\\s*\\z1$\" contained"
507*11e3c5baSBram Moolenaar    exec "syn region rakuStringQ_qto matchgroup=rakuQuote start=\"".s:start_delim."\\z([^".s:end_delim."]\\+\\)".s:end_delim."\" skip=\"".s:skip."\" end=\"^\\s*\\z1$\" contains=@rakuInterp_q,".s:end_group." contained"
508*11e3c5baSBram Moolenaar    exec "syn region rakuStringQ_qqto matchgroup=rakuQuote start=\"".s:start_delim."\\z(\[^".s:end_delim."]\\+\\)".s:end_delim."\" skip=\"".s:skip."\" end=\"^\\s*\\z1$\" contains=@rakuInterp_qq,".s:end_group." contained"
509*11e3c5baSBram Moolenaar
510*11e3c5baSBram Moolenaar    if exists("raku_embedded_pir") || exists("raku_extended_all")
511*11e3c5baSBram Moolenaar        exec "syn region rakuStringQ_PIR matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuPIR,".s:end_group." contained"
512*11e3c5baSBram Moolenaar    endif
513*11e3c5baSBram Moolenaarendfor
514*11e3c5baSBram Moolenaarunlet s:name s:start_delim s:end_delim s:end_group s:skip s:plain_delims s:all_delims
515*11e3c5baSBram Moolenaar
516*11e3c5baSBram Moolenaar" :key
517*11e3c5baSBram Moolenaarsyn match rakuOperator display ":\@1<!::\@!!\?" nextgroup=rakuKey,rakuStringAngleFixed,rakuStringAngles,rakuStringFrench
518*11e3c5baSBram Moolenaarsyn match rakuKey display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" contained nextgroup=rakuStringAngleFixed,rakuStringAngles,rakuStringFrench
519*11e3c5baSBram Moolenaar
520*11e3c5baSBram Moolenaar" Regexes and grammars
521*11e3c5baSBram Moolenaar
522*11e3c5baSBram Moolenaarsyn match rakuRegexName    display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?" nextgroup=rakuRegexBlockCrap skipwhite skipempty contained
523*11e3c5baSBram Moolenaarsyn match rakuRegexBlockCrap "[^{]*" nextgroup=rakuRegexBlock skipwhite skipempty transparent contained
524*11e3c5baSBram Moolenaar
525*11e3c5baSBram Moolenaarsyn region rakuRegexBlock
526*11e3c5baSBram Moolenaar    \ matchgroup=rakuNormal
527*11e3c5baSBram Moolenaar    \ start="{"
528*11e3c5baSBram Moolenaar    \ end="}"
529*11e3c5baSBram Moolenaar    \ contained
530*11e3c5baSBram Moolenaar    \ contains=@rakuRegexen,@rakuVariables
531*11e3c5baSBram Moolenaar
532*11e3c5baSBram Moolenaar" Perl 6 regex bits
533*11e3c5baSBram Moolenaar
534*11e3c5baSBram Moolenaarsyn cluster rakuRegexen
535*11e3c5baSBram Moolenaar    \ add=rakuRxMeta
536*11e3c5baSBram Moolenaar    \ add=rakuRxEscape
537*11e3c5baSBram Moolenaar    \ add=rakuEscCodePoint
538*11e3c5baSBram Moolenaar    \ add=rakuEscHex
539*11e3c5baSBram Moolenaar    \ add=rakuEscOct
540*11e3c5baSBram Moolenaar    \ add=rakuEscNull
541*11e3c5baSBram Moolenaar    \ add=rakuRxAnchor
542*11e3c5baSBram Moolenaar    \ add=rakuRxCapture
543*11e3c5baSBram Moolenaar    \ add=rakuRxGroup
544*11e3c5baSBram Moolenaar    \ add=rakuRxAlternation
545*11e3c5baSBram Moolenaar    \ add=rakuRxBoundary
546*11e3c5baSBram Moolenaar    \ add=rakuRxAdverb
547*11e3c5baSBram Moolenaar    \ add=rakuRxAdverbArg
548*11e3c5baSBram Moolenaar    \ add=rakuRxStorage
549*11e3c5baSBram Moolenaar    \ add=rakuRxAssertion
550*11e3c5baSBram Moolenaar    \ add=rakuRxAssertGroup
551*11e3c5baSBram Moolenaar    \ add=rakuRxQuoteWords
552*11e3c5baSBram Moolenaar    \ add=rakuRxClosure
553*11e3c5baSBram Moolenaar    \ add=rakuRxStringSQ
554*11e3c5baSBram Moolenaar    \ add=rakuRxStringDQ
555*11e3c5baSBram Moolenaar    \ add=rakuComment
556*11e3c5baSBram Moolenaar    \ add=rakuBracketComment
557*11e3c5baSBram Moolenaar    \ add=rakuMatchVarSigil
558*11e3c5baSBram Moolenaar
559*11e3c5baSBram Moolenaarsyn match rakuRxMeta        display contained ".\%([A-Za-z_\xC0-\xFF0-9]\|\s\)\@1<!"
560*11e3c5baSBram Moolenaarsyn match rakuRxAnchor      display contained "[$^]"
561*11e3c5baSBram Moolenaarsyn match rakuRxEscape      display contained "\\\S"
562*11e3c5baSBram Moolenaarsyn match rakuRxCapture     display contained "[()]"
563*11e3c5baSBram Moolenaarsyn match rakuRxAlternation display contained "|"
564*11e3c5baSBram Moolenaarsyn match rakuRxRange       display contained "\.\."
565*11e3c5baSBram Moolenaar
566*11e3c5baSBram Moolenaar" misc escapes
567*11e3c5baSBram Moolenaarsyn match rakuEscOctOld    display "\\[1-9]\d\{1,2}" contained
568*11e3c5baSBram Moolenaarsyn match rakuEscNull      display "\\0\d\@!" contained
569*11e3c5baSBram Moolenaarsyn match rakuEscCodePoint display "\\[cC]" contained nextgroup=rakuCodePoint
570*11e3c5baSBram Moolenaarsyn match rakuEscHex       display "\\[xX]" contained nextgroup=rakuHexSequence
571*11e3c5baSBram Moolenaarsyn match rakuEscOct       display "\\o" contained nextgroup=rakuOctSequence
572*11e3c5baSBram Moolenaarsyn match rakuEscQQ        display "\\qq" contained nextgroup=rakuQQSequence
573*11e3c5baSBram Moolenaarsyn match rakuEscOpenCurly display "\\{" contained
574*11e3c5baSBram Moolenaarsyn match rakuEscHash      display "\\#" contained
575*11e3c5baSBram Moolenaarsyn match rakuEscBackSlash display "\\\\" contained
576*11e3c5baSBram Moolenaar
577*11e3c5baSBram Moolenaarsyn region rakuQQSequence
578*11e3c5baSBram Moolenaar    \ matchgroup=rakuEscape
579*11e3c5baSBram Moolenaar    \ start="\["
580*11e3c5baSBram Moolenaar    \ skip="\[[^\]]*]"
581*11e3c5baSBram Moolenaar    \ end="]"
582*11e3c5baSBram Moolenaar    \ contained transparent
583*11e3c5baSBram Moolenaar    \ contains=@rakuInterp_qq
584*11e3c5baSBram Moolenaar
585*11e3c5baSBram Moolenaarsyn match rakuCodePoint   display "\%(\d\+\|\S\)" contained
586*11e3c5baSBram Moolenaarsyn region rakuCodePoint
587*11e3c5baSBram Moolenaar    \ matchgroup=rakuEscape
588*11e3c5baSBram Moolenaar    \ start="\["
589*11e3c5baSBram Moolenaar    \ end="]"
590*11e3c5baSBram Moolenaar    \ contained
591*11e3c5baSBram Moolenaar
592*11e3c5baSBram Moolenaarsyn match rakuHexSequence display "\x\+" contained
593*11e3c5baSBram Moolenaarsyn region rakuHexSequence
594*11e3c5baSBram Moolenaar    \ matchgroup=rakuEscape
595*11e3c5baSBram Moolenaar    \ start="\["
596*11e3c5baSBram Moolenaar    \ end="]"
597*11e3c5baSBram Moolenaar    \ contained
598*11e3c5baSBram Moolenaar
599*11e3c5baSBram Moolenaarsyn match rakuOctSequence display "\o\+" contained
600*11e3c5baSBram Moolenaarsyn region rakuOctSequence
601*11e3c5baSBram Moolenaar    \ matchgroup=rakuEscape
602*11e3c5baSBram Moolenaar    \ start="\["
603*11e3c5baSBram Moolenaar    \ end="]"
604*11e3c5baSBram Moolenaar    \ contained
605*11e3c5baSBram Moolenaar
606*11e3c5baSBram Moolenaar" $<match>, @<match>
607*11e3c5baSBram Moolenaarsyn region rakuMatchVarSigil
608*11e3c5baSBram Moolenaar    \ matchgroup=rakuVariable
609*11e3c5baSBram Moolenaar    \ start="[$@]\%(<<\@!\)\@="
610*11e3c5baSBram Moolenaar    \ end=">\@1<="
611*11e3c5baSBram Moolenaar    \ contains=rakuMatchVar
612*11e3c5baSBram Moolenaar
613*11e3c5baSBram Moolenaarsyn region rakuMatchVar
614*11e3c5baSBram Moolenaar    \ matchgroup=rakuTwigil
615*11e3c5baSBram Moolenaar    \ start="<"
616*11e3c5baSBram Moolenaar    \ end=">"
617*11e3c5baSBram Moolenaar    \ contained
618*11e3c5baSBram Moolenaar
619*11e3c5baSBram Moolenaarsyn region rakuRxClosure
620*11e3c5baSBram Moolenaar    \ matchgroup=rakuNormal
621*11e3c5baSBram Moolenaar    \ start="{"
622*11e3c5baSBram Moolenaar    \ end="}"
623*11e3c5baSBram Moolenaar    \ contained
624*11e3c5baSBram Moolenaar    \ containedin=rakuRxClosure
625*11e3c5baSBram Moolenaar    \ contains=TOP
626*11e3c5baSBram Moolenaarsyn region rakuRxGroup
627*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial2
628*11e3c5baSBram Moolenaar    \ start="\["
629*11e3c5baSBram Moolenaar    \ end="]"
630*11e3c5baSBram Moolenaar    \ contained
631*11e3c5baSBram Moolenaar    \ contains=@rakuRegexen,@rakuVariables,rakuMatchVarSigil
632*11e3c5baSBram Moolenaarsyn region rakuRxAssertion
633*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial2
634*11e3c5baSBram Moolenaar    \ start="<\%(?\?\%(before\|after\)\|\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\)\|[+?*]\)\?"
635*11e3c5baSBram Moolenaar    \ end=">"
636*11e3c5baSBram Moolenaar    \ contained
637*11e3c5baSBram Moolenaar    \ contains=@rakuRegexen,rakuIdentifier,@rakuVariables,rakuRxCharClass,rakuRxAssertCall
638*11e3c5baSBram Moolenaarsyn region rakuRxAssertGroup
639*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial2
640*11e3c5baSBram Moolenaar    \ start="<\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\["
641*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\]"
642*11e3c5baSBram Moolenaar    \ end="]"
643*11e3c5baSBram Moolenaar    \ contained
644*11e3c5baSBram Moolenaarsyn match rakuRxAssertCall display "\%(::\|\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)" contained nextgroup=rakuRxAssertArgs
645*11e3c5baSBram Moolenaarsyn region rakuRxAssertArgs
646*11e3c5baSBram Moolenaar    \ start="("
647*11e3c5baSBram Moolenaar    \ end=")"
648*11e3c5baSBram Moolenaar    \ contained keepend
649*11e3c5baSBram Moolenaar    \ contains=TOP
650*11e3c5baSBram Moolenaarsyn region rakuRxAssertArgs
651*11e3c5baSBram Moolenaar    \ start=":"
652*11e3c5baSBram Moolenaar    \ end="\ze>"
653*11e3c5baSBram Moolenaar    \ contained keepend
654*11e3c5baSBram Moolenaar    \ contains=TOP
655*11e3c5baSBram Moolenaarsyn match rakuRxBoundary display contained "\%([«»]\|<<\|>>\)"
656*11e3c5baSBram Moolenaarsyn region rakuRxCharClass
657*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial2
658*11e3c5baSBram Moolenaar    \ start="\%(<[-!+?]\?\)\@2<=\["
659*11e3c5baSBram Moolenaar    \ skip="\\]"
660*11e3c5baSBram Moolenaar    \ end="]"
661*11e3c5baSBram Moolenaar    \ contained
662*11e3c5baSBram Moolenaar    \ contains=rakuRxRange,rakuRxEscape,rakuEscHex,rakuEscOct,rakuEscCodePoint,rakuEscNull
663*11e3c5baSBram Moolenaarsyn region rakuRxQuoteWords
664*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial2
665*11e3c5baSBram Moolenaar    \ start="<\s"
666*11e3c5baSBram Moolenaar    \ end="\s\?>"
667*11e3c5baSBram Moolenaar    \ contained
668*11e3c5baSBram Moolenaarsyn region rakuRxAdverb
669*11e3c5baSBram Moolenaar    \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)"
670*11e3c5baSBram Moolenaar    \ end="\z1\zs"
671*11e3c5baSBram Moolenaar    \ contained keepend
672*11e3c5baSBram Moolenaar    \ contains=TOP
673*11e3c5baSBram Moolenaarsyn region rakuRxAdverbArg
674*11e3c5baSBram Moolenaar    \ start="\%(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\@<=("
675*11e3c5baSBram Moolenaar    \ skip="([^)]\{-})"
676*11e3c5baSBram Moolenaar    \ end=")"
677*11e3c5baSBram Moolenaar    \ contained
678*11e3c5baSBram Moolenaar    \ keepend
679*11e3c5baSBram Moolenaar    \ contains=TOP
680*11e3c5baSBram Moolenaarsyn region rakuRxStorage
681*11e3c5baSBram Moolenaar    \ matchgroup=rakuOperator
682*11e3c5baSBram Moolenaar    \ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@="
683*11e3c5baSBram Moolenaar    \ end="$"
684*11e3c5baSBram Moolenaar    \ contains=TOP
685*11e3c5baSBram Moolenaar    \ contained
686*11e3c5baSBram Moolenaar    \ keepend
687*11e3c5baSBram Moolenaar
688*11e3c5baSBram Moolenaar" 'string' inside a regex
689*11e3c5baSBram Moolenaarsyn region rakuRxStringSQ
690*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
691*11e3c5baSBram Moolenaar    \ start="'"
692*11e3c5baSBram Moolenaar    \ skip="\\\@1<!\\'"
693*11e3c5baSBram Moolenaar    \ end="'"
694*11e3c5baSBram Moolenaar    \ contained
695*11e3c5baSBram Moolenaar    \ contains=rakuEscQuote,rakuEscBackSlash
696*11e3c5baSBram Moolenaar
697*11e3c5baSBram Moolenaar" "string" inside a regex
698*11e3c5baSBram Moolenaarsyn region rakuRxStringDQ
699*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
700*11e3c5baSBram Moolenaar    \ start=+"+
701*11e3c5baSBram Moolenaar    \ skip=+\\\@1<!\\"+
702*11e3c5baSBram Moolenaar    \ end=+"+
703*11e3c5baSBram Moolenaar    \ contained
704*11e3c5baSBram Moolenaar    \ contains=rakuEscDoubleQuote,rakuEscBackSlash,@rakuInterp_qq
705*11e3c5baSBram Moolenaar
706*11e3c5baSBram Moolenaar" $!, $var, $!var, $::var, $package::var $*::package::var, etc
707*11e3c5baSBram Moolenaar" Thus must come after the matches for the "$" regex anchor, but before
708*11e3c5baSBram Moolenaar" the match for the $ regex delimiter
709*11e3c5baSBram Moolenaarsyn cluster rakuVariables
710*11e3c5baSBram Moolenaar    \ add=rakuVarSlash
711*11e3c5baSBram Moolenaar    \ add=rakuVarExclam
712*11e3c5baSBram Moolenaar    \ add=rakuVarMatch
713*11e3c5baSBram Moolenaar    \ add=rakuVarNum
714*11e3c5baSBram Moolenaar    \ add=rakuVariable
715*11e3c5baSBram Moolenaar
716*11e3c5baSBram Moolenaarsyn match rakuBareSigil    display "[@$%&]\%(\s*\%([,)}=]\|where\>\)\)\@="
717*11e3c5baSBram Moolenaarsyn match rakuVarSlash     display "\$/"
718*11e3c5baSBram Moolenaarsyn match rakuVarExclam    display "\$!"
719*11e3c5baSBram Moolenaarsyn match rakuVarMatch     display "\$¢"
720*11e3c5baSBram Moolenaarsyn match rakuVarNum       display "\$\d\+"
721*11e3c5baSBram Moolenaarsyn match rakuVariable     display "self"
722*11e3c5baSBram Moolenaarsyn match rakuVariable     display "[@$%&]\?[@&$%]\$*\%(::\|\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\)\|[A-Za-z_\xC0-\xFF]\)\@=" nextgroup=rakuTwigil,rakuVarName,rakuPackageScope
723*11e3c5baSBram Moolenaarsyn match rakuVarName      display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" nextgroup=rakuPostHyperOp contained
724*11e3c5baSBram Moolenaarsyn match rakuClose        display "[\])]" transparent nextgroup=rakuPostHyperOp
725*11e3c5baSBram Moolenaarsyn match rakuPostHyperOp  display "\%(»\|>>\)" contained
726*11e3c5baSBram Moolenaarsyn match rakuTwigil       display "\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=" nextgroup=rakuPackageScope,rakuVarName contained
727*11e3c5baSBram Moolenaarsyn match rakuPackageScope display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?::" nextgroup=rakuPackageScope,rakuVarName contained
728*11e3c5baSBram Moolenaar
729*11e3c5baSBram Moolenaar" Perl 6 regex regions
730*11e3c5baSBram Moolenaar
731*11e3c5baSBram Moolenaarsyn match rakuMatchStart_m    display "\.\@1<!\<\%(mm\?\|rx\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_m
732*11e3c5baSBram Moolenaarsyn match rakuMatchStart_s    display "\.\@1<!\<[sS]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_s
733*11e3c5baSBram Moolenaarsyn match rakuMatchStart_tr   display "\.\@1<!\<tr\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_tr
734*11e3c5baSBram Moolenaarsyn match rakuMatchAdverbs_m  "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuMatch
735*11e3c5baSBram Moolenaarsyn match rakuMatchAdverbs_s  "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuSubstitution
736*11e3c5baSBram Moolenaarsyn match rakuMatchAdverbs_tr "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuTransliteration
737*11e3c5baSBram Moolenaar
738*11e3c5baSBram Moolenaar" /foo/
739*11e3c5baSBram Moolenaarsyn region rakuMatchBare
740*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
741*11e3c5baSBram Moolenaar    \ start="/\@1<!\%(\%(\_^\|[!\[,=~|&/:({]\|\^\?fff\?\^\?\|=>\|\<\%(if\|unless\|while\|when\|where\|so\)\)\s*\)\@<=/[/=]\@!"
742*11e3c5baSBram Moolenaar    \ skip="\\/"
743*11e3c5baSBram Moolenaar    \ end="/"
744*11e3c5baSBram Moolenaar    \ contains=@rakuRegexen,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum
745*11e3c5baSBram Moolenaar
746*11e3c5baSBram Moolenaar" m/foo/, m$foo$, m!foo!, etc
747*11e3c5baSBram Moolenaarsyn region rakuMatch
748*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
749*11e3c5baSBram Moolenaar    \ start=+\z([/!$,|`"]\)+
750*11e3c5baSBram Moolenaar    \ skip="\\\z1"
751*11e3c5baSBram Moolenaar    \ end="\z1"
752*11e3c5baSBram Moolenaar    \ contained
753*11e3c5baSBram Moolenaar    \ contains=@rakuRegexen,rakuVariable,rakuVarNum
754*11e3c5baSBram Moolenaar
755*11e3c5baSBram Moolenaar" m<foo>, m«foo», m{foo}, etc
756*11e3c5baSBram Moolenaarfor [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
757*11e3c5baSBram Moolenaar    exec "syn region rakuMatch matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables"
758*11e3c5baSBram Moolenaarendfor
759*11e3c5baSBram Moolenaarunlet s:name s:start_delim s:end_delim s:end_group s:skip
760*11e3c5baSBram Moolenaar
761*11e3c5baSBram Moolenaar" Substitutions
762*11e3c5baSBram Moolenaar
763*11e3c5baSBram Moolenaar" s/foo//, s$foo$$, s!foo!!, etc
764*11e3c5baSBram Moolenaarsyn region rakuSubstitution
765*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
766*11e3c5baSBram Moolenaar    \ start=+\z([/!$,|`"]\)+
767*11e3c5baSBram Moolenaar    \ skip="\\\z1"
768*11e3c5baSBram Moolenaar    \ end="\z1"me=e-1
769*11e3c5baSBram Moolenaar    \ contained
770*11e3c5baSBram Moolenaar    \ contains=@rakuRegexen,rakuVariable,rakuVarNum
771*11e3c5baSBram Moolenaar    \ nextgroup=rakuReplacement
772*11e3c5baSBram Moolenaar
773*11e3c5baSBram Moolenaarsyn region rakuReplacement
774*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
775*11e3c5baSBram Moolenaar    \ start="\z(.\)"
776*11e3c5baSBram Moolenaar    \ skip="\\\z1"
777*11e3c5baSBram Moolenaar    \ end="\z1"
778*11e3c5baSBram Moolenaar    \ contained
779*11e3c5baSBram Moolenaar    \ contains=@rakuInterp_qq
780*11e3c5baSBram Moolenaar
781*11e3c5baSBram Moolenaar" s<foo><bar>, s«foo»«bar», s{foo}{bar}, etc
782*11e3c5baSBram Moolenaarfor [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
783*11e3c5baSBram Moolenaar    exec "syn region rakuSubstitution matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables nextgroup=rakuRepl".s:name
784*11e3c5baSBram Moolenaar    exec "syn region rakuRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq"
785*11e3c5baSBram Moolenaarendfor
786*11e3c5baSBram Moolenaarunlet s:name s:start_delim s:end_delim s:end_group s:skip
787*11e3c5baSBram Moolenaar
788*11e3c5baSBram Moolenaar" Transliteration
789*11e3c5baSBram Moolenaar
790*11e3c5baSBram Moolenaar" tr/foo/bar/, tr|foo|bar, etc
791*11e3c5baSBram Moolenaarsyn region rakuTransliteration
792*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
793*11e3c5baSBram Moolenaar    \ start=+\z([/!$,|`"]\)+
794*11e3c5baSBram Moolenaar    \ skip="\\\z1"
795*11e3c5baSBram Moolenaar    \ end="\z1"me=e-1
796*11e3c5baSBram Moolenaar    \ contained
797*11e3c5baSBram Moolenaar    \ contains=rakuRxRange
798*11e3c5baSBram Moolenaar    \ nextgroup=rakuTransRepl
799*11e3c5baSBram Moolenaar
800*11e3c5baSBram Moolenaarsyn region rakuTransRepl
801*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
802*11e3c5baSBram Moolenaar    \ start="\z(.\)"
803*11e3c5baSBram Moolenaar    \ skip="\\\z1"
804*11e3c5baSBram Moolenaar    \ end="\z1"
805*11e3c5baSBram Moolenaar    \ contained
806*11e3c5baSBram Moolenaar    \ contains=@rakuInterp_qq,rakuRxRange
807*11e3c5baSBram Moolenaar
808*11e3c5baSBram Moolenaar" tr<foo><bar>, tr«foo»«bar», tr{foo}{bar}, etc
809*11e3c5baSBram Moolenaarfor [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
810*11e3c5baSBram Moolenaar    exec "syn region rakuTransliteration matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=rakuRxRange nextgroup=rakuTransRepl".s:name
811*11e3c5baSBram Moolenaar    exec "syn region rakuTransRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq,rakuRxRange"
812*11e3c5baSBram Moolenaarendfor
813*11e3c5baSBram Moolenaarunlet s:name s:start_delim s:end_delim s:end_group s:skip s:bracketing_delims
814*11e3c5baSBram Moolenaar
815*11e3c5baSBram Moolenaarif exists("raku_perl5_regexes") || exists("raku_extended_all")
816*11e3c5baSBram Moolenaar
817*11e3c5baSBram Moolenaar" Perl 5 regex regions
818*11e3c5baSBram Moolenaar
819*11e3c5baSBram Moolenaarsyn cluster rakuRegexP5Base
820*11e3c5baSBram Moolenaar    \ add=rakuRxP5Escape
821*11e3c5baSBram Moolenaar    \ add=rakuRxP5Oct
822*11e3c5baSBram Moolenaar    \ add=rakuRxP5Hex
823*11e3c5baSBram Moolenaar    \ add=rakuRxP5EscMeta
824*11e3c5baSBram Moolenaar    \ add=rakuRxP5CodePoint
825*11e3c5baSBram Moolenaar    \ add=rakuRxP5Prop
826*11e3c5baSBram Moolenaar
827*11e3c5baSBram Moolenaar" normal regex stuff
828*11e3c5baSBram Moolenaarsyn cluster rakuRegexP5
829*11e3c5baSBram Moolenaar    \ add=@rakuRegexP5Base
830*11e3c5baSBram Moolenaar    \ add=rakuRxP5Quantifier
831*11e3c5baSBram Moolenaar    \ add=rakuRxP5Meta
832*11e3c5baSBram Moolenaar    \ add=rakuRxP5QuoteMeta
833*11e3c5baSBram Moolenaar    \ add=rakuRxP5ParenMod
834*11e3c5baSBram Moolenaar    \ add=rakuRxP5Verb
835*11e3c5baSBram Moolenaar    \ add=rakuRxP5Count
836*11e3c5baSBram Moolenaar    \ add=rakuRxP5Named
837*11e3c5baSBram Moolenaar    \ add=rakuRxP5ReadRef
838*11e3c5baSBram Moolenaar    \ add=rakuRxP5WriteRef
839*11e3c5baSBram Moolenaar    \ add=rakuRxP5CharClass
840*11e3c5baSBram Moolenaar    \ add=rakuRxP5Anchor
841*11e3c5baSBram Moolenaar
842*11e3c5baSBram Moolenaar" inside character classes
843*11e3c5baSBram Moolenaarsyn cluster rakuRegexP5Class
844*11e3c5baSBram Moolenaar    \ add=@rakuRegexP5Base
845*11e3c5baSBram Moolenaar    \ add=rakuRxP5Posix
846*11e3c5baSBram Moolenaar    \ add=rakuRxP5Range
847*11e3c5baSBram Moolenaar
848*11e3c5baSBram Moolenaarsyn match rakuRxP5Escape     display contained "\\\S"
849*11e3c5baSBram Moolenaarsyn match rakuRxP5CodePoint  display contained "\\c\S\@=" nextgroup=rakuRxP5CPId
850*11e3c5baSBram Moolenaarsyn match rakuRxP5CPId       display contained "\S"
851*11e3c5baSBram Moolenaarsyn match rakuRxP5Oct        display contained "\\\%(\o\{1,3}\)\@=" nextgroup=rakuRxP5OctSeq
852*11e3c5baSBram Moolenaarsyn match rakuRxP5OctSeq     display contained "\o\{1,3}"
853*11e3c5baSBram Moolenaarsyn match rakuRxP5Anchor     display contained "[\^$]"
854*11e3c5baSBram Moolenaarsyn match rakuRxP5Hex        display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=rakuRxP5HexSeq
855*11e3c5baSBram Moolenaarsyn match rakuRxP5HexSeq     display contained "\x\{1,2}"
856*11e3c5baSBram Moolenaarsyn region rakuRxP5HexSeq
857*11e3c5baSBram Moolenaar    \ matchgroup=rakuRxP5Escape
858*11e3c5baSBram Moolenaar    \ start="{"
859*11e3c5baSBram Moolenaar    \ end="}"
860*11e3c5baSBram Moolenaar    \ contained
861*11e3c5baSBram Moolenaarsyn region rakuRxP5Named
862*11e3c5baSBram Moolenaar    \ matchgroup=rakuRxP5Escape
863*11e3c5baSBram Moolenaar    \ start="\%(\\N\)\@2<={"
864*11e3c5baSBram Moolenaar    \ end="}"
865*11e3c5baSBram Moolenaar    \ contained
866*11e3c5baSBram Moolenaarsyn match rakuRxP5Quantifier display contained "\%([+*]\|(\@1<!?\)"
867*11e3c5baSBram Moolenaarsyn match rakuRxP5ReadRef    display contained "\\[1-9]\d\@!"
868*11e3c5baSBram Moolenaarsyn match rakuRxP5ReadRef    display contained "\[A-Za-z_\xC0-\xFF0-9]<\@=" nextgroup=rakuRxP5ReadRefId
869*11e3c5baSBram Moolenaarsyn region rakuRxP5ReadRefId
870*11e3c5baSBram Moolenaar    \ matchgroup=rakuRxP5Escape
871*11e3c5baSBram Moolenaar    \ start="<"
872*11e3c5baSBram Moolenaar    \ end=">"
873*11e3c5baSBram Moolenaar    \ contained
874*11e3c5baSBram Moolenaarsyn match rakuRxP5WriteRef   display contained "\\g\%(\d\|{\)\@=" nextgroup=rakuRxP5WriteRefId
875*11e3c5baSBram Moolenaarsyn match rakuRxP5WriteRefId display contained "\d\+"
876*11e3c5baSBram Moolenaarsyn region rakuRxP5WriteRefId
877*11e3c5baSBram Moolenaar    \ matchgroup=rakuRxP5Escape
878*11e3c5baSBram Moolenaar    \ start="{"
879*11e3c5baSBram Moolenaar    \ end="}"
880*11e3c5baSBram Moolenaar    \ contained
881*11e3c5baSBram Moolenaarsyn match rakuRxP5Prop       display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=rakuRxP5PropId
882*11e3c5baSBram Moolenaarsyn match rakuRxP5PropId     display contained "\a"
883*11e3c5baSBram Moolenaarsyn region rakuRxP5PropId
884*11e3c5baSBram Moolenaar    \ matchgroup=rakuRxP5Escape
885*11e3c5baSBram Moolenaar    \ start="{"
886*11e3c5baSBram Moolenaar    \ end="}"
887*11e3c5baSBram Moolenaar    \ contained
888*11e3c5baSBram Moolenaarsyn match rakuRxP5Meta       display contained "[(|).]"
889*11e3c5baSBram Moolenaarsyn match rakuRxP5ParenMod   display contained "(\@1<=?\@=" nextgroup=rakuRxP5Mod,rakuRxP5ModName,rakuRxP5Code
890*11e3c5baSBram Moolenaarsyn match rakuRxP5Mod        display contained "?\%(<\?=\|<\?!\|[#:|]\)"
891*11e3c5baSBram Moolenaarsyn match rakuRxP5Mod        display contained "?-\?[impsx]\+"
892*11e3c5baSBram Moolenaarsyn match rakuRxP5Mod        display contained "?\%([-+]\?\d\+\|R\)"
893*11e3c5baSBram Moolenaarsyn match rakuRxP5Mod        display contained "?(DEFINE)"
894*11e3c5baSBram Moolenaarsyn match rakuRxP5Mod        display contained "?\%(&\|P[>=]\)" nextgroup=rakuRxP5ModDef
895*11e3c5baSBram Moolenaarsyn match rakuRxP5ModDef     display contained "\h\w*"
896*11e3c5baSBram Moolenaarsyn region rakuRxP5ModName
897*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial
898*11e3c5baSBram Moolenaar    \ start="?'"
899*11e3c5baSBram Moolenaar    \ end="'"
900*11e3c5baSBram Moolenaar    \ contained
901*11e3c5baSBram Moolenaarsyn region rakuRxP5ModName
902*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial
903*11e3c5baSBram Moolenaar    \ start="?P\?<"
904*11e3c5baSBram Moolenaar    \ end=">"
905*11e3c5baSBram Moolenaar    \ contained
906*11e3c5baSBram Moolenaarsyn region rakuRxP5Code
907*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial
908*11e3c5baSBram Moolenaar    \ start="??\?{"
909*11e3c5baSBram Moolenaar    \ end="})\@="
910*11e3c5baSBram Moolenaar    \ contained
911*11e3c5baSBram Moolenaar    \ contains=TOP
912*11e3c5baSBram Moolenaarsyn match rakuRxP5EscMeta    display contained "\\[?*.{}()[\]|\^$]"
913*11e3c5baSBram Moolenaarsyn match rakuRxP5Count      display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=rakuRxP5CountId
914*11e3c5baSBram Moolenaarsyn region rakuRxP5CountId
915*11e3c5baSBram Moolenaar    \ matchgroup=rakuRxP5Escape
916*11e3c5baSBram Moolenaar    \ start="{"
917*11e3c5baSBram Moolenaar    \ end="}"
918*11e3c5baSBram Moolenaar    \ contained
919*11e3c5baSBram Moolenaarsyn match rakuRxP5Verb       display contained "(\@1<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)"
920*11e3c5baSBram Moolenaarsyn region rakuRxP5QuoteMeta
921*11e3c5baSBram Moolenaar    \ matchgroup=rakuRxP5Escape
922*11e3c5baSBram Moolenaar    \ start="\\Q"
923*11e3c5baSBram Moolenaar    \ end="\\E"
924*11e3c5baSBram Moolenaar    \ contained
925*11e3c5baSBram Moolenaar    \ contains=@rakuVariables,rakuEscBackSlash
926*11e3c5baSBram Moolenaarsyn region rakuRxP5CharClass
927*11e3c5baSBram Moolenaar    \ matchgroup=rakuStringSpecial
928*11e3c5baSBram Moolenaar    \ start="\[\^\?"
929*11e3c5baSBram Moolenaar    \ skip="\\]"
930*11e3c5baSBram Moolenaar    \ end="]"
931*11e3c5baSBram Moolenaar    \ contained
932*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5Class
933*11e3c5baSBram Moolenaarsyn region rakuRxP5Posix
934*11e3c5baSBram Moolenaar    \ matchgroup=rakuRxP5Escape
935*11e3c5baSBram Moolenaar    \ start="\[:"
936*11e3c5baSBram Moolenaar    \ end=":]"
937*11e3c5baSBram Moolenaar    \ contained
938*11e3c5baSBram Moolenaarsyn match rakuRxP5Range      display contained "-"
939*11e3c5baSBram Moolenaar
940*11e3c5baSBram Moolenaar" m:P5//
941*11e3c5baSBram Moolenaarsyn region rakuMatch
942*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
943*11e3c5baSBram Moolenaar    \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=/"
944*11e3c5baSBram Moolenaar    \ skip="\\/"
945*11e3c5baSBram Moolenaar    \ end="/"
946*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum
947*11e3c5baSBram Moolenaar
948*11e3c5baSBram Moolenaar" m:P5!!
949*11e3c5baSBram Moolenaarsyn region rakuMatch
950*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
951*11e3c5baSBram Moolenaar    \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=!"
952*11e3c5baSBram Moolenaar    \ skip="\\!"
953*11e3c5baSBram Moolenaar    \ end="!"
954*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5,rakuVariable,rakuVarSlash,rakuVarMatch,rakuVarNum
955*11e3c5baSBram Moolenaar
956*11e3c5baSBram Moolenaar" m:P5$$, m:P5||, etc
957*11e3c5baSBram Moolenaarsyn region rakuMatch
958*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
959*11e3c5baSBram Moolenaar    \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=\z([\"'`|,$]\)"
960*11e3c5baSBram Moolenaar    \ skip="\\\z1"
961*11e3c5baSBram Moolenaar    \ end="\z1"
962*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5,@rakuVariables
963*11e3c5baSBram Moolenaar
964*11e3c5baSBram Moolenaar" m:P5 ()
965*11e3c5baSBram Moolenaarsyn region rakuMatch
966*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
967*11e3c5baSBram Moolenaar    \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s\+\)\@<=()\@!"
968*11e3c5baSBram Moolenaar    \ skip="\\)"
969*11e3c5baSBram Moolenaar    \ end=")"
970*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5,@rakuVariables
971*11e3c5baSBram Moolenaar
972*11e3c5baSBram Moolenaar" m:P5[]
973*11e3c5baSBram Moolenaarsyn region rakuMatch
974*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
975*11e3c5baSBram Moolenaar    \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=[]\@!"
976*11e3c5baSBram Moolenaar    \ skip="\\]"
977*11e3c5baSBram Moolenaar    \ end="]"
978*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5,@rakuVariables
979*11e3c5baSBram Moolenaar
980*11e3c5baSBram Moolenaar" m:P5{}
981*11e3c5baSBram Moolenaarsyn region rakuMatch
982*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
983*11e3c5baSBram Moolenaar    \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<={}\@!"
984*11e3c5baSBram Moolenaar    \ skip="\\}"
985*11e3c5baSBram Moolenaar    \ end="}"
986*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5,rakuVariables
987*11e3c5baSBram Moolenaar
988*11e3c5baSBram Moolenaar" m:P5<>
989*11e3c5baSBram Moolenaarsyn region rakuMatch
990*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
991*11e3c5baSBram Moolenaar    \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=<>\@!"
992*11e3c5baSBram Moolenaar    \ skip="\\>"
993*11e3c5baSBram Moolenaar    \ end=">"
994*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5,rakuVariables
995*11e3c5baSBram Moolenaar
996*11e3c5baSBram Moolenaar" m:P5«»
997*11e3c5baSBram Moolenaarsyn region rakuMatch
998*11e3c5baSBram Moolenaar    \ matchgroup=rakuQuote
999*11e3c5baSBram Moolenaar    \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=«»\@!"
1000*11e3c5baSBram Moolenaar    \ skip="\\»"
1001*11e3c5baSBram Moolenaar    \ end="»"
1002*11e3c5baSBram Moolenaar    \ contains=@rakuRegexP5,rakuVariables
1003*11e3c5baSBram Moolenaar
1004*11e3c5baSBram Moolenaarendif
1005*11e3c5baSBram Moolenaar
1006*11e3c5baSBram Moolenaar" Comments
1007*11e3c5baSBram Moolenaar
1008*11e3c5baSBram Moolenaarsyn match rakuAttention display "\<\%(ACHTUNG\|ATTN\|ATTENTION\|FIXME\|NB\|TODO\|TBD\|WTF\|XXX\|NOTE\)" contained
1009*11e3c5baSBram Moolenaar
1010*11e3c5baSBram Moolenaar" normal end-of-line comment
1011*11e3c5baSBram Moolenaarsyn match rakuComment display "#.*" contains=rakuAttention
1012*11e3c5baSBram Moolenaar
1013*11e3c5baSBram Moolenaar" Multiline comments. Arbitrary numbers of opening brackets are allowed,
1014*11e3c5baSBram Moolenaar" but we only define regions for 1 to 3
1015*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1016*11e3c5baSBram Moolenaar    \ start="#[`|=]("
1017*11e3c5baSBram Moolenaar    \ skip="([^)]*)"
1018*11e3c5baSBram Moolenaar    \ end=")"
1019*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1020*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1021*11e3c5baSBram Moolenaar    \ start="#[`|=]\["
1022*11e3c5baSBram Moolenaar    \ skip="\[[^\]]*]"
1023*11e3c5baSBram Moolenaar    \ end="]"
1024*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1025*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1026*11e3c5baSBram Moolenaar    \ start="#[`|=]{"
1027*11e3c5baSBram Moolenaar    \ skip="{[^}]*}"
1028*11e3c5baSBram Moolenaar    \ end="}"
1029*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1030*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1031*11e3c5baSBram Moolenaar    \ start="#[`|=]<"
1032*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1033*11e3c5baSBram Moolenaar    \ end=">"
1034*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1035*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1036*11e3c5baSBram Moolenaar    \ start="#[`|=]«"
1037*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1038*11e3c5baSBram Moolenaar    \ end="»"
1039*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1040*11e3c5baSBram Moolenaar
1041*11e3c5baSBram Moolenaar" Comments with double and triple delimiters
1042*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1043*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1044*11e3c5baSBram Moolenaar    \ start="#[`|=](("
1045*11e3c5baSBram Moolenaar    \ skip="((\%([^)\|))\@!]\)*))"
1046*11e3c5baSBram Moolenaar    \ end="))"
1047*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1048*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1049*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1050*11e3c5baSBram Moolenaar    \ start="#[`|=]((("
1051*11e3c5baSBram Moolenaar    \ skip="(((\%([^)]\|)\%())\)\@!\)*)))"
1052*11e3c5baSBram Moolenaar    \ end=")))"
1053*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1054*11e3c5baSBram Moolenaar
1055*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1056*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1057*11e3c5baSBram Moolenaar    \ start="#[`|=]\[\["
1058*11e3c5baSBram Moolenaar    \ skip="\[\[\%([^\]]\|]]\@!\)*]]"
1059*11e3c5baSBram Moolenaar    \ end="]]"
1060*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1061*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1062*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1063*11e3c5baSBram Moolenaar    \ start="#[`|=]\[\[\["
1064*11e3c5baSBram Moolenaar    \ skip="\[\[\[\%([^\]]\|]\%(]]\)\@!\)*]]]"
1065*11e3c5baSBram Moolenaar    \ end="]]]"
1066*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1067*11e3c5baSBram Moolenaar
1068*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1069*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1070*11e3c5baSBram Moolenaar    \ start="#[`|=]{{"
1071*11e3c5baSBram Moolenaar    \ skip="{{\%([^}]\|}}\@!\)*}}"
1072*11e3c5baSBram Moolenaar    \ end="}}"
1073*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1074*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1075*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1076*11e3c5baSBram Moolenaar    \ start="#[`|=]{{{"
1077*11e3c5baSBram Moolenaar    \ skip="{{{\%([^}]\|}\%(}}\)\@!\)*}}}"
1078*11e3c5baSBram Moolenaar    \ end="}}}"
1079*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1080*11e3c5baSBram Moolenaar
1081*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1082*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1083*11e3c5baSBram Moolenaar    \ start="#[`|=]<<"
1084*11e3c5baSBram Moolenaar    \ skip="<<\%([^>]\|>>\@!\)*>>"
1085*11e3c5baSBram Moolenaar    \ end=">>"
1086*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1087*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1088*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1089*11e3c5baSBram Moolenaar    \ start="#[`|=]<<<"
1090*11e3c5baSBram Moolenaar    \ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>"
1091*11e3c5baSBram Moolenaar    \ end=">>>"
1092*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1093*11e3c5baSBram Moolenaar
1094*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1095*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1096*11e3c5baSBram Moolenaar    \ start="#[`|=]««"
1097*11e3c5baSBram Moolenaar    \ skip="««\%([^»]\|»»\@!\)*»»"
1098*11e3c5baSBram Moolenaar    \ end="»»"
1099*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1100*11e3c5baSBram Moolenaarsyn region rakuBracketComment
1101*11e3c5baSBram Moolenaar    \ matchgroup=rakuBracketComment
1102*11e3c5baSBram Moolenaar    \ start="#[`|=]«««"
1103*11e3c5baSBram Moolenaar    \ skip="«««\%([^»]\|»\%(»»\)\@!\)*»»»"
1104*11e3c5baSBram Moolenaar    \ end="»»»"
1105*11e3c5baSBram Moolenaar    \ contains=rakuAttention,rakuBracketComment
1106*11e3c5baSBram Moolenaar
1107*11e3c5baSBram Moolenaarsyn match rakuShebang display "\%^#!.*"
1108*11e3c5baSBram Moolenaar
1109*11e3c5baSBram Moolenaar" => autoquoting
1110*11e3c5baSBram Moolenaarsyn match rakuStringAuto   display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\%(p5\)\@2<![RSXZ]\@1<!=>"
1111*11e3c5baSBram Moolenaarsyn match rakuStringAuto   display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\s\+=>"
1112*11e3c5baSBram Moolenaarsyn match rakuStringAuto   display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)p5\ze=>"
1113*11e3c5baSBram Moolenaar
1114*11e3c5baSBram Moolenaar" Pod
1115*11e3c5baSBram Moolenaar
1116*11e3c5baSBram Moolenaar" Abbreviated blocks (implicit code forbidden)
1117*11e3c5baSBram Moolenaarsyn region rakuPodAbbrRegion
1118*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1119*11e3c5baSBram Moolenaar    \ start="^\s*\zs=\ze\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1120*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1121*11e3c5baSBram Moolenaar    \ contains=rakuPodAbbrNoCodeType
1122*11e3c5baSBram Moolenaar    \ keepend
1123*11e3c5baSBram Moolenaar
1124*11e3c5baSBram Moolenaarsyn region rakuPodAbbrNoCodeType
1125*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1126*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1127*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1128*11e3c5baSBram Moolenaar    \ contained
1129*11e3c5baSBram Moolenaar    \ contains=rakuPodName,rakuPodAbbrNoCode
1130*11e3c5baSBram Moolenaar
1131*11e3c5baSBram Moolenaarsyn match rakuPodName contained ".\+" contains=@rakuPodFormat
1132*11e3c5baSBram Moolenaarsyn match rakuPodComment contained ".\+"
1133*11e3c5baSBram Moolenaar
1134*11e3c5baSBram Moolenaarsyn region rakuPodAbbrNoCode
1135*11e3c5baSBram Moolenaar    \ start="^"
1136*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1137*11e3c5baSBram Moolenaar    \ contained
1138*11e3c5baSBram Moolenaar    \ contains=@rakuPodFormat
1139*11e3c5baSBram Moolenaar
1140*11e3c5baSBram Moolenaar" Abbreviated blocks (everything is code)
1141*11e3c5baSBram Moolenaarsyn region rakuPodAbbrRegion
1142*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1143*11e3c5baSBram Moolenaar    \ start="^\s*\zs=\zecode\>"
1144*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1145*11e3c5baSBram Moolenaar    \ contains=rakuPodAbbrCodeType
1146*11e3c5baSBram Moolenaar    \ keepend
1147*11e3c5baSBram Moolenaar
1148*11e3c5baSBram Moolenaarsyn region rakuPodAbbrCodeType
1149*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1150*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1151*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1152*11e3c5baSBram Moolenaar    \ contained
1153*11e3c5baSBram Moolenaar    \ contains=rakuPodName,rakuPodAbbrCode
1154*11e3c5baSBram Moolenaar
1155*11e3c5baSBram Moolenaarsyn region rakuPodAbbrCode
1156*11e3c5baSBram Moolenaar    \ start="^"
1157*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1158*11e3c5baSBram Moolenaar    \ contained
1159*11e3c5baSBram Moolenaar
1160*11e3c5baSBram Moolenaar" Abbreviated blocks (everything is a comment)
1161*11e3c5baSBram Moolenaarsyn region rakuPodAbbrRegion
1162*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1163*11e3c5baSBram Moolenaar    \ start="^=\zecomment\>"
1164*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1165*11e3c5baSBram Moolenaar    \ contains=rakuPodAbbrCommentType
1166*11e3c5baSBram Moolenaar    \ keepend
1167*11e3c5baSBram Moolenaar
1168*11e3c5baSBram Moolenaarsyn region rakuPodAbbrCommentType
1169*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1170*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1171*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1172*11e3c5baSBram Moolenaar    \ contained
1173*11e3c5baSBram Moolenaar    \ contains=rakuPodComment,rakuPodAbbrNoCode
1174*11e3c5baSBram Moolenaar
1175*11e3c5baSBram Moolenaar" Abbreviated blocks (implicit code allowed)
1176*11e3c5baSBram Moolenaarsyn region rakuPodAbbrRegion
1177*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1178*11e3c5baSBram Moolenaar    \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>"
1179*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1180*11e3c5baSBram Moolenaar    \ contains=rakuPodAbbrType
1181*11e3c5baSBram Moolenaar    \ keepend
1182*11e3c5baSBram Moolenaar
1183*11e3c5baSBram Moolenaarsyn region rakuPodAbbrType
1184*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1185*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1186*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1187*11e3c5baSBram Moolenaar    \ contained
1188*11e3c5baSBram Moolenaar    \ contains=rakuPodName,rakuPodAbbr
1189*11e3c5baSBram Moolenaar
1190*11e3c5baSBram Moolenaarsyn region rakuPodAbbr
1191*11e3c5baSBram Moolenaar    \ start="^"
1192*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1193*11e3c5baSBram Moolenaar    \ contained
1194*11e3c5baSBram Moolenaar    \ contains=@rakuPodFormat,rakuPodImplicitCode
1195*11e3c5baSBram Moolenaar
1196*11e3c5baSBram Moolenaar" Abbreviated block to end-of-file
1197*11e3c5baSBram Moolenaarsyn region rakuPodAbbrRegion
1198*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1199*11e3c5baSBram Moolenaar    \ start="^=\zeEND\>"
1200*11e3c5baSBram Moolenaar    \ end="\%$"
1201*11e3c5baSBram Moolenaar    \ contains=rakuPodAbbrEOFType
1202*11e3c5baSBram Moolenaar    \ keepend
1203*11e3c5baSBram Moolenaar
1204*11e3c5baSBram Moolenaarsyn region rakuPodAbbrEOFType
1205*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1206*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1207*11e3c5baSBram Moolenaar    \ end="\%$"
1208*11e3c5baSBram Moolenaar    \ contained
1209*11e3c5baSBram Moolenaar    \ contains=rakuPodName,rakuPodAbbrEOF
1210*11e3c5baSBram Moolenaar
1211*11e3c5baSBram Moolenaarsyn region rakuPodAbbrEOF
1212*11e3c5baSBram Moolenaar    \ start="^"
1213*11e3c5baSBram Moolenaar    \ end="\%$"
1214*11e3c5baSBram Moolenaar    \ contained
1215*11e3c5baSBram Moolenaar    \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
1216*11e3c5baSBram Moolenaar
1217*11e3c5baSBram Moolenaar" Directives
1218*11e3c5baSBram Moolenaarsyn region rakuPodDirectRegion
1219*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1220*11e3c5baSBram Moolenaar    \ start="^=\%(config\|use\)\>"
1221*11e3c5baSBram Moolenaar    \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
1222*11e3c5baSBram Moolenaar    \ contains=rakuPodDirectArgRegion
1223*11e3c5baSBram Moolenaar    \ keepend
1224*11e3c5baSBram Moolenaar
1225*11e3c5baSBram Moolenaarsyn region rakuPodDirectArgRegion
1226*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1227*11e3c5baSBram Moolenaar    \ start="\S\+"
1228*11e3c5baSBram Moolenaar    \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
1229*11e3c5baSBram Moolenaar    \ contained
1230*11e3c5baSBram Moolenaar    \ contains=rakuPodDirectConfigRegion
1231*11e3c5baSBram Moolenaar
1232*11e3c5baSBram Moolenaarsyn region rakuPodDirectConfigRegion
1233*11e3c5baSBram Moolenaar    \ start=""
1234*11e3c5baSBram Moolenaar    \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
1235*11e3c5baSBram Moolenaar    \ contained
1236*11e3c5baSBram Moolenaar    \ contains=@rakuPodConfig
1237*11e3c5baSBram Moolenaar
1238*11e3c5baSBram Moolenaar" =encoding is a special directive
1239*11e3c5baSBram Moolenaarsyn region rakuPodDirectRegion
1240*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1241*11e3c5baSBram Moolenaar    \ start="^=encoding\>"
1242*11e3c5baSBram Moolenaar    \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
1243*11e3c5baSBram Moolenaar    \ contains=rakuPodEncodingArgRegion
1244*11e3c5baSBram Moolenaar    \ keepend
1245*11e3c5baSBram Moolenaar
1246*11e3c5baSBram Moolenaarsyn region rakuPodEncodingArgRegion
1247*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodName
1248*11e3c5baSBram Moolenaar    \ start="\S\+"
1249*11e3c5baSBram Moolenaar    \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
1250*11e3c5baSBram Moolenaar    \ contained
1251*11e3c5baSBram Moolenaar
1252*11e3c5baSBram Moolenaar" Paragraph blocks (implicit code forbidden)
1253*11e3c5baSBram Moolenaarsyn region rakuPodParaRegion
1254*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1255*11e3c5baSBram Moolenaar    \ start="^\s*\zs=for\>"
1256*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1257*11e3c5baSBram Moolenaar    \ contains=rakuPodParaNoCodeTypeRegion
1258*11e3c5baSBram Moolenaar    \ keepend extend
1259*11e3c5baSBram Moolenaar
1260*11e3c5baSBram Moolenaarsyn region rakuPodParaNoCodeTypeRegion
1261*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1262*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1263*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1264*11e3c5baSBram Moolenaar    \ contained
1265*11e3c5baSBram Moolenaar    \ contains=rakuPodParaNoCode,rakuPodParaConfigRegion
1266*11e3c5baSBram Moolenaar
1267*11e3c5baSBram Moolenaarsyn region rakuPodParaConfigRegion
1268*11e3c5baSBram Moolenaar    \ start=""
1269*11e3c5baSBram Moolenaar    \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\@1<!\)"
1270*11e3c5baSBram Moolenaar    \ contained
1271*11e3c5baSBram Moolenaar    \ contains=@rakuPodConfig
1272*11e3c5baSBram Moolenaar
1273*11e3c5baSBram Moolenaarsyn region rakuPodParaNoCode
1274*11e3c5baSBram Moolenaar    \ start="^[^=]"
1275*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1276*11e3c5baSBram Moolenaar    \ contained
1277*11e3c5baSBram Moolenaar    \ contains=@rakuPodFormat
1278*11e3c5baSBram Moolenaar
1279*11e3c5baSBram Moolenaar" Paragraph blocks (everything is code)
1280*11e3c5baSBram Moolenaarsyn region rakuPodParaRegion
1281*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1282*11e3c5baSBram Moolenaar    \ start="^\s*\zs=for\>\ze\s*code\>"
1283*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1284*11e3c5baSBram Moolenaar    \ contains=rakuPodParaCodeTypeRegion
1285*11e3c5baSBram Moolenaar    \ keepend extend
1286*11e3c5baSBram Moolenaar
1287*11e3c5baSBram Moolenaarsyn region rakuPodParaCodeTypeRegion
1288*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1289*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1290*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1291*11e3c5baSBram Moolenaar    \ contained
1292*11e3c5baSBram Moolenaar    \ contains=rakuPodParaCode,rakuPodParaConfigRegion
1293*11e3c5baSBram Moolenaar
1294*11e3c5baSBram Moolenaarsyn region rakuPodParaCode
1295*11e3c5baSBram Moolenaar    \ start="^[^=]"
1296*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1297*11e3c5baSBram Moolenaar    \ contained
1298*11e3c5baSBram Moolenaar
1299*11e3c5baSBram Moolenaar" Paragraph blocks (implicit code allowed)
1300*11e3c5baSBram Moolenaarsyn region rakuPodParaRegion
1301*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1302*11e3c5baSBram Moolenaar    \ start="^\s*\zs=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
1303*11e3c5baSBram Moolenaar    \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1304*11e3c5baSBram Moolenaar    \ contains=rakuPodParaTypeRegion
1305*11e3c5baSBram Moolenaar    \ keepend extend
1306*11e3c5baSBram Moolenaar
1307*11e3c5baSBram Moolenaarsyn region rakuPodParaTypeRegion
1308*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1309*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1310*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1311*11e3c5baSBram Moolenaar    \ contained
1312*11e3c5baSBram Moolenaar    \ contains=rakuPodPara,rakuPodParaConfigRegion
1313*11e3c5baSBram Moolenaar
1314*11e3c5baSBram Moolenaarsyn region rakuPodPara
1315*11e3c5baSBram Moolenaar    \ start="^[^=]"
1316*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
1317*11e3c5baSBram Moolenaar    \ contained
1318*11e3c5baSBram Moolenaar    \ contains=@rakuPodFormat,rakuPodImplicitCode
1319*11e3c5baSBram Moolenaar
1320*11e3c5baSBram Moolenaar" Paragraph block to end-of-file
1321*11e3c5baSBram Moolenaarsyn region rakuPodParaRegion
1322*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1323*11e3c5baSBram Moolenaar    \ start="^=for\>\ze\s\+END\>"
1324*11e3c5baSBram Moolenaar    \ end="\%$"
1325*11e3c5baSBram Moolenaar    \ contains=rakuPodParaEOFTypeRegion
1326*11e3c5baSBram Moolenaar    \ keepend extend
1327*11e3c5baSBram Moolenaar
1328*11e3c5baSBram Moolenaarsyn region rakuPodParaEOFTypeRegion
1329*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1330*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1331*11e3c5baSBram Moolenaar    \ end="\%$"
1332*11e3c5baSBram Moolenaar    \ contained
1333*11e3c5baSBram Moolenaar    \ contains=rakuPodParaEOF,rakuPodParaConfigRegion
1334*11e3c5baSBram Moolenaar
1335*11e3c5baSBram Moolenaarsyn region rakuPodParaEOF
1336*11e3c5baSBram Moolenaar    \ start="^[^=]"
1337*11e3c5baSBram Moolenaar    \ end="\%$"
1338*11e3c5baSBram Moolenaar    \ contained
1339*11e3c5baSBram Moolenaar    \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
1340*11e3c5baSBram Moolenaar
1341*11e3c5baSBram Moolenaar" Delimited blocks (implicit code forbidden)
1342*11e3c5baSBram Moolenaarsyn region rakuPodDelimRegion
1343*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1344*11e3c5baSBram Moolenaar    \ start="^\z(\s*\)\zs=begin\>"
1345*11e3c5baSBram Moolenaar    \ end="^\z1\zs=end\>"
1346*11e3c5baSBram Moolenaar    \ contains=rakuPodDelimNoCodeTypeRegion
1347*11e3c5baSBram Moolenaar    \ keepend extend skipwhite
1348*11e3c5baSBram Moolenaar    \ nextgroup=rakuPodType
1349*11e3c5baSBram Moolenaar
1350*11e3c5baSBram Moolenaarsyn region rakuPodDelimNoCodeTypeRegion
1351*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1352*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1353*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze=end\>"
1354*11e3c5baSBram Moolenaar    \ contained
1355*11e3c5baSBram Moolenaar    \ contains=rakuPodDelimNoCode,rakuPodDelimConfigRegion
1356*11e3c5baSBram Moolenaar
1357*11e3c5baSBram Moolenaarsyn region rakuPodDelimConfigRegion
1358*11e3c5baSBram Moolenaar    \ start=""
1359*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
1360*11e3c5baSBram Moolenaar    \ contained
1361*11e3c5baSBram Moolenaar    \ contains=@rakuPodConfig
1362*11e3c5baSBram Moolenaar
1363*11e3c5baSBram Moolenaarsyn region rakuPodDelimNoCode
1364*11e3c5baSBram Moolenaar    \ start="^"
1365*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze=end\>"
1366*11e3c5baSBram Moolenaar    \ contained
1367*11e3c5baSBram Moolenaar    \ contains=@rakuPodNestedBlocks,@rakuPodFormat
1368*11e3c5baSBram Moolenaar
1369*11e3c5baSBram Moolenaar" Delimited blocks (everything is code)
1370*11e3c5baSBram Moolenaarsyn region rakuPodDelimRegion
1371*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1372*11e3c5baSBram Moolenaar    \ start="^\z(\s*\)\zs=begin\>\ze\s*code\>"
1373*11e3c5baSBram Moolenaar    \ end="^\z1\zs=end\>"
1374*11e3c5baSBram Moolenaar    \ contains=rakuPodDelimCodeTypeRegion
1375*11e3c5baSBram Moolenaar    \ keepend extend skipwhite
1376*11e3c5baSBram Moolenaar    \ nextgroup=rakuPodType
1377*11e3c5baSBram Moolenaar
1378*11e3c5baSBram Moolenaarsyn region rakuPodDelimCodeTypeRegion
1379*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1380*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1381*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze=end\>"
1382*11e3c5baSBram Moolenaar    \ contained
1383*11e3c5baSBram Moolenaar    \ contains=rakuPodDelimCode,rakuPodDelimConfigRegion
1384*11e3c5baSBram Moolenaar
1385*11e3c5baSBram Moolenaarsyn region rakuPodDelimCode
1386*11e3c5baSBram Moolenaar    \ start="^"
1387*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze=end\>"
1388*11e3c5baSBram Moolenaar    \ contained
1389*11e3c5baSBram Moolenaar    \ contains=@rakuPodNestedBlocks
1390*11e3c5baSBram Moolenaar
1391*11e3c5baSBram Moolenaar" Delimited blocks (implicit code allowed)
1392*11e3c5baSBram Moolenaarsyn region rakuPodDelimRegion
1393*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1394*11e3c5baSBram Moolenaar    \ start="^\z(\s*\)\zs=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
1395*11e3c5baSBram Moolenaar    \ end="^\z1\zs=end\>"
1396*11e3c5baSBram Moolenaar    \ contains=rakuPodDelimTypeRegion
1397*11e3c5baSBram Moolenaar    \ keepend extend skipwhite
1398*11e3c5baSBram Moolenaar    \ nextgroup=rakuPodType
1399*11e3c5baSBram Moolenaar
1400*11e3c5baSBram Moolenaarsyn region rakuPodDelimTypeRegion
1401*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1402*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1403*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze=end\>"
1404*11e3c5baSBram Moolenaar    \ contained
1405*11e3c5baSBram Moolenaar    \ contains=rakuPodDelim,rakuPodDelimConfigRegion
1406*11e3c5baSBram Moolenaar
1407*11e3c5baSBram Moolenaarsyn region rakuPodDelim
1408*11e3c5baSBram Moolenaar    \ start="^"
1409*11e3c5baSBram Moolenaar    \ end="^\s*\zs\ze=end\>"
1410*11e3c5baSBram Moolenaar    \ contained
1411*11e3c5baSBram Moolenaar    \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
1412*11e3c5baSBram Moolenaar
1413*11e3c5baSBram Moolenaar" Delimited block to end-of-file
1414*11e3c5baSBram Moolenaarsyn region rakuPodDelimRegion
1415*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodPrefix
1416*11e3c5baSBram Moolenaar    \ start="^=begin\>\ze\s\+END\>"
1417*11e3c5baSBram Moolenaar    \ end="\%$"
1418*11e3c5baSBram Moolenaar    \ extend
1419*11e3c5baSBram Moolenaar    \ contains=rakuPodDelimEOFTypeRegion
1420*11e3c5baSBram Moolenaar
1421*11e3c5baSBram Moolenaarsyn region rakuPodDelimEOFTypeRegion
1422*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodType
1423*11e3c5baSBram Moolenaar    \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1424*11e3c5baSBram Moolenaar    \ end="\%$"
1425*11e3c5baSBram Moolenaar    \ contained
1426*11e3c5baSBram Moolenaar    \ contains=rakuPodDelimEOF,rakuPodDelimConfigRegion
1427*11e3c5baSBram Moolenaar
1428*11e3c5baSBram Moolenaarsyn region rakuPodDelimEOF
1429*11e3c5baSBram Moolenaar    \ start="^"
1430*11e3c5baSBram Moolenaar    \ end="\%$"
1431*11e3c5baSBram Moolenaar    \ contained
1432*11e3c5baSBram Moolenaar    \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
1433*11e3c5baSBram Moolenaar
1434*11e3c5baSBram Moolenaarsyn cluster rakuPodConfig
1435*11e3c5baSBram Moolenaar    \ add=rakuPodConfigOperator
1436*11e3c5baSBram Moolenaar    \ add=rakuPodExtraConfig
1437*11e3c5baSBram Moolenaar    \ add=rakuStringAuto
1438*11e3c5baSBram Moolenaar    \ add=rakuPodAutoQuote
1439*11e3c5baSBram Moolenaar    \ add=rakuStringSQ
1440*11e3c5baSBram Moolenaar
1441*11e3c5baSBram Moolenaarsyn region rakuPodParens
1442*11e3c5baSBram Moolenaar    \ start="("
1443*11e3c5baSBram Moolenaar    \ end=")"
1444*11e3c5baSBram Moolenaar    \ contained
1445*11e3c5baSBram Moolenaar    \ contains=rakuNumber,rakuStringSQ
1446*11e3c5baSBram Moolenaar
1447*11e3c5baSBram Moolenaarsyn match rakuPodAutoQuote      display contained "=>"
1448*11e3c5baSBram Moolenaarsyn match rakuPodConfigOperator display contained ":!\?" nextgroup=rakuPodConfigOption
1449*11e3c5baSBram Moolenaarsyn match rakuPodConfigOption   display contained "[^[:space:](<]\+" nextgroup=rakuPodParens,rakuStringAngle
1450*11e3c5baSBram Moolenaarsyn match rakuPodExtraConfig    display contained "^="
1451*11e3c5baSBram Moolenaarsyn match rakuPodVerticalBar    display contained "|"
1452*11e3c5baSBram Moolenaarsyn match rakuPodColon          display contained ":"
1453*11e3c5baSBram Moolenaarsyn match rakuPodSemicolon      display contained ";"
1454*11e3c5baSBram Moolenaarsyn match rakuPodComma          display contained ","
1455*11e3c5baSBram Moolenaarsyn match rakuPodImplicitCode   display contained "^\s.*"
1456*11e3c5baSBram Moolenaarsyn match rakuPodType           display contained "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
1457*11e3c5baSBram Moolenaar
1458*11e3c5baSBram Moolenaar" These may appear inside delimited blocks
1459*11e3c5baSBram Moolenaarsyn cluster rakuPodNestedBlocks
1460*11e3c5baSBram Moolenaar    \ add=rakuPodAbbrRegion
1461*11e3c5baSBram Moolenaar    \ add=rakuPodDirectRegion
1462*11e3c5baSBram Moolenaar    \ add=rakuPodParaRegion
1463*11e3c5baSBram Moolenaar    \ add=rakuPodDelimRegion
1464*11e3c5baSBram Moolenaar
1465*11e3c5baSBram Moolenaar" Pod formatting codes
1466*11e3c5baSBram Moolenaar
1467*11e3c5baSBram Moolenaarsyn cluster rakuPodFormat
1468*11e3c5baSBram Moolenaar    \ add=rakuPodFormatOne
1469*11e3c5baSBram Moolenaar    \ add=rakuPodFormatTwo
1470*11e3c5baSBram Moolenaar    \ add=rakuPodFormatThree
1471*11e3c5baSBram Moolenaar    \ add=rakuPodFormatFrench
1472*11e3c5baSBram Moolenaar
1473*11e3c5baSBram Moolenaar" Balanced angles found inside formatting codes. Ensures proper nesting.
1474*11e3c5baSBram Moolenaar
1475*11e3c5baSBram Moolenaarsyn region rakuPodFormatAnglesOne
1476*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormat
1477*11e3c5baSBram Moolenaar    \ start="<"
1478*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1479*11e3c5baSBram Moolenaar    \ end=">"
1480*11e3c5baSBram Moolenaar    \ transparent contained
1481*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne
1482*11e3c5baSBram Moolenaar
1483*11e3c5baSBram Moolenaarsyn region rakuPodFormatAnglesTwo
1484*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormat
1485*11e3c5baSBram Moolenaar    \ start="<<"
1486*11e3c5baSBram Moolenaar    \ skip="<<[^>]*>>"
1487*11e3c5baSBram Moolenaar    \ end=">>"
1488*11e3c5baSBram Moolenaar    \ transparent contained
1489*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo
1490*11e3c5baSBram Moolenaar
1491*11e3c5baSBram Moolenaarsyn region rakuPodFormatAnglesThree
1492*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormat
1493*11e3c5baSBram Moolenaar    \ start="<<<"
1494*11e3c5baSBram Moolenaar    \ skip="<<<[^>]*>>>"
1495*11e3c5baSBram Moolenaar    \ end=">>>"
1496*11e3c5baSBram Moolenaar    \ transparent contained
1497*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree
1498*11e3c5baSBram Moolenaar
1499*11e3c5baSBram Moolenaarsyn region rakuPodFormatAnglesFrench
1500*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormat
1501*11e3c5baSBram Moolenaar    \ start="«"
1502*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1503*11e3c5baSBram Moolenaar    \ end="»"
1504*11e3c5baSBram Moolenaar    \ transparent contained
1505*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree
1506*11e3c5baSBram Moolenaar
1507*11e3c5baSBram Moolenaar" All formatting codes
1508*11e3c5baSBram Moolenaar
1509*11e3c5baSBram Moolenaarsyn region rakuPodFormatOne
1510*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1511*11e3c5baSBram Moolenaar    \ start="\u<"
1512*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1513*11e3c5baSBram Moolenaar    \ end=">"
1514*11e3c5baSBram Moolenaar    \ contained
1515*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne
1516*11e3c5baSBram Moolenaar
1517*11e3c5baSBram Moolenaarsyn region rakuPodFormatTwo
1518*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1519*11e3c5baSBram Moolenaar    \ start="\u<<"
1520*11e3c5baSBram Moolenaar    \ skip="<<[^>]*>>"
1521*11e3c5baSBram Moolenaar    \ end=">>"
1522*11e3c5baSBram Moolenaar    \ contained
1523*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo
1524*11e3c5baSBram Moolenaar
1525*11e3c5baSBram Moolenaarsyn region rakuPodFormatThree
1526*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1527*11e3c5baSBram Moolenaar    \ start="\u<<<"
1528*11e3c5baSBram Moolenaar    \ skip="<<<[^>]*>>>"
1529*11e3c5baSBram Moolenaar    \ end=">>>"
1530*11e3c5baSBram Moolenaar    \ contained
1531*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree
1532*11e3c5baSBram Moolenaar
1533*11e3c5baSBram Moolenaarsyn region rakuPodFormatFrench
1534*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1535*11e3c5baSBram Moolenaar    \ start="\u«"
1536*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1537*11e3c5baSBram Moolenaar    \ end="»"
1538*11e3c5baSBram Moolenaar    \ contained
1539*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree
1540*11e3c5baSBram Moolenaar
1541*11e3c5baSBram Moolenaar" C<> and V<> don't allow nested formatting formatting codes
1542*11e3c5baSBram Moolenaar
1543*11e3c5baSBram Moolenaarsyn region rakuPodFormatOne
1544*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1545*11e3c5baSBram Moolenaar    \ start="[CV]<"
1546*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1547*11e3c5baSBram Moolenaar    \ end=">"
1548*11e3c5baSBram Moolenaar    \ contained
1549*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesOne
1550*11e3c5baSBram Moolenaar
1551*11e3c5baSBram Moolenaarsyn region rakuPodFormatTwo
1552*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1553*11e3c5baSBram Moolenaar    \ start="[CV]<<"
1554*11e3c5baSBram Moolenaar    \ skip="<<[^>]*>>"
1555*11e3c5baSBram Moolenaar    \ end=">>"
1556*11e3c5baSBram Moolenaar    \ contained
1557*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesTwo
1558*11e3c5baSBram Moolenaar
1559*11e3c5baSBram Moolenaarsyn region rakuPodFormatThree
1560*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1561*11e3c5baSBram Moolenaar    \ start="[CV]<<<"
1562*11e3c5baSBram Moolenaar    \ skip="<<<[^>]*>>>"
1563*11e3c5baSBram Moolenaar    \ end=">>>"
1564*11e3c5baSBram Moolenaar    \ contained
1565*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesThree
1566*11e3c5baSBram Moolenaar
1567*11e3c5baSBram Moolenaarsyn region rakuPodFormatFrench
1568*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1569*11e3c5baSBram Moolenaar    \ start="[CV]«"
1570*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1571*11e3c5baSBram Moolenaar    \ end="»"
1572*11e3c5baSBram Moolenaar    \ contained
1573*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench
1574*11e3c5baSBram Moolenaar
1575*11e3c5baSBram Moolenaar" L<> can have a "|" separator
1576*11e3c5baSBram Moolenaar
1577*11e3c5baSBram Moolenaarsyn region rakuPodFormatOne
1578*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1579*11e3c5baSBram Moolenaar    \ start="L<"
1580*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1581*11e3c5baSBram Moolenaar    \ end=">"
1582*11e3c5baSBram Moolenaar    \ contained
1583*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar
1584*11e3c5baSBram Moolenaar
1585*11e3c5baSBram Moolenaarsyn region rakuPodFormatTwo
1586*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1587*11e3c5baSBram Moolenaar    \ start="L<<"
1588*11e3c5baSBram Moolenaar    \ skip="<<[^>]*>>"
1589*11e3c5baSBram Moolenaar    \ end=">>"
1590*11e3c5baSBram Moolenaar    \ contained
1591*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar
1592*11e3c5baSBram Moolenaar
1593*11e3c5baSBram Moolenaarsyn region rakuPodFormatThree
1594*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1595*11e3c5baSBram Moolenaar    \ start="L<<<"
1596*11e3c5baSBram Moolenaar    \ skip="<<<[^>]*>>>"
1597*11e3c5baSBram Moolenaar    \ end=">>>"
1598*11e3c5baSBram Moolenaar    \ contained
1599*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar
1600*11e3c5baSBram Moolenaar
1601*11e3c5baSBram Moolenaarsyn region rakuPodFormatFrench
1602*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1603*11e3c5baSBram Moolenaar    \ start="L«"
1604*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1605*11e3c5baSBram Moolenaar    \ end="»"
1606*11e3c5baSBram Moolenaar    \ contained
1607*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar
1608*11e3c5baSBram Moolenaar
1609*11e3c5baSBram Moolenaar" E<> can have a ";" separator
1610*11e3c5baSBram Moolenaar
1611*11e3c5baSBram Moolenaarsyn region rakuPodFormatOne
1612*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1613*11e3c5baSBram Moolenaar    \ start="E<"
1614*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1615*11e3c5baSBram Moolenaar    \ end=">"
1616*11e3c5baSBram Moolenaar    \ contained
1617*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodSemiColon
1618*11e3c5baSBram Moolenaar
1619*11e3c5baSBram Moolenaarsyn region rakuPodFormatTwo
1620*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1621*11e3c5baSBram Moolenaar    \ start="E<<"
1622*11e3c5baSBram Moolenaar    \ skip="<<[^>]*>>"
1623*11e3c5baSBram Moolenaar    \ end=">>"
1624*11e3c5baSBram Moolenaar    \ contained
1625*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodSemiColon
1626*11e3c5baSBram Moolenaar
1627*11e3c5baSBram Moolenaarsyn region rakuPodFormatThree
1628*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1629*11e3c5baSBram Moolenaar    \ start="E<<<"
1630*11e3c5baSBram Moolenaar    \ skip="<<<[^>]*>>>"
1631*11e3c5baSBram Moolenaar    \ end=">>>"
1632*11e3c5baSBram Moolenaar    \ contained
1633*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon
1634*11e3c5baSBram Moolenaar
1635*11e3c5baSBram Moolenaarsyn region rakuPodFormatFrench
1636*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1637*11e3c5baSBram Moolenaar    \ start="E«"
1638*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1639*11e3c5baSBram Moolenaar    \ end="»"
1640*11e3c5baSBram Moolenaar    \ contained
1641*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon
1642*11e3c5baSBram Moolenaar
1643*11e3c5baSBram Moolenaar" M<> can have a ":" separator
1644*11e3c5baSBram Moolenaar
1645*11e3c5baSBram Moolenaarsyn region rakuPodFormatOne
1646*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1647*11e3c5baSBram Moolenaar    \ start="M<"
1648*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1649*11e3c5baSBram Moolenaar    \ end=">"
1650*11e3c5baSBram Moolenaar    \ contained
1651*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodColon
1652*11e3c5baSBram Moolenaar
1653*11e3c5baSBram Moolenaarsyn region rakuPodFormatTwo
1654*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1655*11e3c5baSBram Moolenaar    \ start="M<<"
1656*11e3c5baSBram Moolenaar    \ skip="<<[^>]*>>"
1657*11e3c5baSBram Moolenaar    \ end=">>"
1658*11e3c5baSBram Moolenaar    \ contained
1659*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodColon
1660*11e3c5baSBram Moolenaar
1661*11e3c5baSBram Moolenaarsyn region rakuPodFormatThree
1662*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1663*11e3c5baSBram Moolenaar    \ start="M<<<"
1664*11e3c5baSBram Moolenaar    \ skip="<<<[^>]*>>>"
1665*11e3c5baSBram Moolenaar    \ end=">>>"
1666*11e3c5baSBram Moolenaar    \ contained
1667*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon
1668*11e3c5baSBram Moolenaar
1669*11e3c5baSBram Moolenaarsyn region rakuPodFormatFrench
1670*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1671*11e3c5baSBram Moolenaar    \ start="M«"
1672*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1673*11e3c5baSBram Moolenaar    \ end="»"
1674*11e3c5baSBram Moolenaar    \ contained
1675*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon
1676*11e3c5baSBram Moolenaar
1677*11e3c5baSBram Moolenaar" D<> can have "|" and ";" separators
1678*11e3c5baSBram Moolenaar
1679*11e3c5baSBram Moolenaarsyn region rakuPodFormatOne
1680*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1681*11e3c5baSBram Moolenaar    \ start="D<"
1682*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1683*11e3c5baSBram Moolenaar    \ end=">"
1684*11e3c5baSBram Moolenaar    \ contained
1685*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon
1686*11e3c5baSBram Moolenaar
1687*11e3c5baSBram Moolenaarsyn region rakuPodFormatTwo
1688*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1689*11e3c5baSBram Moolenaar    \ start="D<<"
1690*11e3c5baSBram Moolenaar    \ skip="<<[^>]*>>"
1691*11e3c5baSBram Moolenaar    \ end=">>"
1692*11e3c5baSBram Moolenaar    \ contained
1693*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAngleTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon
1694*11e3c5baSBram Moolenaar
1695*11e3c5baSBram Moolenaarsyn region rakuPodFormatThree
1696*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1697*11e3c5baSBram Moolenaar    \ start="D<<<"
1698*11e3c5baSBram Moolenaar    \ skip="<<<[^>]*>>>"
1699*11e3c5baSBram Moolenaar    \ end=">>>"
1700*11e3c5baSBram Moolenaar    \ contained
1701*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon
1702*11e3c5baSBram Moolenaar
1703*11e3c5baSBram Moolenaarsyn region rakuPodFormatFrench
1704*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1705*11e3c5baSBram Moolenaar    \ start="D«"
1706*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1707*11e3c5baSBram Moolenaar    \ end="»"
1708*11e3c5baSBram Moolenaar    \ contained
1709*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon
1710*11e3c5baSBram Moolenaar
1711*11e3c5baSBram Moolenaar" X<> can have "|", "," and ";" separators
1712*11e3c5baSBram Moolenaar
1713*11e3c5baSBram Moolenaarsyn region rakuPodFormatOne
1714*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1715*11e3c5baSBram Moolenaar    \ start="X<"
1716*11e3c5baSBram Moolenaar    \ skip="<[^>]*>"
1717*11e3c5baSBram Moolenaar    \ end=">"
1718*11e3c5baSBram Moolenaar    \ contained
1719*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
1720*11e3c5baSBram Moolenaar
1721*11e3c5baSBram Moolenaarsyn region rakuPodFormatTwo
1722*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1723*11e3c5baSBram Moolenaar    \ start="X<<"
1724*11e3c5baSBram Moolenaar    \ skip="<<[^>]*>>"
1725*11e3c5baSBram Moolenaar    \ end=">>"
1726*11e3c5baSBram Moolenaar    \ contained
1727*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
1728*11e3c5baSBram Moolenaar
1729*11e3c5baSBram Moolenaarsyn region rakuPodFormatThree
1730*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1731*11e3c5baSBram Moolenaar    \ start="X<<<"
1732*11e3c5baSBram Moolenaar    \ skip="<<<[^>]*>>>"
1733*11e3c5baSBram Moolenaar    \ end=">>>"
1734*11e3c5baSBram Moolenaar    \ contained
1735*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
1736*11e3c5baSBram Moolenaar
1737*11e3c5baSBram Moolenaarsyn region rakuPodFormatFrench
1738*11e3c5baSBram Moolenaar    \ matchgroup=rakuPodFormatCode
1739*11e3c5baSBram Moolenaar    \ start="X«"
1740*11e3c5baSBram Moolenaar    \ skip="«[^»]*»"
1741*11e3c5baSBram Moolenaar    \ end="»"
1742*11e3c5baSBram Moolenaar    \ contained
1743*11e3c5baSBram Moolenaar    \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
1744*11e3c5baSBram Moolenaar
1745*11e3c5baSBram Moolenaar" Define the default highlighting.
1746*11e3c5baSBram Moolenaar" For version 5.7 and earlier: only when not done already
1747*11e3c5baSBram Moolenaar" For version 5.8 and later: only when an item doesn't have highlighting yet
1748*11e3c5baSBram Moolenaarif version >= 508 || !exists("did_raku_syntax_inits")
1749*11e3c5baSBram Moolenaar    if version < 508
1750*11e3c5baSBram Moolenaar        let did_raku_syntax_inits = 1
1751*11e3c5baSBram Moolenaar        command -nargs=+ HiLink hi link <args>
1752*11e3c5baSBram Moolenaar    else
1753*11e3c5baSBram Moolenaar        command -nargs=+ HiLink hi def link <args>
1754*11e3c5baSBram Moolenaar    endif
1755*11e3c5baSBram Moolenaar
1756*11e3c5baSBram Moolenaar    HiLink rakuEscOctOld        rakuError
1757*11e3c5baSBram Moolenaar    HiLink rakuPackageTwigil    rakuTwigil
1758*11e3c5baSBram Moolenaar    HiLink rakuStringAngle      rakuString
1759*11e3c5baSBram Moolenaar    HiLink rakuStringAngleFixed rakuString
1760*11e3c5baSBram Moolenaar    HiLink rakuStringFrench     rakuString
1761*11e3c5baSBram Moolenaar    HiLink rakuStringAngles     rakuString
1762*11e3c5baSBram Moolenaar    HiLink rakuStringSQ         rakuString
1763*11e3c5baSBram Moolenaar    HiLink rakuStringDQ         rakuString
1764*11e3c5baSBram Moolenaar    HiLink rakuStringQ          rakuString
1765*11e3c5baSBram Moolenaar    HiLink rakuStringQ_q        rakuString
1766*11e3c5baSBram Moolenaar    HiLink rakuStringQ_qww      rakuString
1767*11e3c5baSBram Moolenaar    HiLink rakuStringQ_qq       rakuString
1768*11e3c5baSBram Moolenaar    HiLink rakuStringQ_to       rakuString
1769*11e3c5baSBram Moolenaar    HiLink rakuStringQ_qto      rakuString
1770*11e3c5baSBram Moolenaar    HiLink rakuStringQ_qqto     rakuString
1771*11e3c5baSBram Moolenaar    HiLink rakuRxStringSQ       rakuString
1772*11e3c5baSBram Moolenaar    HiLink rakuRxStringDQ       rakuString
1773*11e3c5baSBram Moolenaar    HiLink rakuReplacement      rakuString
1774*11e3c5baSBram Moolenaar    HiLink rakuReplCurly        rakuString
1775*11e3c5baSBram Moolenaar    HiLink rakuReplAngle        rakuString
1776*11e3c5baSBram Moolenaar    HiLink rakuReplFrench       rakuString
1777*11e3c5baSBram Moolenaar    HiLink rakuReplBracket      rakuString
1778*11e3c5baSBram Moolenaar    HiLink rakuReplParen        rakuString
1779*11e3c5baSBram Moolenaar    HiLink rakuTransliteration  rakuString
1780*11e3c5baSBram Moolenaar    HiLink rakuTransRepl        rakuString
1781*11e3c5baSBram Moolenaar    HiLink rakuTransReplCurly   rakuString
1782*11e3c5baSBram Moolenaar    HiLink rakuTransReplAngle   rakuString
1783*11e3c5baSBram Moolenaar    HiLink rakuTransReplFrench  rakuString
1784*11e3c5baSBram Moolenaar    HiLink rakuTransReplBracket rakuString
1785*11e3c5baSBram Moolenaar    HiLink rakuTransReplParen   rakuString
1786*11e3c5baSBram Moolenaar    HiLink rakuStringAuto       rakuString
1787*11e3c5baSBram Moolenaar    HiLink rakuKey              rakuString
1788*11e3c5baSBram Moolenaar    HiLink rakuMatch            rakuString
1789*11e3c5baSBram Moolenaar    HiLink rakuSubstitution     rakuString
1790*11e3c5baSBram Moolenaar    HiLink rakuMatchBare        rakuString
1791*11e3c5baSBram Moolenaar    HiLink rakuRegexBlock       rakuString
1792*11e3c5baSBram Moolenaar    HiLink rakuRxP5CharClass    rakuString
1793*11e3c5baSBram Moolenaar    HiLink rakuRxP5QuoteMeta    rakuString
1794*11e3c5baSBram Moolenaar    HiLink rakuRxCharClass      rakuString
1795*11e3c5baSBram Moolenaar    HiLink rakuRxQuoteWords     rakuString
1796*11e3c5baSBram Moolenaar    HiLink rakuReduceOp         rakuOperator
1797*11e3c5baSBram Moolenaar    HiLink rakuSetOp            rakuOperator
1798*11e3c5baSBram Moolenaar    HiLink rakuRSXZOp           rakuOperator
1799*11e3c5baSBram Moolenaar    HiLink rakuHyperOp          rakuOperator
1800*11e3c5baSBram Moolenaar    HiLink rakuPostHyperOp      rakuOperator
1801*11e3c5baSBram Moolenaar    HiLink rakuQuoteQ           rakuQuote
1802*11e3c5baSBram Moolenaar    HiLink rakuQuoteQ_q         rakuQuote
1803*11e3c5baSBram Moolenaar    HiLink rakuQuoteQ_qww       rakuQuote
1804*11e3c5baSBram Moolenaar    HiLink rakuQuoteQ_qq        rakuQuote
1805*11e3c5baSBram Moolenaar    HiLink rakuQuoteQ_to        rakuQuote
1806*11e3c5baSBram Moolenaar    HiLink rakuQuoteQ_qto       rakuQuote
1807*11e3c5baSBram Moolenaar    HiLink rakuQuoteQ_qqto      rakuQuote
1808*11e3c5baSBram Moolenaar    HiLink rakuQuoteQ_PIR       rakuQuote
1809*11e3c5baSBram Moolenaar    HiLink rakuMatchStart_m     rakuQuote
1810*11e3c5baSBram Moolenaar    HiLink rakuMatchStart_s     rakuQuote
1811*11e3c5baSBram Moolenaar    HiLink rakuMatchStart_tr    rakuQuote
1812*11e3c5baSBram Moolenaar    HiLink rakuBareSigil        rakuVariable
1813*11e3c5baSBram Moolenaar    HiLink rakuRxRange          rakuStringSpecial
1814*11e3c5baSBram Moolenaar    HiLink rakuRxAnchor         rakuStringSpecial
1815*11e3c5baSBram Moolenaar    HiLink rakuRxBoundary       rakuStringSpecial
1816*11e3c5baSBram Moolenaar    HiLink rakuRxP5Anchor       rakuStringSpecial
1817*11e3c5baSBram Moolenaar    HiLink rakuCodePoint        rakuStringSpecial
1818*11e3c5baSBram Moolenaar    HiLink rakuRxMeta           rakuStringSpecial
1819*11e3c5baSBram Moolenaar    HiLink rakuRxP5Range        rakuStringSpecial
1820*11e3c5baSBram Moolenaar    HiLink rakuRxP5CPId         rakuStringSpecial
1821*11e3c5baSBram Moolenaar    HiLink rakuRxP5Posix        rakuStringSpecial
1822*11e3c5baSBram Moolenaar    HiLink rakuRxP5Mod          rakuStringSpecial
1823*11e3c5baSBram Moolenaar    HiLink rakuRxP5HexSeq       rakuStringSpecial
1824*11e3c5baSBram Moolenaar    HiLink rakuRxP5OctSeq       rakuStringSpecial
1825*11e3c5baSBram Moolenaar    HiLink rakuRxP5WriteRefId   rakuStringSpecial
1826*11e3c5baSBram Moolenaar    HiLink rakuHexSequence      rakuStringSpecial
1827*11e3c5baSBram Moolenaar    HiLink rakuOctSequence      rakuStringSpecial
1828*11e3c5baSBram Moolenaar    HiLink rakuRxP5Named        rakuStringSpecial
1829*11e3c5baSBram Moolenaar    HiLink rakuRxP5PropId       rakuStringSpecial
1830*11e3c5baSBram Moolenaar    HiLink rakuRxP5Quantifier   rakuStringSpecial
1831*11e3c5baSBram Moolenaar    HiLink rakuRxP5CountId      rakuStringSpecial
1832*11e3c5baSBram Moolenaar    HiLink rakuRxP5Verb         rakuStringSpecial
1833*11e3c5baSBram Moolenaar    HiLink rakuRxAssertGroup    rakuStringSpecial2
1834*11e3c5baSBram Moolenaar    HiLink rakuEscape           rakuStringSpecial2
1835*11e3c5baSBram Moolenaar    HiLink rakuEscNull          rakuStringSpecial2
1836*11e3c5baSBram Moolenaar    HiLink rakuEscHash          rakuStringSpecial2
1837*11e3c5baSBram Moolenaar    HiLink rakuEscQQ            rakuStringSpecial2
1838*11e3c5baSBram Moolenaar    HiLink rakuEscQuote         rakuStringSpecial2
1839*11e3c5baSBram Moolenaar    HiLink rakuEscDoubleQuote   rakuStringSpecial2
1840*11e3c5baSBram Moolenaar    HiLink rakuEscBackTick      rakuStringSpecial2
1841*11e3c5baSBram Moolenaar    HiLink rakuEscForwardSlash  rakuStringSpecial2
1842*11e3c5baSBram Moolenaar    HiLink rakuEscVerticalBar   rakuStringSpecial2
1843*11e3c5baSBram Moolenaar    HiLink rakuEscExclamation   rakuStringSpecial2
1844*11e3c5baSBram Moolenaar    HiLink rakuEscDollar        rakuStringSpecial2
1845*11e3c5baSBram Moolenaar    HiLink rakuEscOpenCurly     rakuStringSpecial2
1846*11e3c5baSBram Moolenaar    HiLink rakuEscCloseCurly    rakuStringSpecial2
1847*11e3c5baSBram Moolenaar    HiLink rakuEscCloseBracket  rakuStringSpecial2
1848*11e3c5baSBram Moolenaar    HiLink rakuEscCloseAngle    rakuStringSpecial2
1849*11e3c5baSBram Moolenaar    HiLink rakuEscCloseFrench   rakuStringSpecial2
1850*11e3c5baSBram Moolenaar    HiLink rakuEscBackSlash     rakuStringSpecial2
1851*11e3c5baSBram Moolenaar    HiLink rakuEscCodePoint     rakuStringSpecial2
1852*11e3c5baSBram Moolenaar    HiLink rakuEscOct           rakuStringSpecial2
1853*11e3c5baSBram Moolenaar    HiLink rakuEscHex           rakuStringSpecial2
1854*11e3c5baSBram Moolenaar    HiLink rakuRxEscape         rakuStringSpecial2
1855*11e3c5baSBram Moolenaar    HiLink rakuRxCapture        rakuStringSpecial2
1856*11e3c5baSBram Moolenaar    HiLink rakuRxAlternation    rakuStringSpecial2
1857*11e3c5baSBram Moolenaar    HiLink rakuRxP5             rakuStringSpecial2
1858*11e3c5baSBram Moolenaar    HiLink rakuRxP5ReadRef      rakuStringSpecial2
1859*11e3c5baSBram Moolenaar    HiLink rakuRxP5Oct          rakuStringSpecial2
1860*11e3c5baSBram Moolenaar    HiLink rakuRxP5Hex          rakuStringSpecial2
1861*11e3c5baSBram Moolenaar    HiLink rakuRxP5EscMeta      rakuStringSpecial2
1862*11e3c5baSBram Moolenaar    HiLink rakuRxP5Meta         rakuStringSpecial2
1863*11e3c5baSBram Moolenaar    HiLink rakuRxP5Escape       rakuStringSpecial2
1864*11e3c5baSBram Moolenaar    HiLink rakuRxP5CodePoint    rakuStringSpecial2
1865*11e3c5baSBram Moolenaar    HiLink rakuRxP5WriteRef     rakuStringSpecial2
1866*11e3c5baSBram Moolenaar    HiLink rakuRxP5Prop         rakuStringSpecial2
1867*11e3c5baSBram Moolenaar
1868*11e3c5baSBram Moolenaar    HiLink rakuProperty       Tag
1869*11e3c5baSBram Moolenaar    HiLink rakuAttention      Todo
1870*11e3c5baSBram Moolenaar    HiLink rakuType           Type
1871*11e3c5baSBram Moolenaar    HiLink rakuError          Error
1872*11e3c5baSBram Moolenaar    HiLink rakuBlockLabel     Label
1873*11e3c5baSBram Moolenaar    HiLink rakuNormal         Normal
1874*11e3c5baSBram Moolenaar    HiLink rakuIdentifier     Normal
1875*11e3c5baSBram Moolenaar    HiLink rakuPackage        Normal
1876*11e3c5baSBram Moolenaar    HiLink rakuPackageScope   Normal
1877*11e3c5baSBram Moolenaar    HiLink rakuNumber         Number
1878*11e3c5baSBram Moolenaar    HiLink rakuOctNumber      Number
1879*11e3c5baSBram Moolenaar    HiLink rakuBinNumber      Number
1880*11e3c5baSBram Moolenaar    HiLink rakuHexNumber      Number
1881*11e3c5baSBram Moolenaar    HiLink rakuDecNumber      Number
1882*11e3c5baSBram Moolenaar    HiLink rakuString         String
1883*11e3c5baSBram Moolenaar    HiLink rakuRepeat         Repeat
1884*11e3c5baSBram Moolenaar    HiLink rakuPragma         Keyword
1885*11e3c5baSBram Moolenaar    HiLink rakuPreDeclare     Keyword
1886*11e3c5baSBram Moolenaar    HiLink rakuDeclare        Keyword
1887*11e3c5baSBram Moolenaar    HiLink rakuDeclareRegex   Keyword
1888*11e3c5baSBram Moolenaar    HiLink rakuVarStorage     Special
1889*11e3c5baSBram Moolenaar    HiLink rakuFlowControl    Special
1890*11e3c5baSBram Moolenaar    HiLink rakuOctBase        Special
1891*11e3c5baSBram Moolenaar    HiLink rakuBinBase        Special
1892*11e3c5baSBram Moolenaar    HiLink rakuHexBase        Special
1893*11e3c5baSBram Moolenaar    HiLink rakuDecBase        Special
1894*11e3c5baSBram Moolenaar    HiLink rakuTwigil         Special
1895*11e3c5baSBram Moolenaar    HiLink rakuStringSpecial2 Special
1896*11e3c5baSBram Moolenaar    HiLink rakuVersion        Special
1897*11e3c5baSBram Moolenaar    HiLink rakuComment        Comment
1898*11e3c5baSBram Moolenaar    HiLink rakuBracketComment Comment
1899*11e3c5baSBram Moolenaar    HiLink rakuInclude        Include
1900*11e3c5baSBram Moolenaar    HiLink rakuShebang        PreProc
1901*11e3c5baSBram Moolenaar    HiLink rakuClosureTrait   PreProc
1902*11e3c5baSBram Moolenaar    HiLink rakuOperator       Operator
1903*11e3c5baSBram Moolenaar    HiLink rakuContext        Operator
1904*11e3c5baSBram Moolenaar    HiLink rakuQuote          Delimiter
1905*11e3c5baSBram Moolenaar    HiLink rakuTypeConstraint PreCondit
1906*11e3c5baSBram Moolenaar    HiLink rakuException      Exception
1907*11e3c5baSBram Moolenaar    HiLink rakuVariable       Identifier
1908*11e3c5baSBram Moolenaar    HiLink rakuVarSlash       Identifier
1909*11e3c5baSBram Moolenaar    HiLink rakuVarNum         Identifier
1910*11e3c5baSBram Moolenaar    HiLink rakuVarExclam      Identifier
1911*11e3c5baSBram Moolenaar    HiLink rakuVarMatch       Identifier
1912*11e3c5baSBram Moolenaar    HiLink rakuVarName        Identifier
1913*11e3c5baSBram Moolenaar    HiLink rakuMatchVar       Identifier
1914*11e3c5baSBram Moolenaar    HiLink rakuRxP5ReadRefId  Identifier
1915*11e3c5baSBram Moolenaar    HiLink rakuRxP5ModDef     Identifier
1916*11e3c5baSBram Moolenaar    HiLink rakuRxP5ModName    Identifier
1917*11e3c5baSBram Moolenaar    HiLink rakuConditional    Conditional
1918*11e3c5baSBram Moolenaar    HiLink rakuStringSpecial  SpecialChar
1919*11e3c5baSBram Moolenaar
1920*11e3c5baSBram Moolenaar    HiLink rakuPodAbbr         rakuPod
1921*11e3c5baSBram Moolenaar    HiLink rakuPodAbbrEOF      rakuPod
1922*11e3c5baSBram Moolenaar    HiLink rakuPodAbbrNoCode   rakuPod
1923*11e3c5baSBram Moolenaar    HiLink rakuPodAbbrCode     rakuPodCode
1924*11e3c5baSBram Moolenaar    HiLink rakuPodPara         rakuPod
1925*11e3c5baSBram Moolenaar    HiLink rakuPodParaEOF      rakuPod
1926*11e3c5baSBram Moolenaar    HiLink rakuPodParaNoCode   rakuPod
1927*11e3c5baSBram Moolenaar    HiLink rakuPodParaCode     rakuPodCode
1928*11e3c5baSBram Moolenaar    HiLink rakuPodDelim        rakuPod
1929*11e3c5baSBram Moolenaar    HiLink rakuPodDelimEOF     rakuPod
1930*11e3c5baSBram Moolenaar    HiLink rakuPodDelimNoCode  rakuPod
1931*11e3c5baSBram Moolenaar    HiLink rakuPodDelimCode    rakuPodCode
1932*11e3c5baSBram Moolenaar    HiLink rakuPodImplicitCode rakuPodCode
1933*11e3c5baSBram Moolenaar    HiLink rakuPodExtraConfig  rakuPodPrefix
1934*11e3c5baSBram Moolenaar    HiLink rakuPodVerticalBar  rakuPodFormatCode
1935*11e3c5baSBram Moolenaar    HiLink rakuPodColon        rakuPodFormatCode
1936*11e3c5baSBram Moolenaar    HiLink rakuPodSemicolon    rakuPodFormatCode
1937*11e3c5baSBram Moolenaar    HiLink rakuPodComma        rakuPodFormatCode
1938*11e3c5baSBram Moolenaar    HiLink rakuPodFormatOne    rakuPodFormat
1939*11e3c5baSBram Moolenaar    HiLink rakuPodFormatTwo    rakuPodFormat
1940*11e3c5baSBram Moolenaar    HiLink rakuPodFormatThree  rakuPodFormat
1941*11e3c5baSBram Moolenaar    HiLink rakuPodFormatFrench rakuPodFormat
1942*11e3c5baSBram Moolenaar
1943*11e3c5baSBram Moolenaar    HiLink rakuPodType           Type
1944*11e3c5baSBram Moolenaar    HiLink rakuPodConfigOption   String
1945*11e3c5baSBram Moolenaar    HiLink rakuPodCode           PreProc
1946*11e3c5baSBram Moolenaar    HiLink rakuPod               Comment
1947*11e3c5baSBram Moolenaar    HiLink rakuPodComment        Comment
1948*11e3c5baSBram Moolenaar    HiLink rakuPodAutoQuote      Operator
1949*11e3c5baSBram Moolenaar    HiLink rakuPodConfigOperator Operator
1950*11e3c5baSBram Moolenaar    HiLink rakuPodPrefix         Statement
1951*11e3c5baSBram Moolenaar    HiLink rakuPodName           Identifier
1952*11e3c5baSBram Moolenaar    HiLink rakuPodFormatCode     SpecialChar
1953*11e3c5baSBram Moolenaar    HiLink rakuPodFormat         SpecialComment
1954*11e3c5baSBram Moolenaar
1955*11e3c5baSBram Moolenaar    delcommand HiLink
1956*11e3c5baSBram Moolenaarendif
1957*11e3c5baSBram Moolenaar
1958*11e3c5baSBram Moolenaarif exists("raku_fold") || exists("raku_extended_all")
1959*11e3c5baSBram Moolenaar    setl foldmethod=syntax
1960*11e3c5baSBram Moolenaar    syn region rakuBlockFold
1961*11e3c5baSBram Moolenaar        \ start="^\z(\s*\)\%(my\|our\|augment\|multi\|proto\|only\)\?\s*\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\s\+\)\?\<\%(CATCH\|try\|ENTER\|LEAVE\|CHECK\|INIT\|BEGIN\|END\|KEEP\|UNDO\|PRE\|POST\|module\|package\|enum\|subset\|class\|sub\%(method\)\?\|multi\|method\|slang\|grammar\|regex\|token\|rule\)\>[^{]\+\%({\s*\%(#.*\)\?\)\?$"
1962*11e3c5baSBram Moolenaar        \ end="^\z1}"
1963*11e3c5baSBram Moolenaar        \ transparent fold keepend extend
1964*11e3c5baSBram Moolenaarendif
1965*11e3c5baSBram Moolenaar
1966*11e3c5baSBram Moolenaarlet b:current_syntax = "raku"
1967*11e3c5baSBram Moolenaar
1968*11e3c5baSBram Moolenaarlet &cpo = s:keepcpo
1969*11e3c5baSBram Moolenaarunlet s:keepcpo
1970*11e3c5baSBram Moolenaar
1971*11e3c5baSBram Moolenaar" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
1972