comparison runtime/syntax/raku.vim @ 24520:5bda4653aced

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