1" Vim syntax file
2" Language:     Perl 6
3" Maintainer:   Andy Lester <andy@petdance.com>
4" Homepage:     http://github.com/petdance/vim-perl/tree/master
5" Last Change:  2009-07-04
6
7" Contributors: Luke Palmer <fibonaci@babylonia.flatirons.org>
8"               Moritz Lenz <moritz@faui2k3.org>
9"               Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
10"
11" This is a big undertaking. Perl 6 is the sort of language that only Perl
12" can parse. But I'll do my best to get vim to.
13"
14" You can associate the extension ".pl" with the filetype "perl6" by setting
15"     autocmd BufNewFile,BufRead *.pl setf perl6
16" in your ~/.vimrc. But that will infringe on Perl 5, so you might want to
17" put a modeline near the beginning or end of your Perl 6 files instead:
18"     # vim: filetype=perl6
19
20" TODO:
21"   * Deal with s:Perl5//
22"   * m:s// is a match, not a substitution
23"   * Make these highlight as strings, not operators:
24"       <==> <=:=> <===> <=~> <« »> «>» «<»
25"   * Allow more keywords to match as function calls(leave() is export(), etc)
26"   * Optimization: use nextgroup instead of lookaround (:help syn-nextgroup)
27"   * Fix s''' substitutions being matched as package names
28"   * Match s/// and m/// better, so things like "$s/" won't match
29"   * Add more support for folding (:help syn-fold)
30"   * Add more syntax syncing hooks (:help syn-sync)
31"   * Q//:
32"       :to, :heredoc
33"       interpolate \q:s{$scalar} (though the spec isn't very clear on it)
34"
35" Impossible TODO?:
36"   * Unspace
37"   * Unicode bracketing characters for quoting (there are so many)
38"   * Various tricks depending on context. I.e. we can't know when Perl
39"     expects «*» to be a string or a hyperoperator. The latter is presumably
40"     more common, so that's what we assume.
41"   * Selective highlighting of Pod formatting codes with the :allow option
42"   * Arbitrary number, order, and negation of adverbs to Q//, q//, qq//.
43"     Currently only the first adverb is considered significant. Anything
44"     more would require an exponential amount of regexes, making this
45"     already slow syntax file even slower.
46"
47" If you want to have Pir code inside Q:PIR// strings highlighted, do:
48"  let perl6_embedded_pir=1
49"
50" The above requires pir.vim, which you can find in Parrot's repository:
51" https://svn.parrot.org/parrot/trunk/editor/
52"
53" Some less than crucial things have been made optional to speed things up.
54" Look at the comments near the if/else branches in this file to see exactly
55" which features are affected. "perl6_extended_all" enables everything.
56"
57" The defaults are:
58"
59"  unlet perl6_extended_comments
60"  unlet perl6_extended_q
61"  unlet perl6_extended_all
62
63" For version 5.x: Clear all syntax items
64" For version 6.x: Quit when a syntax file was already loaded
65if version < 600
66    syntax clear
67elseif exists("b:current_syntax")
68    finish
69endif
70
71" identifiers
72syn match p6Normal display "\K\%(\k\|[-']\K\@=\)*"
73
74" This is used in the for loops below
75" Don't use the "syn keyword" construct because that always has higher
76" priority than matches/regions, so the words can't be autoquoted with
77" the "=>" and "p5=>" operators. All the lookaround stuff is to make sure
78" we don't match them as part of some other identifier.
79let s:before_keyword = " display \"\\%(\\k\\|\\K\\@<=[-']\\)\\@<!\\%("
80let s:after_keyword = "\\)\\%(\\k\\|[-']\\K\\@=\\)\\@!\""
81
82" Billions of keywords
83let s:keywords = {
84 \ "p6Attention": [
85 \   "ACHTUNG ATTN ATTENTION FIXME NB TODO TBD WTF XXX NOTE",
86 \ ],
87 \ "p6DeclareRoutine": [
88 \   "macro sub submethod method multi proto only rule token regex category",
89 \ ],
90 \ "p6Module": [
91 \   "module class role package enum grammar slang subset",
92 \ ],
93 \ "p6Variable": [
94 \   "self",
95 \ ],
96 \ "p6Include": [
97 \   "use require",
98 \ ],
99 \ "p6Conditional": [
100 \   "if else elsif unless",
101 \ ],
102 \ "p6VarStorage": [
103 \   "let my our state temp has constant",
104 \ ],
105 \ "p6Repeat": [
106 \   "for loop repeat while until gather given",
107 \ ],
108 \ "p6FlowControl": [
109 \   "take do when next last redo return contend maybe defer",
110 \   "default exit make continue break goto leave async lift",
111 \ ],
112 \ "p6TypeConstraint": [
113 \   "is as but trusts of returns handles where augment supersede",
114 \ ],
115 \ "p6ClosureTrait": [
116 \   "BEGIN CHECK INIT START FIRST ENTER LEAVE KEEP",
117 \   "UNDO NEXT LAST PRE POST END CATCH CONTROL TEMP",
118 \ ],
119 \ "p6Exception": [
120 \   "die fail try warn",
121 \ ],
122 \ "p6Property": [
123 \   "prec irs ofs ors export deep binary unary reparsed rw parsed cached",
124 \   "readonly defequiv will ref copy inline tighter looser equiv assoc",
125 \   "required",
126 \ ],
127 \ "p6Number": [
128 \   "NaN Inf",
129 \ ],
130 \ "p6Pragma": [
131 \   "oo fatal",
132 \ ],
133 \ "p6Type": [
134 \   "Object Any Junction Whatever Capture Match",
135 \   "Signature Proxy Matcher Package Module Class",
136 \   "Grammar Scalar Array Hash KeyHash KeySet KeyBag",
137 \   "Pair List Seq Range Set Bag Mapping Void Undef",
138 \   "Failure Exception Code Block Routine Sub Macro",
139 \   "Method Submethod Regex Str Blob Char Byte",
140 \   "Codepoint Grapheme StrPos StrLen Version Num",
141 \   "Complex num complex Bit bit bool True False",
142 \   "Increasing Decreasing Ordered Callable AnyChar",
143 \   "Positional Associative Ordering KeyExtractor",
144 \   "Comparator OrderingPair IO KitchenSink Role",
145 \   "Int int int1 int2 int4 int8 int16 int32 int64",
146 \   "Rat rat rat1 rat2 rat4 rat8 rat16 rat32 rat64",
147 \   "Buf buf buf1 buf2 buf4 buf8 buf16 buf32 buf64",
148 \   "UInt uint uint1 uint2 uint4 uint8 uint16 uint32",
149 \   "uint64 Abstraction utf8 utf16 utf32",
150 \ ],
151 \ "p6Operator": [
152 \   "div x xx mod also leg cmp before after eq ne le lt",
153 \   "gt ge eqv ff fff and andthen Z X or xor",
154 \   "orelse extra m mm rx s tr",
155 \ ],
156\ }
157
158for [group, words] in items(s:keywords)
159    let s:words_space = join(words, " ")
160    let s:temp = split(s:words_space)
161    let s:words = join(s:temp, "\\|")
162    exec "syn match ". group ." ". s:before_keyword . s:words . s:after_keyword
163endfor
164unlet s:keywords s:words_space s:temp s:words
165
166" More operators
167" Don't put a "\+" at the end of the character class. That makes it so
168" greedy that the "%" " in "+%foo" won't be allowed to match as a sigil,
169" among other things
170syn match p6Operator display "[-+/*~?|=^!%&,<>.;\\]"
171syn match p6Operator display "\%(:\@<!::\@!\|::=\|\.::\)"
172" these require whitespace on the left side
173syn match p6Operator display "\%(\s\|^\)\@<=\%(xx=\|p5=>\)"
174" "i" requires a digit to the left, and no keyword char to the right
175syn match p6Operator display "\d\@<=i\k\@!"
176" index overloading
177syn match p6Operator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)"
178
179" all infix operators except nonassocative ones
180let s:infix_a = [
181    \ "div % mod +& +< +> \\~& ?& \\~< \\~> +| +\\^ \\~| \\~\\^ ?| ?\\^ xx x",
182    \ "\\~ && & also <== ==> <<== ==>> == != < <= > >= \\~\\~ eq ne lt le gt",
183    \ "ge =:= === eqv before after \\^\\^ min max \\^ff ff\\^ \\^ff\\^",
184    \ "\\^fff fff\\^ \\^fff\\^ fff ff ::= := \\.= => , : p5=> Z minmax",
185    \ "\\.\\.\\. and andthen or orelse xor \\^ += -= /= \\*= \\~= //= ||=",
186    \ "+ - \\*\\* \\* // / \\~ || |",
187\ ]
188" nonassociative infix operators
189let s:infix_n = "but does <=> leg cmp \\.\\. \\.\\.\\^\\^ \\^\\.\\. \\^\\.\\.\\^"
190
191let s:infix_a_long = join(s:infix_a, " ")
192let s:infix_a_words = split(s:infix_a_long)
193let s:infix_a_pattern = join(s:infix_a_words, "\\|")
194
195let s:infix_n_words = split(s:infix_n)
196let s:infix_n_pattern = join(s:infix_n_words, "\\|")
197
198let s:both = [s:infix_a_pattern, s:infix_n_pattern]
199let s:infix = join(s:both, "\\|")
200
201let s:infix_assoc = "!\\?\\%(" . s:infix_a_pattern . "\\)"
202let s:infix = "!\\?\\%(" . s:infix . "\\)"
203
204unlet s:infix_a s:infix_a_long s:infix_a_words s:infix_a_pattern
205unlet s:infix_n s:infix_n_pattern s:both
206
207" [+] reduce
208exec "syn match p6ReduceOp display \"\\k\\@<!\\[[R\\\\]\\?!\\?". s:infix_assoc ."]\\%(«\\|<<\\)\\?\""
209unlet s:infix_assoc
210
211" Reverse and cross operators (Rop, Xop)
212exec "syn match p6ReverseCrossOp display \"[RX]". s:infix ."\""
213
214" q() or whatever() is always a function call
215syn match p6Normal display "\K\%(\k\|[-']\K\@=\)*(\@="
216
217" basically all builtins that can be followed by parentheses
218let s:routines = [
219 \ "eager hyper substr index rindex grep map sort join lines hints chmod",
220 \ "split reduce min max reverse truncate zip cat roundrobin classify",
221 \ "first sum keys values pairs defined delete exists elems end kv any",
222 \ "all one wrap shape key value name pop push shift splice unshift floor",
223 \ "ceiling abs exp log log10 rand sign sqrt sin cos tan round strand",
224 \ "roots cis unpolar polar atan2 pick chop p5chop chomp p5chomp lc",
225 \ "lcfirst uc ucfirst capitalize normalize pack unpack quotemeta comb",
226 \ "samecase sameaccent chars nfd nfc nfkd nfkc printf sprintf caller",
227 \ "evalfile run runinstead nothing want bless chr ord gmtime time eof",
228 \ "localtime gethost getpw chroot getlogin getpeername kill fork wait",
229 \ "perl graphs codes bytes clone print open read write readline say seek",
230 \ "close opendir readdir slurp pos fmt vec link unlink symlink uniq pair",
231 \ "asin atan sec cosec cotan asec acosec acotan sinh cosh tanh asinh",
232 \ "acos acosh atanh sech cosech cotanh sech acosech acotanh asech ok",
233 \ "plan_ok dies_ok lives_ok skip todo pass flunk force_todo use_ok isa_ok",
234 \ "diag is_deeply isnt like skip_rest unlike cmp_ok eval_dies_ok nok_error",
235 \ "eval_lives_ok approx is_approx throws_ok version_lt plan eval succ pred",
236 \ "times nonce once signature new connect operator undef undefine sleep",
237 \ "from to infix postfix prefix circumfix postcircumfix minmax lazy count",
238 \ "unwrap getc pi e context void quasi body each contains rewinddir subst",
239 \ "can isa flush arity assuming rewind callwith callsame nextwith nextsame",
240 \ "attr eval_elsewhere none srand trim trim_start trim_end lastcall WHAT",
241 \ "WHERE HOW WHICH VAR WHO WHENCE ACCEPTS REJECTS does not true iterator by",
242 \ "re im invert flip",
243\ ]
244
245" we want to highlight builtins like split() though, so this comes afterwards
246" TODO: check if this would be faster as one big regex
247let s:words_space = join(s:routines, " ")
248let s:temp = split(s:words_space)
249let s:words = join(s:temp, "\\|")
250exec "syn match p6Routine ". s:before_keyword . s:words . s:after_keyword
251unlet s:before_keyword s:after_keyword s:words_space s:temp s:words s:routines
252
253" packages, must come after all the keywords
254syn match p6Normal display "\%(::\)\@<=\K\%(\k\|[-']\K\@=\)*"
255syn match p6Normal display "\K\%(\k\|[-']\K\@=\)*\%(::\)\@="
256
257" some standard packages
258syn match p6Type display "\%(::\|\k\|\K\@<=[-']\)\@<!\%(Order\%(::Same\|::Increase\|::Decrease\)\?\)\%(\k\|[-']\K\@=\)\@!"
259syn match p6Type display "\%(::\|\k\|\K\@<=[-']\)\@<!\%(Bool\%(::True\|::False\)\?\)\%(\k\|[-']\K\@=\)\@!"
260
261
262syn match p6Shebang    display "\%^#!.*"
263syn match p6BlockLabel display "\%(^\s*\)\@<=\h\w*\s*::\@!\_s\@="
264syn match p6Number     display "\k\@<!_\@!\%(\d\|__\@!\)\+_\@<!\%([eE]_\@!+\?\%(\d\|_\)\+\)\?_\@<!"
265syn match p6Float      display "\k\@<!_\@!\%(\d\|__\@!\)\+_\@<![eE]_\@!-\%(\d\|_\)\+"
266syn match p6Float      display "\k\@<!_\@<!\%(\d\|__\@!\)*_\@<!\.\@<!\._\@!\.\@!\a\@!\%(\d\|_\)\+_\@<!\%([eE]_\@!\%(\d\|_\)\+\)\?"
267
268syn match p6NumberBase display "[obxd]" contained
269syn match p6Number     display "\<0\%(o[0-7][0-7_]*\)\@="     nextgroup=p6NumberBase
270syn match p6Number     display "\<0\%(b[01][01_]*\)\@="       nextgroup=p6NumberBase
271syn match p6Number     display "\<0\%(x\x[[:xdigit:]_]*\)\@=" nextgroup=p6NumberBase
272syn match p6Number     display "\<0\%(d\d[[:digit:]_]*\)\@="  nextgroup=p6NumberBase
273syn match p6Number     display "\%(\<0o\)\@<=[0-7][0-7_]*"
274syn match p6Number     display "\%(\<0b\)\@<=[01][01_]*"
275syn match p6Number     display "\%(\<0x\)\@<=\x[[:xdigit:]_]*"
276syn match p6Number     display "\%(\<0d\)\@<=\d[[:digit:]_]*"
277
278syn match p6Version    display "\<v\d\@=" nextgroup=p6VersionNum
279syn match p6VersionNum display "\d\+" nextgroup=p6VersionDot contained
280syn match p6VersionDot display "\.\%(\d\|\*\)\@=" nextgroup=p6VersionNum contained
281
282" try to distinguish the "is" function from the "is" trail auxiliary
283syn match p6Routine     display "\%(\%(\S\k\@<!\|^\)\s*\)\@<=is\>"
284
285" does is a type constraint sometimes
286syn match p6TypeConstraint display "does\%(\s*\%(\k\|[-']\K\@=\)\)\@="
287
288" int is a type sometimes
289syn match p6Type        display "\<int\>\%(\s*(\|\s\+\d\)\@!"
290
291" these Routine names are also Properties, if preceded by "is"
292syn match p6Property    display "\%(is\s\+\)\@<=\%(signature\|context\|also\|shape\)"
293
294" The sigil in ::*Package
295syn match p6PackageTwigil display "\%(::\)\@<=\*"
296
297" $<match>
298syn region p6MatchVarSigil
299    \ matchgroup=p6Variable
300    \ start="\$\%(<<\@!\)\@="
301    \ end=">\@<="
302    \ contains=p6MatchVar
303
304syn region p6MatchVar
305    \ matchgroup=p6Twigil
306    \ start="<"
307    \ end=">"
308    \ contained
309
310" Contextualizers
311syn match p6Context display "\<\%(item\|list\|slice\|hash\)\>"
312syn match p6Context display "\%(\$\|@\|%\|&\|@@\)(\@="
313
314" the "$" placeholder in "$var1, $, var2 = @list"
315syn match p6Placeholder display "\%(,\s*\)\@<=\$\%(\K\|\%([.^*?=!~]\|:\@<!::\@!\)\)\@!"
316syn match p6Placeholder display "\$\%(\K\|\%([.^*?=!~]\|:\@<!::\@!\)\)\@!\%(,\s*\)\@="
317
318" Quoting
319
320" one cluster for every quote adverb
321syn cluster p6Interp_s
322    \ add=p6InterpScalar
323syn cluster p6Interp_scalar
324    \ add=p6InterpScalar
325
326syn cluster p6Interp_a
327    \ add=p6InterpArray
328syn cluster p6Interp_array
329    \ add=p6InterpArray
330
331syn cluster p6Interp_h
332    \ add=p6InterpHash
333syn cluster p6Interp_hash
334    \ add=p6InterpHash
335
336syn cluster p6Interp_f
337    \ add=p6InterpFunction
338syn cluster p6Interp_f
339    \ add=p6InterpFunction
340
341syn cluster p6Interp_c
342    \ add=p6InterpClosure
343syn cluster p6Interp_closure
344    \ add=p6InterpClosure
345
346
347if exists("perl6_extended_q") || exists("perl6_extended_all")
348    syn cluster p6Interp_ww
349        \ add=p6StringSQ
350        \ add=p6StringDQ
351    syn cluster p6Interp_quotewords
352        \ add=p6StringSQ
353        \ add=p6StringDQ
354endif
355
356syn cluster p6Interp_q
357    \ add=p6EscQQ
358    \ add=p6EscBackSlash
359syn cluster p6Interp_single
360    \ add=p6EscQQ
361    \ add=p6EscBackSlash
362
363syn cluster p6Interp_b
364    \ add=@p6Interp_q
365    \ add=p6Escape
366    \ add=p6EscOpenCurly
367    \ add=p6EscCodePoint
368    \ add=p6EscHex
369    \ add=p6EscOct
370    \ add=p6EscOctOld
371    \ add=p6EscNull
372syn cluster p6Interp_backslash
373    \ add=@p6Interp_q
374    \ add=p6Escape
375    \ add=p6EscOpenCurly
376    \ add=p6EscCodePoint
377    \ add=p6EscHex
378    \ add=p6EscOct
379    \ add=p6EscOctOld
380    \ add=p6EscNull
381
382syn cluster p6Interp_qq
383    \ add=@p6Interp_scalar
384    \ add=@p6Interp_array
385    \ add=@p6Interp_hash
386    \ add=@p6Interp_function
387    \ add=@p6Interp_closure
388    \ add=@p6Interp_backslash
389syn cluster p6Interp_double
390    \ add=@p6Interp_scalar
391    \ add=@p6Interp_array
392    \ add=@p6Interp_hash
393    \ add=@p6Interp_function
394    \ add=@p6Interp_closure
395    \ add=@p6Interp_backslash
396
397syn region p6InterpScalar
398    \ start="\ze\z(\$\%(\%(\%(\d\+\|!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\)\%(\.\%(\K\%(\k\|[-']\K\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
399    \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\)\|\%(\d\+\|!\|/\|¢\)\)\)"
400    \ end="\z1\zs"
401    \ contained
402    \ contains=TOP
403    \ keepend
404
405syn region p6InterpScalar
406    \ matchgroup=p6Context
407    \ start="\$\ze()\@!"
408    \ skip="([^)]*)"
409    \ end=")\zs"
410    \ contained
411    \ contains=TOP
412
413syn region p6InterpArray
414    \ start="\ze\z(@\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\)\%(\.\%(\K\%(\k\|[-']\K\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
415    \ end="\z1\zs"
416    \ contained
417    \ contains=TOP
418    \ keepend
419
420syn region p6InterpArray
421    \ matchgroup=p6Context
422    \ start="@\ze()\@!"
423    \ start="@@\ze()\@!"
424    \ skip="([^)]*)"
425    \ end=")\zs"
426    \ contained
427    \ contains=TOP
428
429syn region p6InterpHash
430    \ start="\ze\z(%\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\)\%(\.\%(\K\%(\k\|[-']\K\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
431    \ end="\z1\zs"
432    \ contained
433    \ contains=TOP
434    \ keepend
435
436syn region p6InterpHash
437    \ matchgroup=p6Context
438    \ start="%\ze()\@!"
439    \ skip="([^)]*)"
440    \ end=")\zs"
441    \ contained
442    \ contains=TOP
443
444syn region p6InterpFunction
445    \ start="\ze\z(&\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\%(\.\%(\K\%(\k\|[-']\K\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
446    \ end="\z1\zs"
447    \ contained
448    \ contains=TOP
449    \ keepend
450
451syn region p6InterpFunction
452    \ matchgroup=p6Context
453    \ start="&\ze()\@!"
454    \ skip="([^)]*)"
455    \ end=")\zs"
456    \ contained
457    \ contains=TOP
458
459syn region p6InterpClosure
460    \ start="\\\@<!{}\@!"
461    \ skip="{[^}]*}"
462    \ end="}"
463    \ contained
464    \ contains=TOP
465    \ keepend
466
467" generic escape
468syn match p6Escape          display "\\\S" contained
469
470" escaped closing delimiters
471syn match p6EscQuote        display "\\'" contained
472syn match p6EscDoubleQuote  display "\\\"" contained
473syn match p6EscCloseAngle   display "\\>" contained
474syn match p6EscCloseFrench  display "\\»" contained
475syn match p6EscBackTick     display "\\`" contained
476syn match p6EscForwardSlash display "\\/" contained
477syn match p6EscVerticalBar  display "\\|" contained
478syn match p6EscExclamation  display "\\!" contained
479syn match p6EscComma        display "\\," contained
480syn match p6EscDollar       display "\\\$" contained
481syn match p6EscCloseCurly   display "\\}" contained
482syn match p6EscCloseBracket display "\\\]" contained
483
484" misc escapes
485syn match p6EscOctOld    display "\\\d\{1,3}" contained
486syn match p6EscNull      display "\\0\d\@!" contained
487syn match p6EscCodePoint display "\%(\\c\)\@<=\%(\d\|\S\|\[\)\@=" contained nextgroup=p6CodePoint
488syn match p6EscHex       display "\%(\\x\)\@<=\%(\x\|\[\)\@=" contained nextgroup=p6HexSequence
489syn match p6EscOct       display "\%(\\o\)\@<=\%(\o\|\[\)\@=" contained nextgroup=p6OctSequence
490syn match p6EscQQ        display "\\qq" contained nextgroup=p6QQSequence
491syn match p6EscOpenCurly display "\\{" contained
492syn match p6EscHash      display "\\#" contained
493syn match p6EscBackSlash display "\\\\" contained
494
495syn region p6QQSequence
496    \ matchgroup=p6Escape
497    \ start="\["
498    \ skip="\[[^\]]*]"
499    \ end="]"
500    \ contained
501    \ transparent
502    \ contains=@p6Interp_qq
503
504syn match p6CodePoint   display "\%(\d\+\|\S\)" contained
505syn region p6CodePoint
506    \ matchgroup=p6Escape
507    \ start="\["
508    \ end="]"
509    \ contained
510
511syn match p6HexSequence display "\x\+" contained
512syn region p6HexSequence
513    \ matchgroup=p6Escape
514    \ start="\["
515    \ end="]"
516    \ contained
517
518syn match p6OctSequence display "\o\+" contained
519syn region p6OctSequence
520    \ matchgroup=p6Escape
521    \ start="\["
522    \ end="]"
523    \ contained
524
525" matches :key, :!key, :$var, :key<var>, etc
526" Since we don't know in advance how the adverb ends, we use a trick.
527" Consume nothing with the start pattern (\ze at the beginning),
528" while capturing the whole adverb into \z1 and then putting it before
529" the match start (\zs) of the end pattern.
530syn region p6Adverb
531    \ start="\ze\z(:!\?\K\%(\k\|[-']\K\@=\)*\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)"
532    \ start="\ze\z(:!\?[@$%]\$*\%(::\|\%(\$\@<=\d\+\|!\|/\|¢\)\|\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\)\|\%(\K\%(\k\|[-']\K\@=\)*\)\)\)"
533    \ end="\z1\zs"
534    \ contained
535    \ contains=TOP
536    \ keepend
537
538" <words>
539" FIXME: not sure how to distinguish this from the "less than" operator
540" in all cases. For now, it matches if any of the following is true:
541"
542" * There is whitespace missing on either side of the "<", since
543"   people tend to put spaces around "less than"
544" * It comes after "enum", "for", "any", "all", or "none"
545" * It's the first or last thing on a line (ignoring whitespace)
546" * It's preceded by "= "
547"
548" It never matches when:
549"
550" * Preceded by [<+~=] (e.g. <<foo>>, =<$foo>)
551" * Followed by [-=] (e.g. <--, <=, <==)
552syn region p6StringAngle
553    \ matchgroup=p6Quote
554    \ start="\%(\<\%(enum\|for\|any\|all\|none\)\>\s*(\?\s*\)\@<=<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!"
555    \ start="\%(\s\|[<+~=]\)\@<!<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!"
556    \ start="[<+~=]\@<!<\%(\s\|<\|=>\|[-=]\{1,2}>\@!\)\@!"
557    \ start="\%(^\s*\)\@<=<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!"
558    \ start="[<+~=]\@<!<\%(\s*$\)\@="
559    \ start="\%(=\s\+\)\@=<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!"
560    \ skip="\\\@<!\\>"
561    \ end=">"
562    \ contains=p6InnerAnglesOne,p6EscBackSlash,p6EscCloseAngle
563
564syn region p6InnerAnglesOne
565    \ matchgroup=p6StringAngle
566    \ start="<"
567    \ skip="\\\@<!\\>"
568    \ end=">"
569    \ transparent
570    \ contained
571    \ contains=p6InnerAnglesOne
572
573" <<words>>
574syn region p6StringAngles
575    \ matchgroup=p6Quote
576    \ start="<<=\@!"
577    \ skip="\\\@<!\\>"
578    \ end=">>"
579    \ contains=p6InnerAnglesTwo,@p6Interp_qq,p6Comment,p6EscHash,p6EscCloseAngle,p6Adverb,p6StringSQ,p6StringDQ
580
581syn region p6InnerAnglesTwo
582    \ matchgroup=p6StringAngles
583    \ start="<<"
584    \ skip="\\\@<!\\>"
585    \ end=">>"
586    \ transparent
587    \ contained
588    \ contains=p6InnerAnglesTwo
589
590" «words»
591syn region p6StringFrench
592    \ matchgroup=p6Quote
593    \ start="«"
594    \ skip="\\\@<!\\»"
595    \ end="»"
596    \ contains=p6InnerFrench,@p6Interp_qq,p6Comment,p6EscHash,p6EscCloseFrench,p6Adverb,p6StringSQ,p6StringDQ
597
598syn region p6InnerFrench
599    \ matchgroup=p6StringFrench
600    \ start="«"
601    \ skip="\\\@<!\\»"
602    \ end="»"
603    \ transparent
604    \ contained
605    \ contains=p6InnerFrench
606
607" 'string'
608syn region p6StringSQ
609    \ matchgroup=p6Quote
610    \ start="'"
611    \ skip="\\\@<!\\'"
612    \ end="'"
613    \ contains=@p6Interp_q,p6EscQuote
614
615" "string"
616syn region p6StringDQ
617    \ matchgroup=p6Quote
618    \ start=+"+
619    \ skip=+\\\@<!\\"+
620    \ end=+"+
621    \ contains=@p6Interp_qq,p6EscDoubleQuote
622
623" Q// and friends.
624
625syn match p6QuoteQ display "\%([Qq]\%(ww\|to\|[qwxsahfcb]\)\?\)\>" nextgroup=p6QPairs skipwhite skipempty
626syn match p6QPairs contained transparent skipwhite skipempty nextgroup=p6StringQ,p6StringQ_PIR "\%(\_s*:!\?\K\%(\k\|[-']\K\@=\)*\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)*"
627
628if exists("perl6_embedded_pir")
629    syn include @p6PIR syntax/pir.vim
630endif
631
632" hardcoded set of delimiters
633let s:delims = [
634  \ ["\\\"",         "\\\"", "p6EscDoubleQuote",  "\\\\\\@<!\\\\\\\""],
635  \ ["'",            "'",    "p6EscQuote",        "\\\\\\@<!\\\\'"],
636  \ ["/",            "/",    "p6EscForwardSlash", "\\\\\\@<!\\\\/"],
637  \ ["`",            "`",    "p6EscBackTick",     "\\\\\\@<!\\\\`"],
638  \ ["|",            "|",    "p6EscVerticalBar",  "\\\\\\@<!\\\\|"],
639  \ ["!",            "!",    "p6EscExclamation",  "\\\\\\@<!\\\\!"],
640  \ [",",            ",",    "p6EscComma",        "\\\\\\@<!\\\\,"],
641  \ ["\\$",          "\\$",  "p6EscDollar",       "\\\\\\@<!\\\\\\$"],
642  \ ["{",            "}",    "p6EscCloseCurly",   "\\%(\\\\\\@<!\\\\}\\|{[^}]*}\\)"],
643  \ ["<",            ">",    "p6EscCloseAngle",   "\\%(\\\\\\@<!\\\\>\\|<[^>]*>\\)"],
644  \ ["«",            "»",    "p6EscCloseFrench",  "\\%(\\\\\\@<!\\\\»\\|«[^»]*»\\)"],
645  \ ["\\\[",         "]",    "p6EscCloseBracket", "\\%(\\\\\\@<!\\\\]\\|\\[^\\]]*]\\)"],
646  \ ["\\s\\@<=(",    ")",    "p6EscCloseParen",   "\\%(\\\\\\@<!\\\\)\\|([^)]*)\\)"],
647\ ]
648
649" double and triple delimiters too
650if exists("perl6_extended_q") || exists("perl6_extended_all")
651    call add(s:delims, ["««",           "»»",  "p6EscCloseFrench",  "\\%(\\\\\\@<!\\\\»»\\|««\\%([^»]\\|»»\\@!\\)*»»\\)"])
652    call add(s:delims, ["«««",          "»»»", "p6EscCloseFrench",  "\\%(\\\\\\@<!\\\\»»»\\|«««\\%([^»]\\|»\\%(»»\\)\\@!\\)*»»»\\)"])
653    call add(s:delims, ["{{",           "}}",  "p6EscCloseCurly",   "\\%(\\\\\\@<!\\\\}}\\|{{\\%([^}]\\|}}\\@!\\)*}}\\)"])
654    call add(s:delims, ["{{{",          "}}}", "p6EscCloseCurly",   "\\%(\\\\\\@<!\\\\}}}\\|{{{\\%([^}]\\|}\\%(}}\\)\\@!\\)*}}}\\)"])
655    call add(s:delims, ["\\\[\\\[",     "]]",  "p6EscCloseBracket", "\\%(\\\\\\@<!\\\\]]\\|\\[\\[\\%([^\\]]\\|]]\\@!\\)*]]\\)"])
656    call add(s:delims, ["\\\[\\\[\\\[", "]]]", "p6EscCloseBracket", "\\%(\\\\\\@<!\\\\]]]\\|\\[\\[\\[\\%([^\\]]\\|]\\%(]]\\)\\@!\\)*]]]\\)"])
657    call add(s:delims, ["\\s\\@<=((",   "))",  "p6EscCloseParen",   "\\%(\\\\\\@<!\\\\))\\|((\\%([^)]\\|))\\@!\\)*))\\)"])
658    call add(s:delims, ["\\s\\@<=(((",  ")))", "p6EscCloseParen",   "\\%(\\\\\\@<!\\\\)))\\|(((\\%([^)]\\|)\\%())\\)\\@!\\)*)))\\)"])
659    call add(s:delims, ["\\s\\@<=<<",   ">>",  "p6EscCloseAngle",   "\\%(\\\\\\@<!\\\\>>\\|<<\\%([^>]\\|>>\\@!\\)*>>\\)"])
660    call add(s:delims, ["\\s\\@<=<<<",  ">>>", "p6EscCloseAngle",   "\\%(\\\\\\@<!\\\\>>>\\|<<<\\%([^>]\\|>\\%(>>\\)\\@!\\)*>>>\\)"])
661endif
662
663if !exists("perl6_extended_q") && !exists("perl6_extended_all")
664    " simple version, no special highlighting within the string
665    for [start_delim, end_delim, end_group, skip] in s:delims
666        exec "syn region p6StringQ matchgroup=p6Quote start=\"".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contains=".end_group." contained"
667    endfor
668
669    if exists("perl6_embedded_pir")
670        " highlight embedded PIR code
671        for [start_delim, end_delim, end_group, skip] in s:delims
672            exec "syn region p6StringQ_PIR matchgroup=p6Quote start=\"\\%(Q\\s*:PIR\\s*\\)\\@<=".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contains=@p6PIR,".end_group." contained"
673        endfor
674    endif
675else
676    let s:before = "syn region p6StringQ matchgroup=p6Quote start=\"\\%("
677    let s:after  = "\\%(\\_s*:!\\?\\K\\%(\\k\\|[-']\\K\\@=\\)*\\%(([^)]*)\\|\\[[^\\]]*]\\|<[^>]*>\\|«[^»]*»\\|{[^}]*}\\)\\?\\)*\\_s*\\)\\@<="
678
679    let s:adverbs = [
680        \ ["s", "scalar"],
681        \ ["a", "array"],
682        \ ["h", "hash"],
683        \ ["f", "function"],
684        \ ["c", "closure"],
685        \ ["b", "backslash"],
686        \ ["w", "words"],
687        \ ["ww", "quotewords"],
688        \ ["x", "exec"],
689    \ ]
690
691    " these can't be conjoined with q and qq (e.g. as qqq and qqqq)
692    let s:q_adverbs = [
693        \ ["q", "single"],
694        \ ["qq", "double"],
695    \ ]
696
697    for [start_delim, end_delim, end_group, skip] in s:delims
698        " Q, q, and qq with any number of (ignored) adverbs
699        exec s:before ."Q". s:after .start_delim."\" end=\"". end_delim ."\""." contained"
700        exec s:before ."q". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q"." contained"
701        exec s:before ."qq". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq"." contained"
702
703        for [short, long] in s:adverbs
704            " Qs, qs, qqs, Qa, qa, qqa, etc, with ignored adverbs
705            exec s:before ."Q".short. s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long." contained"
706            exec s:before ."q".short. s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q,@p6Interp_".long." contained"
707            exec s:before ."qq".short. s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq,@p6Interp_".long." contained"
708
709            " Q, q, and qq, with one significant adverb
710            exec s:before ."Q\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long." contained"
711            for [q_short, q_long] in s:q_adverbs
712                exec s:before ."Q\\s*:\\%(".q_short."\\|".q_long."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".q_long." contained"
713            endfor
714            exec s:before ."q\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q,@p6Interp_".long." contained"
715            exec s:before ."qq\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq,@p6Interp_".long." contained"
716
717            for [short2, long2] in s:adverbs
718                " Qs, qs, qqs, Qa, qa, qqa, etc, with one significant adverb
719                exec s:before ."Q".short."\\s*:\\%(".short2."\\|".long2."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long.",@p6Interp_".long2." contained"
720                for [q_short2, q_long2] in s:q_adverbs
721                    exec s:before ."Q".short."\\s*:\\%(".q_short2."\\|".q_long2."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long.",@p6Interp_".q_long2." contained"
722                endfor
723                exec s:before ."q".short."\\s*:\\%(".short2."\\|".long2."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q,@p6Interp_".long.",@p6Interp_".long2." contained"
724                exec s:before ."qq".short."\\s*:\\%(".short2."\\|".long2."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq,@p6Interp_".long.",@p6Interp_".long2." contained"
725            endfor
726        endfor
727    endfor
728    unlet s:before s:after s:adverbs s:q_adverbs
729endif
730unlet s:delims
731
732" Match these so something else above can't. E.g. the "q" in "role q { }"
733" should not be considered a string
734syn match p6Normal display "\%(\<\%(role\|grammar\|slang\)\s\+\)\@<=\K\%(\k\|[-']\K\@=\)*"
735
736" :key
737syn match p6Operator display ":\@<!::\@!!\?" nextgroup=p6Key
738syn match p6Key display "\k\%(\k\|[-']\K\@=\)*" contained
739
740" => and p5=> autoquoting
741syn match p6StringP5Auto display "\K\%(\k\|[-']\K\@=\)*\ze\s\+p5=>"
742syn match p6StringAuto   display "\K\%(\k\|[-']\K\@=\)*\ze\%(p5\)\@<!=>"
743syn match p6StringAuto   display "\K\%(\k\|[-']\K\@=\)*\ze\s\+=>"
744syn match p6StringAuto   display "\K\%(\k\|[-']\K\@=\)*p5\ze=>"
745
746" Hyperoperators. Needs to come after the quoting operators (<>, «», etc)
747exec "syn match p6HyperOp display \"»"   .s:infix."»\\?\""
748exec "syn match p6HyperOp display \"«\\?".s:infix."«\""
749exec "syn match p6HyperOp display \"»"   .s:infix."«\""
750exec "syn match p6HyperOp display \"«"   .s:infix. "»\""
751
752exec "syn match p6HyperOp display \">>"          .s:infix."\\%(>>\\)\\?\""
753exec "syn match p6HyperOp display \"\\%(<<\\)\\?".s:infix."<<\""
754exec "syn match p6HyperOp display \">>"          .s:infix."<<\""
755exec "syn match p6HyperOp display \"<<"          .s:infix.">>\""
756unlet s:infix
757
758" Regexes and grammars
759
760syn match p6RegexName display "\%(\<\%(regex\|rule\|token\)\s\+\)\@<=\K\%(\k\|[-']\K\@=\)*" nextgroup=p6RegexBlockCrap skipwhite skipempty
761syn match p6RegexBlockCrap "[^{]*" nextgroup=p6RegexBlock skipwhite skipempty transparent contained
762
763syn region p6RegexBlock
764    \ matchgroup=p6Normal
765    \ start="{"
766    \ end="}"
767    \ contained
768    \ contains=@p6Regexen,@p6Variables
769
770" Perl 6 regex bits
771
772syn cluster p6Regexen
773    \ add=p6RxMeta
774    \ add=p6RxEscape
775    \ add=p6EscHex
776    \ add=p6EscOct
777    \ add=p6EscNull
778    \ add=p6RxAnchor
779    \ add=p6RxCapture
780    \ add=p6RxGroup
781    \ add=p6RxAlternation
782    \ add=p6RxAdverb
783    \ add=p6RxAdverbArg
784    \ add=p6RxStorage
785    \ add=p6RxAssertion
786    \ add=p6RxQuoteWords
787    \ add=p6RxClosure
788    \ add=p6RxStringSQ
789    \ add=p6RxStringDQ
790    \ add=p6Comment
791
792syn match p6RxMeta        display contained ".\%(\k\|\s\)\@<!"
793syn match p6RxAnchor      display contained "[$^]"
794syn match p6RxEscape      display contained "\\\S"
795syn match p6RxCapture     display contained "[()]"
796syn match p6RxAlternation display contained "|"
797syn match p6RxRange       display contained "\.\."
798
799syn region p6RxClosure
800    \ matchgroup=p6Normal
801    \ start="{"
802    \ end="}"
803    \ contained
804    \ containedin=p6RxClosure
805    \ contains=TOP
806syn region p6RxGroup
807    \ matchgroup=p6StringSpecial2
808    \ start="\["
809    \ end="]"
810    \ contained
811    \ contains=@p6Regexen,@p6Variables
812syn region p6RxAssertion
813    \ matchgroup=p6StringSpecial2
814    \ start="<"
815    \ end=">"
816    \ contained
817    \ contains=@p6Regexen,@p6Variables,p6RxCharClass,p6RxAssertCall
818syn region p6RxAssertCall
819    \ matchgroup=p6Normal
820    \ start="\%(::\|\%(\K\%(\k\|[-']\K\@=\)*\)\)\@<=(\@="
821    \ end=")\@<="
822    \ contained
823    \ contains=TOP
824syn region p6RxCharClass
825    \ matchgroup=p6StringSpecial2
826    \ start="\%(<[-!+?]\?\)\@<=\["
827    \ skip="\\]"
828    \ end="]"
829    \ contained
830    \ contains=p6RxRange,p6RxEscape,p6EscHex,p6EscOct,p6EscNull
831syn region p6RxQuoteWords
832    \ matchgroup=p6StringSpecial2
833    \ start="< "
834    \ end=">"
835    \ contained
836syn region p6RxAdverb
837    \ start="\ze\z(:!\?\K\%(\k\|[-']\K\@=\)*\)"
838    \ end="\z1\zs"
839    \ contained
840    \ contains=TOP
841    \ keepend
842syn region p6RxAdverbArg
843    \ start="\%(:!\?\K\%(\k\|[-']\K\@=\)*\)\@<=("
844    \ skip="([^)]*)"
845    \ end=")"
846    \ contained
847    \ contains=TOP
848syn region p6RxStorage
849    \ matchgroup=p6Operator
850    \ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@="
851    \ end="$"
852    \ contains=TOP
853    \ contained
854
855" Perl 5 regex bits
856
857syn cluster p6RegexP5Base
858    \ add=p6RxP5Escape
859    \ add=p6RxP5Oct
860    \ add=p6RxP5Hex
861    \ add=p6RxP5EscMeta
862    \ add=p6RxP5CodePoint
863    \ add=p6RxP5Prop
864
865" normal regex stuff
866syn cluster p6RegexP5
867    \ add=@p6RegexP5Base
868    \ add=p6RxP5Quantifier
869    \ add=p6RxP5Meta
870    \ add=p6RxP5QuoteMeta
871    \ add=p6RxP5ParenMod
872    \ add=p6RxP5Verb
873    \ add=p6RxP5Count
874    \ add=p6RxP5Named
875    \ add=p6RxP5ReadRef
876    \ add=p6RxP5WriteRef
877    \ add=p6RxP5CharClass
878    \ add=p6RxP5Anchor
879
880" inside character classes
881syn cluster p6RegexP5Class
882    \ add=@p6RegexP5Base
883    \ add=p6RxP5Posix
884    \ add=p6RxP5Range
885
886syn match p6RxP5Escape     display contained "\\\S"
887syn match p6RxP5CodePoint  display contained "\\c\S\@=" nextgroup=p6RxP5CPId
888syn match p6RxP5CPId       display contained "\S"
889syn match p6RxP5Oct        display contained "\\\%(\o\{1,3}\)\@=" nextgroup=p6RxP5OctSeq
890syn match p6RxP5OctSeq     display contained "\o\{1,3}"
891syn match p6RxP5Anchor     display contained "[\^$]"
892syn match p6RxP5Hex        display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=p6RxP5HexSeq
893syn match p6RxP5HexSeq     display contained "\x\{1,2}"
894syn region p6RxP5HexSeq
895    \ matchgroup=p6RxP5Escape
896    \ start="{"
897    \ end="}"
898    \ contained
899syn region p6RxP5Named
900    \ matchgroup=p6RxP5Escape
901    \ start="\%(\\N\)\@<={"
902    \ end="}"
903    \ contained
904syn match p6RxP5Quantifier display contained "\%([+*]\|(\@<!?\)"
905syn match p6RxP5ReadRef    display contained "\\[1-9]\d\@!"
906syn match p6RxP5ReadRef    display contained "\\k<\@=" nextgroup=p6RxP5ReadRefId
907syn region p6RxP5ReadRefId
908    \ matchgroup=p6RxP5Escape
909    \ start="<"
910    \ end=">"
911    \ contained
912syn match p6RxP5WriteRef   display contained "\\g\%(\d\|{\)\@=" nextgroup=p6RxP5WriteRefId
913syn match p6RxP5WriteRefId display contained "\d\+"
914syn region p6RxP5WriteRefId
915    \ matchgroup=p6RxP5Escape
916    \ start="{"
917    \ end="}"
918    \ contained
919syn match p6RxP5Prop       display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=p6RxP5PropId
920syn match p6RxP5PropId     display contained "\a"
921syn region p6RxP5PropId
922    \ matchgroup=p6RxP5Escape
923    \ start="{"
924    \ end="}"
925    \ contained
926syn match p6RxP5Meta       display contained "[(|).]"
927syn match p6RxP5ParenMod   display contained "(\@<=?\@=" nextgroup=p6RxP5Mod,p6RxP5ModName,p6RxP5Code
928syn match p6RxP5Mod        display contained "?\%(<\?=\|<\?!\|[#:|]\)"
929syn match p6RxP5Mod        display contained "?-\?[impsx]\+"
930syn match p6RxP5Mod        display contained "?\%([-+]\?\d\+\|R\)"
931syn match p6RxP5Mod        display contained "?(DEFINE)"
932syn match p6RxP5Mod        display contained "?\%(&\|P[>=]\)" nextgroup=p6RxP5ModDef
933syn match p6RxP5ModDef     display contained "\h\w*"
934syn region p6RxP5ModName
935    \ matchgroup=p6StringSpecial
936    \ start="?'"
937    \ end="'"
938    \ contained
939syn region p6RxP5ModName
940    \ matchgroup=p6StringSpecial
941    \ start="?P\?<"
942    \ end=">"
943    \ contained
944syn region p6RxP5Code
945    \ matchgroup=p6StringSpecial
946    \ start="??\?{"
947    \ end="})\@="
948    \ contained
949    \ contains=TOP
950syn match p6RxP5EscMeta    display contained "\\[?*.{}()[\]|\^$]"
951syn match p6RxP5Count      display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=p6RxP5CountId
952syn region p6RxP5CountId
953    \ matchgroup=p6RxP5Escape
954    \ start="{"
955    \ end="}"
956    \ contained
957syn match p6RxP5Verb       display contained "(\@<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)"
958syn region p6RxP5QuoteMeta
959    \ matchgroup=p6RxP5Escape
960    \ start="\\Q"
961    \ end="\\E"
962    \ contained
963    \ contains=@p6Variables,p6EscBackSlash
964syn region p6RxP5CharClass
965    \ matchgroup=p6StringSpecial
966    \ start="\[\^\?"
967    \ skip="\\]"
968    \ end="]"
969    \ contained
970    \ contains=@p6RegexP5Class
971syn region p6RxP5Posix
972    \ matchgroup=p6RxP5Escape
973    \ start="\[:"
974    \ end=":]"
975    \ contained
976syn match p6RxP5Range      display contained "-"
977
978" 'string' inside a regex
979syn region p6RxStringSQ
980    \ matchgroup=p6Quote
981    \ start="'"
982    \ skip="\\\@<!\\'"
983    \ end="'"
984    \ contained
985    \ contains=p6EscQuote,p6EscBackSlash
986
987" "string" inside a regex
988syn region p6RxStringDQ
989    \ matchgroup=p6Quote
990    \ start=+"+
991    \ skip=+\\\@<!\\"+
992    \ end=+"+
993    \ contained
994    \ contains=p6EscDoubleQuote,p6EscBackSlash
995
996" $!, $var, $!var, $::var, $package::var $*::package::var, etc
997" Thus must come after the matches for the "$" regex anchor, but before
998" the match for the $ regex delimiter
999syn cluster p6Variables
1000    \ add=p6VarSlash
1001    \ add=p6VarExclam
1002    \ add=p6VarMatch
1003    \ add=p6VarNum
1004    \ add=p6Variable
1005
1006syn match p6VarSlash     display "\$/"
1007syn match p6VarExclam    display "\$!"
1008syn match p6VarMatch     display "\$¢"
1009syn match p6VarNum       display "\$\d\+"
1010syn match p6Variable     display "\%(@@\|[@&$%]\$*\)\%(::\|\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\)\|\K\)\@=" nextgroup=p6Twigil,p6VarName,p6PackageScope
1011syn match p6VarName      display "\K\%(\k\|[-']\K\@=\)*" contained
1012syn match p6Twigil       display "\%([.^*?=!~]\|:\@<!::\@!\)\K\@=" nextgroup=p6PackageScope,p6VarName contained
1013syn match p6PackageScope display "\%(\K\%(\k\|[-']\K\@=\)*\)\?::" nextgroup=p6PackageScope,p6VarName contained
1014
1015" Perl 6 regex regions
1016
1017" /foo/
1018" Below some hacks to recognise the // variant. This is virtually impossible
1019" to catch in all cases as the / is used in so many other ways, but these
1020" should be the most obvious ones.
1021" TODO: mostly stolen from perl.vim, might need more work
1022syn region p6Match
1023    \ matchgroup=p6Quote
1024    \ start="\%([$@%&*]\@<!\%(\<\%(split\|while\|until\|if\|unless\)\|\.\.\|[-+*!~(\[{=]\)\s*\)\@<=//\@!"
1025    \ start="^//\@!"
1026    \ start=+\s\@<=/[^[:space:][:digit:]$@%=]\@=\%(/\_s*\%([([{$@%&*[:digit:]"'`]\|\_s\w\|[[:upper:]_abd-fhjklnqrt-wyz]\)\)\@!/\@!+
1027    \ skip="\\/"
1028    \ end="/"
1029    \ contains=@p6Regexen,p6Variable,p6VarExclam,p6VarMatch,p6VarNum
1030
1031" m/foo/, mm/foo/, rx/foo/
1032syn region p6Match
1033    \ matchgroup=p6Quote
1034    \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=//\@!"
1035    \ skip="\\/"
1036    \ end="/"
1037    \ keepend
1038    \ contains=@p6Regexen,p6Variable,p6VarExclam,p6VarMatch,p6VarNum
1039
1040" m!foo!, mm!foo!, rx!foo!
1041syn region p6Match
1042    \ matchgroup=p6Quote
1043    \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=!!\@!"
1044    \ skip="\\!"
1045    \ end="!"
1046    \ keepend
1047    \ contains=@p6Regexen,p6Variable,p6VarSlash,p6VarMatch,p6VarNum
1048
1049" m$foo$, mm$foo$, rx$foo$, m|foo|, mm|foo|, rx|foo|, etc
1050syn region p6Match
1051    \ matchgroup=p6Quote
1052    \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\z([\"'`|,$]\)\$\@!"
1053    \ skip="\\\z1"
1054    \ end="\z1"
1055    \ keepend
1056    \ contains=@p6Regexen,@p6Variables
1057
1058" m (foo), mm (foo), rx (foo)
1059syn region p6Match
1060    \ matchgroup=p6Quote
1061    \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s\+\)\@<=()\@!)\@!"
1062    \ skip="\\)"
1063    \ end=")"
1064    \ contains=@p6Regexen,@p6Variables
1065
1066" m[foo], mm[foo], rx[foo]
1067syn region p6Match
1068    \ matchgroup=p6Quote
1069    \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\[]\@!]\@!"
1070    \ skip="\\]"
1071    \ end="]"
1072    \ contains=@p6Regexen,@p6Variables
1073
1074" m{foo}, mm{foo}, rx{foo}
1075syn region p6Match
1076    \ matchgroup=p6Quote
1077    \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<={}\@!}\@!"
1078    \ skip="\\}"
1079    \ end="}"
1080    \ contains=@p6Regexen,@p6Variables
1081
1082" m<foo>, mm<foo>, rx<foo>
1083syn region p6Match
1084    \ matchgroup=p6Quote
1085    \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=<>\@!>\@!"
1086    \ skip="\\>"
1087    \ end=">"
1088    \ contains=@p6Regexen,@p6Variables
1089
1090" m«foo», mm«foo», rx«foo»
1091syn region p6Match
1092    \ matchgroup=p6Quote
1093    \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=«»\@!»\@!"
1094    \ skip="\\»"
1095    \ end="»"
1096    \ contains=@p6Regexen,@p6Variables
1097
1098" Substitutions
1099
1100" s/foo/bar/
1101syn region p6Match
1102    \ matchgroup=p6Quote
1103    \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=/"
1104    \ skip="\\/"
1105    \ end="/"me=e-1
1106    \ keepend
1107    \ contains=@p6Regexen,p6Variable,p6VarExclam,p6VarMatch,p6VarNum
1108    \ nextgroup=p6Substitution
1109
1110syn region p6Substitution
1111    \ matchgroup=p6Quote
1112    \ start="/"
1113    \ skip="\\/"
1114    \ end="/"
1115    \ contained
1116    \ keepend
1117    \ contains=@p6Interp_qq
1118
1119" s!foo!bar!
1120syn region p6Match
1121    \ matchgroup=p6Quote
1122    \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=!"
1123    \ skip="\\!"
1124    \ end="!"me=e-1
1125    \ keepend
1126    \ contains=@p6Regexen,p6Variable,p6VarSlash,p6VarMatch,p6VarNum
1127    \ nextgroup=p6Substitution
1128
1129syn region p6Substitution
1130    \ matchgroup=p6Quote
1131    \ start="!"
1132    \ skip="\\!"
1133    \ end="!"
1134    \ contained
1135    \ keepend
1136    \ contains=@p6Interp_qq
1137
1138" s$foo$bar$, s|foo|bar, etc
1139syn region p6Match
1140    \ matchgroup=p6Quote
1141    \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\z([\"'`|,$]\)"
1142    \ skip="\\\z1"
1143    \ end="\z1"me=e-1
1144    \ keepend
1145    \ contains=@p6Regexen,@p6Variables
1146    \ nextgroup=p6Substitution
1147
1148syn region p6Substitution
1149    \ matchgroup=p6Quote
1150    \ start="\z([\"'`|,$]\)"
1151    \ skip="\\\z1"
1152    \ end="\z1"
1153    \ contained
1154    \ keepend
1155    \ contains=@p6Interp_qq
1156
1157" s{foo}
1158syn region p6Match
1159    \ matchgroup=p6Quote
1160    \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<={}\@!"
1161    \ skip="\\}"
1162    \ end="}"
1163    \ contains=@p6Regexen,@p6Variables
1164
1165" s[foo]
1166syn region p6Match
1167    \ matchgroup=p6Quote
1168    \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\[]\@!"
1169    \ skip="\\]"
1170    \ end="]"
1171    \ contains=@p6Regexen,@p6Variables
1172
1173" s<foo>
1174syn region p6Match
1175    \ matchgroup=p6Quote
1176    \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=<>\@!"
1177    \ skip="\\>"
1178    \ end=">"
1179    \ contains=@p6Regexen,@p6Variables
1180
1181" s«foo»
1182syn region p6Match
1183    \ matchgroup=p6Quote
1184    \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=«»\@!"
1185    \ skip="\\»"
1186    \ end="»"
1187    \ contains=@p6Regexen,@p6Variables
1188
1189" s (foo)
1190syn region p6Match
1191    \ matchgroup=p6Quote
1192    \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s\+\)\@<=()\@!"
1193    \ skip="\\)"
1194    \ end=")"
1195    \ contains=@p6Regexen,@p6Variables
1196
1197" Perl 5 regex regions
1198
1199" m:P5//
1200syn region p6Match
1201    \ matchgroup=p6Quote
1202    \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=/"
1203    \ skip="\\/"
1204    \ end="/"
1205    \ contains=@p6RegexP5,p6Variable,p6VarExclam,p6VarMatch,p6VarNum
1206
1207" m:P5!!
1208syn region p6Match
1209    \ matchgroup=p6Quote
1210    \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=!"
1211    \ skip="\\!"
1212    \ end="!"
1213    \ contains=@p6RegexP5,p6Variable,p6VarSlash,p6VarMatch,p6VarNum
1214
1215" m:P5$$, m:P5||, etc
1216syn region p6Match
1217    \ matchgroup=p6Quote
1218    \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=\z([\"'`|,$]\)"
1219    \ skip="\\\z1"
1220    \ end="\z1"
1221    \ contains=@p6RegexP5,@p6Variables
1222
1223" m:P5 ()
1224syn region p6Match
1225    \ matchgroup=p6Quote
1226    \ start="\%(\<m\s*:P\%(erl\)\?5\s\+\)\@<=()\@!"
1227    \ skip="\\)"
1228    \ end=")"
1229    \ contains=@p6RegexP5,@p6Variables
1230
1231" m:P5[]
1232syn region p6Match
1233    \ matchgroup=p6Quote
1234    \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=[]\@!"
1235    \ skip="\\]"
1236    \ end="]"
1237    \ contains=@p6RegexP5,@p6Variables
1238
1239" m:P5{}
1240syn region p6Match
1241    \ matchgroup=p6Quote
1242    \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<={}\@!"
1243    \ skip="\\}"
1244    \ end="}"
1245    \ contains=@p6RegexP5,p6Variables
1246
1247" m:P5<>
1248syn region p6Match
1249    \ matchgroup=p6Quote
1250    \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=<>\@!"
1251    \ skip="\\>"
1252    \ end=">"
1253    \ contains=@p6RegexP5,p6Variables
1254
1255" m:P5«»
1256syn region p6Match
1257    \ matchgroup=p6Quote
1258    \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=«»\@!"
1259    \ skip="\\»"
1260    \ end="»"
1261    \ contains=@p6RegexP5,p6Variables
1262
1263" Transliteration
1264
1265" tr/foo/bar/, tr|foo|bar, etc
1266syn region p6String
1267    \ matchgroup=p6Quote
1268    \ start="\%(\<tr\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\z([/\"'`|!,$]\)"
1269    \ skip="\\\z1"
1270    \ end="\z1"me=e-1
1271    \ contains=p6RxRange
1272    \ nextgroup=p6Transliteration
1273
1274syn region p6Transliteration
1275    \ matchgroup=p6Quote
1276    \ start="\z([/\"'`|!,$]\)"
1277    \ skip="\\\z1"
1278    \ end="\z1"
1279    \ contained
1280    \ contains=@p6Interp_qq
1281
1282" Comments
1283
1284" normal end-of-line comment
1285syn match p6Comment display "#.*" contains=p6Attention
1286
1287" Multiline comments. Arbitrary numbers of opening brackets are allowed,
1288" but we only define regions for 1 to 3
1289syn region p6Comment
1290    \ matchgroup=p6Comment
1291    \ start="^\@<!#("
1292    \ skip="([^)]*)"
1293    \ end=")"
1294    \ matchgroup=p6Error
1295    \ start="^#("
1296    \ contains=p6Attention,p6Comment
1297syn region p6Comment
1298    \ matchgroup=p6Comment
1299    \ start="^\@<!#\["
1300    \ skip="\[[^\]]*]"
1301    \ end="]"
1302    \ matchgroup=p6Error
1303    \ start="^#\["
1304    \ contains=p6Attention,p6Comment
1305syn region p6Comment
1306    \ matchgroup=p6Comment
1307    \ start="^\@<!#{"
1308    \ skip="{[^}]*}"
1309    \ end="}"
1310    \ matchgroup=p6Error
1311    \ start="^#{"
1312    \ contains=p6Attention,p6Comment
1313syn region p6Comment
1314    \ matchgroup=p6Comment
1315    \ start="^\@<!#<"
1316    \ skip="<[^>]*>"
1317    \ end=">"
1318    \ matchgroup=p6Error
1319    \ start="^#<"
1320    \ contains=p6Attention,p6Comment
1321syn region p6Comment
1322    \ matchgroup=p6Comment
1323    \ start="^\@<!#«"
1324    \ skip="«[^»]*»"
1325    \ end="»"
1326    \ matchgroup=p6Error
1327    \ start="^#«"
1328    \ contains=p6Attention,p6Comment
1329
1330" double and triple delimiters
1331if exists("perl6_extended_comments") || exists("perl6_extended_all")
1332    syn region p6Comment
1333        \ matchgroup=p6Comment
1334        \ start="^\@<!#(("
1335        \ skip="((\%([^)\|))\@!]\)*))"
1336        \ end="))"
1337        \ matchgroup=p6Error
1338        \ start="^#(("
1339        \ contains=p6Attention,p6Comment
1340    syn region p6Comment
1341        \ matchgroup=p6Comment
1342        \ start="^\@<!#((("
1343        \ skip="(((\%([^)]\|)\%())\)\@!\)*)))"
1344        \ end=")))"
1345        \ matchgroup=p6Error
1346        \ start="^#((("
1347        \ contains=p6Attention,p6Comment
1348
1349    syn region p6Comment
1350        \ matchgroup=p6Comment
1351        \ start="^\@<!#\[\["
1352        \ skip="\[\[\%([^\]]\|]]\@!\)*]]"
1353        \ end="]]"
1354        \ matchgroup=p6Error
1355        \ start="^#\[\["
1356        \ contains=p6Attention,p6Comment
1357    syn region p6Comment
1358        \ matchgroup=p6Comment
1359        \ start="^\@<!#\[\[\["
1360        \ skip="\[\[\[\%([^\]]\|]\%(]]\)\@!\)*]]]"
1361        \ end="]]]"
1362        \ matchgroup=p6Error
1363        \ start="^#\[\[\["
1364        \ contains=p6Attention,p6Comment
1365
1366    syn region p6Comment
1367        \ matchgroup=p6Comment
1368        \ start="^\@<!#{{"
1369        \ skip="{{\%([^}]\|}}\@!\)*}}"
1370        \ end="}}"
1371        \ matchgroup=p6Error
1372        \ start="^#{{"
1373        \ contains=p6Attention,p6Comment
1374    syn region p6Comment
1375        \ matchgroup=p6Comment
1376        \ start="^\@<!#{{{"
1377        \ skip="{{{\%([^}]\|}\%(}}\)\@!\)*}}}"
1378        \ end="}}}"
1379        \ matchgroup=p6Error
1380        \ start="^#{{{"
1381        \ contains=p6Attention,p6Comment
1382
1383    syn region p6Comment
1384        \ matchgroup=p6Comment
1385        \ start="^\@<!#<<"
1386        \ skip="<<\%([^>]\|>>\@!\)*>>"
1387        \ end=">>"
1388        \ matchgroup=p6Error
1389        \ start="^#<<"
1390        \ contains=p6Attention,p6Comment
1391    syn region p6Comment
1392        \ matchgroup=p6Comment
1393        \ start="^\@<!#<<<"
1394        \ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>"
1395        \ end=">>>"
1396        \ matchgroup=p6Error
1397        \ start="^#<<<"
1398        \ contains=p6Attention,p6Comment
1399
1400    syn region p6Comment
1401        \ matchgroup=p6Comment
1402        \ start="^\@<!#««"
1403        \ skip="««\%([^»]\|»»\@!\)*»»"
1404        \ end="»»"
1405        \ matchgroup=p6Error
1406        \ start="^#««"
1407        \ contains=p6Attention,p6Comment
1408    syn region p6Comment
1409        \ matchgroup=p6Comment
1410        \ start="^\@<!#«««"
1411        \ skip="«««\%([^»]\|»\%(»»\)\@!\)*»»»"
1412        \ end="»»»"
1413        \ matchgroup=p6Error
1414        \ start="^#«««"
1415        \ contains=p6Attention,p6Comment
1416endif
1417
1418" Pod
1419
1420" Abbreviated blocks (implicit code forbidden)
1421syn region p6PodAbbrRegion
1422    \ matchgroup=p6PodPrefix
1423    \ start="^=\ze\K\k*"
1424    \ end="^\ze\%(\s*$\|=\K\)"
1425    \ contains=p6PodAbbrNoCodeType
1426    \ keepend
1427
1428syn region p6PodAbbrNoCodeType
1429    \ matchgroup=p6PodType
1430    \ start="\K\k*"
1431    \ end="^\ze\%(\s*$\|=\K\)"
1432    \ contained
1433    \ contains=p6PodName,p6PodAbbrNoCode
1434
1435syn match p6PodName contained ".\+" contains=@p6PodFormat
1436syn match p6PodComment contained ".\+"
1437
1438syn region p6PodAbbrNoCode
1439    \ start="^"
1440    \ end="^\ze\%(\s*$\|=\K\)"
1441    \ contained
1442    \ contains=@p6PodFormat
1443
1444" Abbreviated blocks (everything is code)
1445syn region p6PodAbbrRegion
1446    \ matchgroup=p6PodPrefix
1447    \ start="^=\zecode\>"
1448    \ end="^\ze\%(\s*$\|=\K\)"
1449    \ contains=p6PodAbbrCodeType
1450    \ keepend
1451
1452syn region p6PodAbbrCodeType
1453    \ matchgroup=p6PodType
1454    \ start="\K\k*"
1455    \ end="^\ze\%(\s*$\|=\K\)"
1456    \ contained
1457    \ contains=p6PodName,p6PodAbbrCode
1458
1459syn region p6PodAbbrCode
1460    \ start="^"
1461    \ end="^\ze\%(\s*$\|=\K\)"
1462    \ contained
1463
1464" Abbreviated blocks (everything is a comment)
1465syn region p6PodAbbrRegion
1466    \ matchgroup=p6PodPrefix
1467    \ start="^=\zecomment\>"
1468    \ end="^\ze\%(\s*$\|=\K\)"
1469    \ contains=p6PodAbbrCommentType
1470    \ keepend
1471
1472syn region p6PodAbbrCommentType
1473    \ matchgroup=p6PodType
1474    \ start="\K\k*"
1475    \ end="^\ze\%(\s*$\|=\K\)"
1476    \ contained
1477    \ contains=p6PodComment,p6PodAbbrNoCode
1478
1479" Abbreviated blocks (implicit code allowed)
1480syn region p6PodAbbrRegion
1481    \ matchgroup=p6PodPrefix
1482    \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>"
1483    \ end="^\ze\%(\s*$\|=\K\)"
1484    \ contains=p6PodAbbrType
1485    \ keepend
1486
1487syn region p6PodAbbrType
1488    \ matchgroup=p6PodType
1489    \ start="\K\k*"
1490    \ end="^\ze\%(\s*$\|=\K\)"
1491    \ contained
1492    \ contains=p6PodName,p6PodAbbr
1493
1494syn region p6PodAbbr
1495    \ start="^"
1496    \ end="^\ze\%(\s*$\|=\K\)"
1497    \ contained
1498    \ contains=@p6PodFormat,p6PodImplicitCode
1499
1500" Abbreviated block to end-of-file
1501syn region p6PodAbbrRegion
1502    \ matchgroup=p6PodPrefix
1503    \ start="^=\zeEND\>"
1504    \ end="\%$"
1505    \ contains=p6PodAbbrEOFType
1506    \ keepend
1507
1508syn region p6PodAbbrEOFType
1509    \ matchgroup=p6PodType
1510    \ start="\K\k*"
1511    \ end="\%$"
1512    \ contained
1513    \ contains=p6PodName,p6PodAbbrEOF
1514
1515syn region p6PodAbbrEOF
1516    \ start="^"
1517    \ end="\%$"
1518    \ contained
1519    \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode
1520
1521" Directives
1522syn region p6PodDirectRegion
1523    \ matchgroup=p6PodPrefix
1524    \ start="^=\%(config\|use\)\>"
1525    \ end="^\ze\%([^=]\|=\K\|\s*$\)"
1526    \ contains=p6PodDirectArgRegion
1527    \ keepend
1528
1529syn region p6PodDirectArgRegion
1530    \ matchgroup=p6PodType
1531    \ start="\S\+"
1532    \ end="^\ze\%([^=]\|=\K\|\s*$\)"
1533    \ contained
1534    \ contains=p6PodDirectConfigRegion
1535
1536syn region p6PodDirectConfigRegion
1537    \ start=""
1538    \ end="^\ze\%([^=]\|=\K\|\s*$\)"
1539    \ contained
1540    \ contains=@p6PodConfig
1541
1542" =encoding is a special directive
1543syn region p6PodDirectRegion
1544    \ matchgroup=p6PodPrefix
1545    \ start="^=encoding\>"
1546    \ end="^\ze\%([^=]\|=\K\|\s*$\)"
1547    \ contains=p6PodEncodingArgRegion
1548    \ keepend
1549
1550syn region p6PodEncodingArgRegion
1551    \ matchgroup=p6PodName
1552    \ start="\S\+"
1553    \ end="^\ze\%([^=]\|=\K\|\s*$\)"
1554    \ contained
1555
1556" Paragraph blocks (implicit code forbidden)
1557syn region p6PodParaRegion
1558    \ matchgroup=p6PodPrefix
1559    \ start="^=for\>"
1560    \ end="^\ze\%(\s*$\|=\K\)"
1561    \ contains=p6PodParaNoCodeTypeRegion
1562    \ keepend
1563    \ extend
1564
1565syn region p6PodParaNoCodeTypeRegion
1566    \ matchgroup=p6PodType
1567    \ start="\K\k*"
1568    \ end="^\ze\%(\s*$\|=\K\)"
1569    \ contained
1570    \ contains=p6PodParaNoCode,p6PodParaConfigRegion
1571
1572syn region p6PodParaConfigRegion
1573    \ start=""
1574    \ end="^\ze\%([^=]\|=\k\@<!\)"
1575    \ contained
1576    \ contains=@p6PodConfig
1577
1578syn region p6PodParaNoCode
1579    \ start="^[^=]"
1580    \ end="^\ze\%(\s*$\|=\K\)"
1581    \ contained
1582    \ contains=@p6PodFormat
1583
1584" Paragraph blocks (everything is code)
1585syn region p6PodParaRegion
1586    \ matchgroup=p6PodPrefix
1587    \ start="^=for\>\ze\s*code\>"
1588    \ end="^\ze\%(\s*$\|=\K\)"
1589    \ contains=p6PodParaCodeTypeRegion
1590    \ keepend
1591    \ extend
1592
1593syn region p6PodParaCodeTypeRegion
1594    \ matchgroup=p6PodType
1595    \ start="\K\k*"
1596    \ end="^\ze\%(\s*$\|=\K\)"
1597    \ contained
1598    \ contains=p6PodParaCode,p6PodParaConfigRegion
1599
1600syn region p6PodParaCode
1601    \ start="^[^=]"
1602    \ end="^\ze\%(\s*$\|=\K\)"
1603    \ contained
1604
1605" Paragraph blocks (implicit code allowed)
1606syn region p6PodParaRegion
1607    \ matchgroup=p6PodPrefix
1608    \ start="^=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
1609    \ end="^\ze\%(\s*$\|=\K\)"
1610    \ contains=p6PodParaTypeRegion
1611    \ keepend
1612    \ extend
1613
1614syn region p6PodParaTypeRegion
1615    \ matchgroup=p6PodType
1616    \ start="\K\k*"
1617    \ end="^\ze\%(\s*$\|=\K\)"
1618    \ contained
1619    \ contains=p6PodPara,p6PodParaConfigRegion
1620
1621syn region p6PodPara
1622    \ start="^[^=]"
1623    \ end="^\ze\%(\s*$\|=\K\)"
1624    \ contained
1625    \ contains=@p6PodFormat,p6PodImplicitCode
1626
1627" Paragraph block to end-of-file
1628syn region p6PodParaRegion
1629    \ matchgroup=p6PodPrefix
1630    \ start="^=for\>\ze\s\+END\>"
1631    \ end="\%$"
1632    \ contains=p6PodParaEOFTypeRegion
1633    \ keepend
1634    \ extend
1635
1636syn region p6PodParaEOFTypeRegion
1637    \ matchgroup=p6PodType
1638    \ start="\K\k*"
1639    \ end="\%$"
1640    \ contained
1641    \ contains=p6PodParaEOF,p6PodParaConfigRegion
1642
1643syn region p6PodParaEOF
1644    \ start="^[^=]"
1645    \ end="\%$"
1646    \ contained
1647    \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode
1648
1649" Delimited blocks (implicit code forbidden)
1650syn region p6PodDelimRegion
1651    \ matchgroup=p6PodPrefix
1652    \ start="^=begin\>"
1653    \ end="^=end\>"
1654    \ contains=p6PodDelimNoCodeTypeRegion
1655    \ keepend
1656    \ extend
1657
1658syn region p6PodDelimNoCodeTypeRegion
1659    \ matchgroup=p6PodType
1660    \ start="\K\k*"
1661    \ end="^\ze=end\>"
1662    \ contained
1663    \ contains=p6PodDelimNoCode,p6PodDelimConfigRegion
1664
1665syn region p6PodDelimConfigRegion
1666    \ start=""
1667    \ end="^\ze\%([^=]\|=\K\|\s*$\)"
1668    \ contained
1669    \ contains=@p6PodConfig
1670
1671syn region p6PodDelimNoCode
1672    \ start="^"
1673    \ end="^\ze=end\>"
1674    \ contained
1675    \ contains=@p6PodNestedBlocks,@p6PodFormat
1676
1677" Delimited blocks (everything is code)
1678syn region p6PodDelimRegion
1679    \ matchgroup=p6PodPrefix
1680    \ start="^=begin\>\ze\s*code\>"
1681    \ end="^=end\>"
1682    \ contains=p6PodDelimCodeTypeRegion
1683    \ keepend
1684    \ extend
1685
1686syn region p6PodDelimCodeTypeRegion
1687    \ matchgroup=p6PodType
1688    \ start="\K\k*"
1689    \ end="^\ze=end\>"
1690    \ contained
1691    \ contains=p6PodDelimCode,p6PodDelimConfigRegion
1692
1693syn region p6PodDelimCode
1694    \ start="^"
1695    \ end="^\ze=end\>"
1696    \ contained
1697    \ contains=@p6PodNestedBlocks
1698
1699" Delimited blocks (implicit code allowed)
1700syn region p6PodDelimRegion
1701    \ matchgroup=p6PodPrefix
1702    \ start="^=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
1703    \ end="^=end\>"
1704    \ contains=p6PodDelimTypeRegion
1705    \ keepend
1706    \ extend
1707
1708syn region p6PodDelimTypeRegion
1709    \ matchgroup=p6PodType
1710    \ start="\K\k*"
1711    \ end="^\ze=end\>"
1712    \ contained
1713    \ contains=p6PodDelim,p6PodDelimConfigRegion
1714
1715syn region p6PodDelim
1716    \ start="^"
1717    \ end="^\ze=end\>"
1718    \ contained
1719    \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode
1720
1721" Delimited block to end-of-file
1722syn region p6PodDelimRegion
1723    \ matchgroup=p6PodPrefix
1724    \ start="^=begin\>\ze\s\+END\>"
1725    \ end="\%$"
1726    \ contains=p6PodDelimEOFTypeRegion
1727    \ extend
1728
1729syn region p6PodDelimEOFTypeRegion
1730    \ matchgroup=p6PodType
1731    \ start="\K\k*"
1732    \ end="\%$"
1733    \ contained
1734    \ contains=p6PodDelimEOF,p6PodDelimConfigRegion
1735
1736syn region p6PodDelimEOF
1737    \ start="^"
1738    \ end="\%$"
1739    \ contained
1740    \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode
1741
1742syn cluster p6PodConfig
1743    \ add=p6PodConfigOperator
1744    \ add=p6PodExtraConfig
1745    \ add=p6StringAuto
1746    \ add=p6PodAutoQuote
1747    \ add=p6StringSQ
1748
1749syn region p6PodParens
1750    \ start="("
1751    \ end=")"
1752    \ contained
1753    \ contains=p6Number,p6StringSQ
1754
1755syn match p6PodAutoQuote      display contained "=>"
1756syn match p6PodConfigOperator display contained ":!\?" nextgroup=p6PodConfigOption
1757syn match p6PodConfigOption   display contained "[^[:space:](<]\+" nextgroup=p6PodParens,p6StringAngle
1758syn match p6PodExtraConfig    display contained "^="
1759syn match p6PodVerticalBar    display contained "|"
1760syn match p6PodColon          display contained ":"
1761syn match p6PodSemicolon      display contained ";"
1762syn match p6PodComma          display contained ","
1763syn match p6PodImplicitCode   display contained "^\s.*"
1764
1765syn region p6PodDelimEndRegion
1766    \ matchgroup=p6PodType
1767    \ start="\%(^=end\>\)\@<="
1768    \ end="\K\k*"
1769
1770" These may appear inside delimited blocks
1771syn cluster p6PodNestedBlocks
1772    \ add=p6PodAbbrRegion
1773    \ add=p6PodDirectRegion
1774    \ add=p6PodParaRegion
1775    \ add=p6PodDelimRegion
1776    \ add=p6PodDelimEndRegion
1777
1778" Pod formatting codes
1779
1780syn cluster p6PodFormat
1781    \ add=p6PodFormatOne
1782    \ add=p6PodFormatTwo
1783    \ add=p6PodFormatThree
1784    \ add=p6PodFormatFrench
1785
1786" Balanced angles found inside formatting codes. Ensures proper nesting.
1787
1788syn region p6PodFormatAnglesOne
1789    \ matchgroup=p6PodFormat
1790    \ start="<"
1791    \ skip="<[^>]*>"
1792    \ end=">"
1793    \ transparent
1794    \ contained
1795    \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne
1796
1797syn region p6PodFormatAnglesTwo
1798    \ matchgroup=p6PodFormat
1799    \ start="<<"
1800    \ skip="<<[^>]*>>"
1801    \ end=">>"
1802    \ transparent
1803    \ contained
1804    \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo
1805
1806syn region p6PodFormatAnglesThree
1807    \ matchgroup=p6PodFormat
1808    \ start="<<<"
1809    \ skip="<<<[^>]*>>>"
1810    \ end=">>>"
1811    \ transparent
1812    \ contained
1813    \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo,p6PodFormatAnglesThree
1814
1815syn region p6PodFormatAnglesFrench
1816    \ matchgroup=p6PodFormat
1817    \ start="«"
1818    \ skip="«[^»]*»"
1819    \ end="»"
1820    \ transparent
1821    \ contained
1822    \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo,p6PodFormatAnglesThree
1823
1824" All formatting codes
1825
1826syn region p6PodFormatOne
1827    \ matchgroup=p6PodFormatCode
1828    \ start="\u<"
1829    \ skip="<[^>]*>"
1830    \ end=">"
1831    \ contained
1832    \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne
1833
1834syn region p6PodFormatTwo
1835    \ matchgroup=p6PodFormatCode
1836    \ start="\u<<"
1837    \ skip="<<[^>]*>>"
1838    \ end=">>"
1839    \ contained
1840    \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo
1841
1842syn region p6PodFormatThree
1843    \ matchgroup=p6PodFormatCode
1844    \ start="\u<<<"
1845    \ skip="<<<[^>]*>>>"
1846    \ end=">>>"
1847    \ contained
1848    \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree
1849
1850syn region p6PodFormatFrench
1851    \ matchgroup=p6PodFormatCode
1852    \ start="\u«"
1853    \ skip="«[^»]*»"
1854    \ end="»"
1855    \ contained
1856    \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree
1857
1858" C<> and V<> don't allow nested formatting formatting codes
1859
1860syn region p6PodFormatOne
1861    \ matchgroup=p6PodFormatCode
1862    \ start="[CV]<"
1863    \ skip="<[^>]*>"
1864    \ end=">"
1865    \ contained
1866    \ contains=p6PodFormatAnglesOne
1867
1868syn region p6PodFormatTwo
1869    \ matchgroup=p6PodFormatCode
1870    \ start="[CV]<<"
1871    \ skip="<<[^>]*>>"
1872    \ end=">>"
1873    \ contained
1874    \ contains=p6PodFormatAnglesTwo
1875
1876syn region p6PodFormatThree
1877    \ matchgroup=p6PodFormatCode
1878    \ start="[CV]<<<"
1879    \ skip="<<<[^>]*>>>"
1880    \ end=">>>"
1881    \ contained
1882    \ contains=p6PodFormatAnglesThree
1883
1884syn region p6PodFormatFrench
1885    \ matchgroup=p6PodFormatCode
1886    \ start="[CV]«"
1887    \ skip="«[^»]*»"
1888    \ end="»"
1889    \ contained
1890    \ contains=p6PodFormatAnglesFrench
1891
1892" L<> can have a "|" separator
1893
1894syn region p6PodFormatOne
1895    \ matchgroup=p6PodFormatCode
1896    \ start="L<"
1897    \ skip="<[^>]*>"
1898    \ end=">"
1899    \ contained
1900    \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar
1901
1902syn region p6PodFormatTwo
1903    \ matchgroup=p6PodFormatCode
1904    \ start="L<<"
1905    \ skip="<<[^>]*>>"
1906    \ end=">>"
1907    \ contained
1908    \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar
1909
1910syn region p6PodFormatThree
1911    \ matchgroup=p6PodFormatCode
1912    \ start="L<<<"
1913    \ skip="<<<[^>]*>>>"
1914    \ end=">>>"
1915    \ contained
1916    \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar
1917
1918syn region p6PodFormatFrench
1919    \ matchgroup=p6PodFormatCode
1920    \ start="L«"
1921    \ skip="«[^»]*»"
1922    \ end="»"
1923    \ contained
1924    \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar
1925
1926" E<> can have a ";" separator
1927
1928syn region p6PodFormatOne
1929    \ matchgroup=p6PodFormatCode
1930    \ start="E<"
1931    \ skip="<[^>]*>"
1932    \ end=">"
1933    \ contained
1934    \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodSemiColon
1935
1936syn region p6PodFormatTwo
1937    \ matchgroup=p6PodFormatCode
1938    \ start="E<<"
1939    \ skip="<<[^>]*>>"
1940    \ end=">>"
1941    \ contained
1942    \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodSemiColon
1943
1944syn region p6PodFormatThree
1945    \ matchgroup=p6PodFormatCode
1946    \ start="E<<<"
1947    \ skip="<<<[^>]*>>>"
1948    \ end=">>>"
1949    \ contained
1950    \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodSemiColon
1951
1952syn region p6PodFormatFrench
1953    \ matchgroup=p6PodFormatCode
1954    \ start="E«"
1955    \ skip="«[^»]*»"
1956    \ end="»"
1957    \ contained
1958    \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodSemiColon
1959
1960" M<> can have a ":" separator
1961
1962syn region p6PodFormatOne
1963    \ matchgroup=p6PodFormatCode
1964    \ start="M<"
1965    \ skip="<[^>]*>"
1966    \ end=">"
1967    \ contained
1968    \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodColon
1969
1970syn region p6PodFormatTwo
1971    \ matchgroup=p6PodFormatCode
1972    \ start="M<<"
1973    \ skip="<<[^>]*>>"
1974    \ end=">>"
1975    \ contained
1976    \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodColon
1977
1978syn region p6PodFormatThree
1979    \ matchgroup=p6PodFormatCode
1980    \ start="M<<<"
1981    \ skip="<<<[^>]*>>>"
1982    \ end=">>>"
1983    \ contained
1984    \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodColon
1985
1986syn region p6PodFormatFrench
1987    \ matchgroup=p6PodFormatCode
1988    \ start="M«"
1989    \ skip="«[^»]*»"
1990    \ end="»"
1991    \ contained
1992    \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodColon
1993
1994" D<> can have "|" and ";" separators
1995
1996syn region p6PodFormatOne
1997    \ matchgroup=p6PodFormatCode
1998    \ start="D<"
1999    \ skip="<[^>]*>"
2000    \ end=">"
2001    \ contained
2002    \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar,p6PodSemiColon
2003
2004syn region p6PodFormatTwo
2005    \ matchgroup=p6PodFormatCode
2006    \ start="D<<"
2007    \ skip="<<[^>]*>>"
2008    \ end=">>"
2009    \ contained
2010    \ contains=p6PodFormatAngleTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar,p6PodSemiColon
2011
2012syn region p6PodFormatThree
2013    \ matchgroup=p6PodFormatCode
2014    \ start="D<<<"
2015    \ skip="<<<[^>]*>>>"
2016    \ end=">>>"
2017    \ contained
2018    \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon
2019
2020syn region p6PodFormatFrench
2021    \ matchgroup=p6PodFormatCode
2022    \ start="D«"
2023    \ skip="«[^»]*»"
2024    \ end="»"
2025    \ contained
2026    \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon
2027
2028" X<> can have "|", "," and ";" separators
2029
2030syn region p6PodFormatOne
2031    \ matchgroup=p6PodFormatCode
2032    \ start="X<"
2033    \ skip="<[^>]*>"
2034    \ end=">"
2035    \ contained
2036    \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar,p6PodSemiColon,p6PodComma
2037
2038syn region p6PodFormatTwo
2039    \ matchgroup=p6PodFormatCode
2040    \ start="X<<"
2041    \ skip="<<[^>]*>>"
2042    \ end=">>"
2043    \ contained
2044    \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar,p6PodSemiColon,p6PodComma
2045
2046syn region p6PodFormatThree
2047    \ matchgroup=p6PodFormatCode
2048    \ start="X<<<"
2049    \ skip="<<<[^>]*>>>"
2050    \ end=">>>"
2051    \ contained
2052    \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon,p6PodComma
2053
2054syn region p6PodFormatFrench
2055    \ matchgroup=p6PodFormatCode
2056    \ start="X«"
2057    \ skip="«[^»]*»"
2058    \ end="»"
2059    \ contained
2060    \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon,p6PodComma
2061
2062" Define the default highlighting.
2063" For version 5.7 and earlier: only when not done already
2064" For version 5.8 and later: only when an item doesn't have highlighting yet
2065if version >= 508 || !exists("did_perl6_syntax_inits")
2066    if version < 508
2067        let did_perl6_syntax_inits = 1
2068        command -nargs=+ HiLink hi link <args>
2069    else
2070        command -nargs=+ HiLink hi def link <args>
2071    endif
2072
2073    HiLink p6EscOctOld       p6Error
2074    HiLink p6PackageTwigil   p6Twigil
2075    HiLink p6StringAngle     p6String
2076    HiLink p6StringFrench    p6String
2077    HiLink p6StringAngles    p6String
2078    HiLink p6StringSQ        p6String
2079    HiLink p6StringDQ        p6String
2080    HiLink p6StringQ         p6String
2081    HiLink p6RxStringSQ      p6String
2082    HiLink p6RxStringDQ      p6String
2083    HiLink p6Substitution    p6String
2084    HiLink p6Transliteration p6String
2085    HiLink p6StringAuto      p6String
2086    HiLink p6StringP5Auto    p6String
2087    HiLink p6Key             p6String
2088    HiLink p6Match           p6String
2089    HiLink p6RegexBlock      p6String
2090    HiLink p6RxP5CharClass   p6String
2091    HiLink p6RxP5QuoteMeta   p6String
2092    HiLink p6RxCharClass     p6String
2093    HiLink p6RxQuoteWords    p6String
2094    HiLink p6ReduceOp        p6Operator
2095    HiLink p6ReverseCrossOp  p6Operator
2096    HiLink p6HyperOp         p6Operator
2097    HiLink p6QuoteQ          p6Operator
2098    HiLink p6RxRange         p6StringSpecial
2099    HiLink p6RxAnchor        p6StringSpecial
2100    HiLink p6RxP5Anchor      p6StringSpecial
2101    HiLink p6CodePoint       p6StringSpecial
2102    HiLink p6RxMeta          p6StringSpecial
2103    HiLink p6RxP5Range       p6StringSpecial
2104    HiLink p6RxP5CPId        p6StringSpecial
2105    HiLink p6RxP5Posix       p6StringSpecial
2106    HiLink p6RxP5Mod         p6StringSpecial
2107    HiLink p6RxP5HexSeq      p6StringSpecial
2108    HiLink p6RxP5OctSeq      p6StringSpecial
2109    HiLink p6RxP5WriteRefId  p6StringSpecial
2110    HiLink p6HexSequence     p6StringSpecial
2111    HiLink p6OctSequence     p6StringSpecial
2112    HiLink p6RxP5Named       p6StringSpecial
2113    HiLink p6RxP5PropId      p6StringSpecial
2114    HiLink p6RxP5Quantifier  p6StringSpecial
2115    HiLink p6RxP5CountId     p6StringSpecial
2116    HiLink p6RxP5Verb        p6StringSpecial
2117    HiLink p6Escape          p6StringSpecial2
2118    HiLink p6EscNull         p6StringSpecial2
2119    HiLink p6EscHash         p6StringSpecial2
2120    HiLink p6EscQQ           p6StringSpecial2
2121    HiLink p6EscQuote        p6StringSpecial2
2122    HiLink p6EscDoubleQuote  p6StringSpecial2
2123    HiLink p6EscBackTick     p6StringSpecial2
2124    HiLink p6EscForwardSlash p6StringSpecial2
2125    HiLink p6EscVerticalBar  p6StringSpecial2
2126    HiLink p6EscExclamation  p6StringSpecial2
2127    HiLink p6EscDollar       p6StringSpecial2
2128    HiLink p6EscOpenCurly    p6StringSpecial2
2129    HiLink p6EscCloseCurly   p6StringSpecial2
2130    HiLink p6EscCloseBracket p6StringSpecial2
2131    HiLink p6EscCloseAngle   p6StringSpecial2
2132    HiLink p6EscCloseFrench  p6StringSpecial2
2133    HiLink p6EscBackSlash    p6StringSpecial2
2134    HiLink p6RxEscape        p6StringSpecial2
2135    HiLink p6RxCapture       p6StringSpecial2
2136    HiLink p6RxAlternation   p6StringSpecial2
2137    HiLink p6RxP5            p6StringSpecial2
2138    HiLink p6RxP5ReadRef     p6StringSpecial2
2139    HiLink p6RxP5Oct         p6StringSpecial2
2140    HiLink p6RxP5Hex         p6StringSpecial2
2141    HiLink p6RxP5EscMeta     p6StringSpecial2
2142    HiLink p6RxP5Meta        p6StringSpecial2
2143    HiLink p6RxP5Escape      p6StringSpecial2
2144    HiLink p6RxP5CodePoint   p6StringSpecial2
2145    HiLink p6RxP5WriteRef    p6StringSpecial2
2146    HiLink p6RxP5Prop        p6StringSpecial2
2147
2148    HiLink p6Property       Tag
2149    HiLink p6Attention      Todo
2150    HiLink p6Type           Type
2151    HiLink p6Error          Error
2152    HiLink p6BlockLabel     Label
2153    HiLink p6Float          Float
2154    HiLink p6Normal         Normal
2155    HiLink p6Package        Normal
2156    HiLink p6PackageScope   Normal
2157    HiLink p6Number         Number
2158    HiLink p6VersionNum     Number
2159    HiLink p6String         String
2160    HiLink p6Repeat         Repeat
2161    HiLink p6Keyword        Keyword
2162    HiLink p6Pragma         Keyword
2163    HiLink p6Module         Keyword
2164    HiLink p6DeclareRoutine Keyword
2165    HiLink p6VarStorage     Special
2166    HiLink p6FlowControl    Special
2167    HiLink p6NumberBase     Special
2168    HiLink p6Twigil         Special
2169    HiLink p6StringSpecial2 Special
2170    HiLink p6VersionDot     Special
2171    HiLink p6Comment        Comment
2172    HiLink p6Include        Include
2173    HiLink p6Shebang        PreProc
2174    HiLink p6ClosureTrait   PreProc
2175    HiLink p6Routine        Function
2176    HiLink p6Operator       Operator
2177    HiLink p6Version        Operator
2178    HiLink p6Context        Operator
2179    HiLink p6Quote          Delimiter
2180    HiLink p6TypeConstraint PreCondit
2181    HiLink p6Exception      Exception
2182    HiLink p6Placeholder    Identifier
2183    HiLink p6Variable       Identifier
2184    HiLink p6VarSlash       Identifier
2185    HiLink p6VarNum         Identifier
2186    HiLink p6VarExclam      Identifier
2187    HiLink p6VarMatch       Identifier
2188    HiLink p6VarName        Identifier
2189    HiLink p6MatchVar       Identifier
2190    HiLink p6RxP5ReadRefId  Identifier
2191    HiLink p6RxP5ModDef     Identifier
2192    HiLink p6RxP5ModName    Identifier
2193    HiLink p6Conditional    Conditional
2194    HiLink p6StringSpecial  SpecialChar
2195
2196    HiLink p6PodAbbr         p6Pod
2197    HiLink p6PodAbbrEOF      p6Pod
2198    HiLink p6PodAbbrNoCode   p6Pod
2199    HiLink p6PodAbbrCode     p6PodCode
2200    HiLink p6PodPara         p6Pod
2201    HiLink p6PodParaEOF      p6Pod
2202    HiLink p6PodParaNoCode   p6Pod
2203    HiLink p6PodParaCode     p6PodCode
2204    HiLink p6PodDelim        p6Pod
2205    HiLink p6PodDelimEOF     p6Pod
2206    HiLink p6PodDelimNoCode  p6Pod
2207    HiLink p6PodDelimCode    p6PodCode
2208    HiLink p6PodImplicitCode p6PodCode
2209    HiLink p6PodExtraConfig  p6PodPrefix
2210    HiLink p6PodVerticalBar  p6PodFormatCode
2211    HiLink p6PodColon        p6PodFormatCode
2212    HiLink p6PodSemicolon    p6PodFormatCode
2213    HiLink p6PodComma        p6PodFormatCode
2214    HiLink p6PodFormatOne    p6PodFormat
2215    HiLink p6PodFormatTwo    p6PodFormat
2216    HiLink p6PodFormatThree  p6PodFormat
2217    HiLink p6PodFormatFrench p6PodFormat
2218
2219    HiLink p6PodType           Type
2220    HiLink p6PodConfigOption   String
2221    HiLink p6PodCode           PreProc
2222    HiLink p6Pod               Comment
2223    HiLink p6PodComment        Comment
2224    HiLink p6PodAutoQuote      Operator
2225    HiLink p6PodConfigOperator Operator
2226    HiLink p6PodPrefix         Statement
2227    HiLink p6PodName           Identifier
2228    HiLink p6PodFormatCode     SpecialChar
2229    HiLink p6PodFormat         SpecialComment
2230
2231    delcommand HiLink
2232endif
2233
2234" Syncing to speed up processing
2235"syn sync match p6SyncPod groupthere p6PodAbbrRegion     "^=\K\k*\>"
2236"syn sync match p6SyncPod groupthere p6PodDirectRegion   "^=\%(config\|use\|encoding\)\>"
2237"syn sync match p6SyncPod groupthere p6PodParaRegion     "^=for\>"
2238"syn sync match p6SyncPod groupthere p6PodDelimRegion    "^=begin\>"
2239"syn sync match p6SyncPod groupthere p6PodDelimEndRegion "^=end\>"
2240
2241" Let's just sync whole file, the other methods aren't reliable (or I don't
2242" know how to use them reliably)
2243syn sync fromstart
2244
2245setlocal foldmethod=syntax
2246
2247let b:current_syntax = "perl6"
2248
2249" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
2250