codekingpro/portable-devtools
114k
1" Vim syntax file2" Language: Raku3" Maintainer: vim-perl <vim-perl@googlegroups.com> (need to be subscribed to post)4" Homepage: https://github.com/Raku/vim-raku5" Bugs/requests: https://github.com/Raku/vim-raku/issues6" Last Change: 2021-04-167 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 the15" right filetype for Raku files. To set it explicitly you can also add this16" line near the bottom of your source file:17" # vim: filetype=raku18 19" TODO:20" * Go over the list of keywords/types to see what's deprecated/missing21" * 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=125"26" The above requires pir.vim, which you can find in Parrot's repository:27" https://github.com/parrot/parrot/tree/master/editor28"29" To highlight Perl 5 regexes (m:P5//):30" let raku_perl5_regexes=131"32" To enable folding:33" let raku_fold=134 35if 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." | endif36 37" For version 5.x: Clear all syntax items38" For version 6.x: Quit when a syntax file was already loaded39if version < 60040 syntax clear41elseif exists("b:current_syntax")42 finish43endif44let s:keepcpo= &cpo45set cpo&vim46 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 eval58" @@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)65syn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"66 67let 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 parentheses117let 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.135let 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\ ]139let s:words_space = join(s:alpha_metaops, " ")140let s:temp = split(s:words_space)141let s:alpha_metaops_or = join(s:temp, "\\|")142 143" We don't use "syn keyword" here because that always has higher priority144" than matches/regions, which would prevent these words from matching as145" autoquoted strings before "=>".146syn 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,rakuIdentifier148 149for [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"154endfor155 156let s:words_space = join(s:types, " ")157let s:temp = split(s:words_space)158let s:words = join(s:temp, "\\|")159exec "syn match rakuType display \"\\%(". s:words . "\\)\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained"160unlet s:group s:words_list s:keywords s:types s:words_space s:temp s:words161 162syn match rakuPreDeclare display "[.^]\@1<!\<\%(multi\|proto\|only\)\>" nextgroup=rakuDeclare,rakuIdentifier skipwhite skipempty163syn match rakuDeclare display "[.^]\@1<!\<\%(macro\|sub\|submethod\|method\|module\|class\|role\|package\|enum\|grammar\|slang\|subset\)\>" nextgroup=rakuIdentifier skipwhite skipempty164syn match rakuDeclareRegex display "[.^]\@1<!\<\%(regex\|rule\|token\)\>" nextgroup=rakuRegexName skipwhite skipempty165 166syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@<!\a\@=\%(does\|as\|but\|trusts\|of\|returns\|handles\|where\|augment\|supersede\)\>"167syn 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=rakuProperty168syn 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\)" contained169 170" packages, must come after all the keywords171syn match rakuIdentifier display "\%(::\)\@2<=\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)*"172syn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(::\)\@="173 174" The sigil in ::*Package175syn match rakuPackageTwigil display "\%(::\)\@2<=\*"176 177" some standard packages178syn 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 so181" greedy that the "%" " in "+%foo" won't be allowed to match as a sigil,182" among other things183syn match rakuOperator display "[-+/*~?|=^!%&,<>».;\\∈∉∋∌∩∪≼≽⊂⊃⊄⊅⊆⊇⊈⊉⊍⊎⊖∅∘]"184syn match rakuOperator display "\%(:\@1<!::\@2!\|::=\|\.::\)"185" these require whitespace on the left side186syn match rakuOperator display "\%(\s\|^\)\@1<=\%(xx=\)"187" index overloading188syn match rakuOperator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)"189 190" Reduce metaoperators like [+]191syn match rakuReduceOp display "\%(^\|\s\|(\)\@1<=!*\%([RSXZ\[]\)*[&RSXZ]\?\[\+(\?\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+)\?]\+"192syn match rakuSetOp display "R\?(\%([-^.+|&]\|[<>][=+]\?\|cont\|elem\))"193 194" Reverse, cross, and zip metaoperators195exec "syn match rakuRSXZOp display \"[RSXZ]:\\@!\\%(\\a\\@=\\%(". s:alpha_metaops_or . "\\)\\>\\|[[:alnum:]]\\@!\\%([.,]\\|[^[,.[:alnum:][:space:]]\\)\\+\\|\\s\\@=\\|$\\)\""196 197syn match rakuBlockLabel display "^\s*\zs\h\w*\s*::\@!\_s\@="198 199syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?Inf\|NaN\)"200syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?\%(\%(\d\|__\@!\)*[._]\@1<!\.\)\?_\@!\%(\d\|_\)\+_\@1<!\%([eE]-\?_\@!\%(\d\|_\)\+\)\?i\?"201syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?0[obxd]\@=" nextgroup=rakuOctBase,rakuBinBase,rakuHexBase,rakuDecBase202syn match rakuOctBase display "o" contained nextgroup=rakuOctNumber203syn match rakuBinBase display "b" contained nextgroup=rakuBinNumber204syn match rakuHexBase display "x" contained nextgroup=rakuHexNumber205syn match rakuDecBase display "d" contained nextgroup=rakuDecNumber206syn match rakuOctNumber display "[0-7][0-7_]*" contained207syn match rakuBinNumber display "[01][01_]*" contained208syn match rakuHexNumber display "\x[[:xdigit:]_]*" contained209syn match rakuDecNumber display "\d[[:digit:]_]*" contained210 211syn match rakuVersion display "\<v\d\+\%(\.\%(\*\|\d\+\)\)*+\?"212 213" Contextualizers214syn match rakuContext display "\<\%(item\|list\|slice\|hash\)\>"215syn match rakuContext display "\%(\$\|@\|%\|&\)(\@="216 217" Quoting218 219" one cluster for every quote adverb220syn cluster rakuInterp_scalar221 \ add=rakuInterpScalar222 223syn cluster rakuInterp_array224 \ add=rakuInterpArray225 226syn cluster rakuInterp_hash227 \ add=rakuInterpHash228 229syn cluster rakuInterp_function230 \ add=rakuInterpFunction231 232syn cluster rakuInterp_closure233 \ add=rakuInterpClosure234 235syn cluster rakuInterp_q236 \ add=rakuEscQQ237 \ add=rakuEscBackSlash238 239syn cluster rakuInterp_backslash240 \ add=@rakuInterp_q241 \ add=rakuEscape242 \ add=rakuEscOpenCurly243 \ add=rakuEscCodePoint244 \ add=rakuEscHex245 \ add=rakuEscOct246 \ add=rakuEscOctOld247 \ add=rakuEscNull248 249syn cluster rakuInterp_qq250 \ add=@rakuInterp_scalar251 \ add=@rakuInterp_array252 \ add=@rakuInterp_hash253 \ add=@rakuInterp_function254 \ add=@rakuInterp_closure255 \ add=@rakuInterp_backslash256 \ add=rakuMatchVarSigil257 258syn region rakuInterpScalar259 \ 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 keepend263 \ contains=TOP264 265syn region rakuInterpScalar266 \ matchgroup=rakuContext267 \ start="\$\ze()\@!"268 \ skip="([^)]*)"269 \ end=")\zs"270 \ contained271 \ contains=TOP272 273syn region rakuInterpArray274 \ 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 keepend277 \ contains=TOP278 279syn region rakuInterpArray280 \ matchgroup=rakuContext281 \ start="@\ze()\@!"282 \ skip="([^)]*)"283 \ end=")\zs"284 \ contained285 \ contains=TOP286 287syn region rakuInterpHash288 \ 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 keepend291 \ contains=TOP292 293syn region rakuInterpHash294 \ matchgroup=rakuContext295 \ start="%\ze()\@!"296 \ skip="([^)]*)"297 \ end=")\zs"298 \ contained299 \ contains=TOP300 301syn region rakuInterpFunction302 \ 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 keepend305 \ contains=TOP306 307syn region rakuInterpFunction308 \ matchgroup=rakuContext309 \ start="&\ze()\@!"310 \ skip="([^)]*)"311 \ end=")\zs"312 \ contained313 \ contains=TOP314 315syn region rakuInterpClosure316 \ start="\\\@1<!{}\@!"317 \ skip="{[^}]*}"318 \ end="}"319 \ contained keepend320 \ contains=TOP321 322" generic escape323syn match rakuEscape display "\\\S" contained324 325" escaped closing delimiters326syn match rakuEscQuote display "\\'" contained327syn match rakuEscDoubleQuote display "\\\"" contained328syn match rakuEscCloseAngle display "\\>" contained329syn match rakuEscCloseFrench display "\\»" contained330syn match rakuEscBackTick display "\\`" contained331syn match rakuEscForwardSlash display "\\/" contained332syn match rakuEscVerticalBar display "\\|" contained333syn match rakuEscExclamation display "\\!" contained334syn match rakuEscComma display "\\," contained335syn match rakuEscDollar display "\\\$" contained336syn match rakuEscCloseCurly display "\\}" contained337syn match rakuEscCloseBracket display "\\\]" contained338 339" matches :key, :!key, :$var, :key<var>, etc340" 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 before343" the match start (\zs) of the end pattern.344syn region rakuAdverb345 \ 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 keepend349 \ contains=TOP350 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 "<", since356" people tend to put spaces around "less than". We make an exception357" 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. <--, <=, <==, <->)367syn region rakuStringAngle368 \ matchgroup=rakuQuote369 \ 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,rakuEscCloseAngle379 380syn region rakuStringAngleFixed381 \ matchgroup=rakuQuote382 \ start="<"383 \ skip="\\\@1<!\\>"384 \ end=">"385 \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle386 \ contained387 388syn region rakuInnerAnglesOne389 \ matchgroup=rakuStringAngle390 \ start="\\\@1<!<"391 \ skip="\\\@1<!\\>"392 \ end=">"393 \ transparent contained394 \ contains=rakuInnerAnglesOne395 396" <<words>>397syn region rakuStringAngles398 \ matchgroup=rakuQuote399 \ start="<<=\@!"400 \ skip="\\\@1<!\\>"401 \ end=">>"402 \ contains=rakuInnerAnglesTwo,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseAngle,rakuAdverb,rakuStringSQ,rakuStringDQ403 404syn region rakuInnerAnglesTwo405 \ matchgroup=rakuStringAngles406 \ start="<<"407 \ skip="\\\@1<!\\>"408 \ end=">>"409 \ transparent contained410 \ contains=rakuInnerAnglesTwo411 412" «words»413syn region rakuStringFrench414 \ matchgroup=rakuQuote415 \ start="«"416 \ skip="\\\@1<!\\»"417 \ end="»"418 \ contains=rakuInnerFrench,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseFrench,rakuAdverb,rakuStringSQ,rakuStringDQ419 420syn region rakuInnerFrench421 \ matchgroup=rakuStringFrench422 \ start="\\\@1<!«"423 \ skip="\\\@1<!\\»"424 \ end="»"425 \ transparent contained426 \ contains=rakuInnerFrench427 428" Hyperops. They need to come after "<>" and "«»" strings in order to override429" them, but before other types of strings, to avoid matching those delimiters430" as parts of hyperops.431syn match rakuHyperOp display #[^[:digit:][{('",:[:space:]][^[{('",:[:space:]]*\%(«\|<<\)#432syn match rakuHyperOp display "«\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+[«»]"433syn match rakuHyperOp display "»\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(«\|»\?\)"434syn match rakuHyperOp display "<<\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|>>\)"435syn match rakuHyperOp display ">>\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|\%(>>\)\?\)"436 437" 'string'438syn region rakuStringSQ439 \ matchgroup=rakuQuote440 \ start="'"441 \ skip="\\\@1<!\\'"442 \ end="'"443 \ contains=@rakuInterp_q,rakuEscQuote444 \ keepend extend445 446" "string"447syn region rakuStringDQ448 \ matchgroup=rakuQuote449 \ start=+"+450 \ skip=+\\\@1<!\\"+451 \ end=+"+452 \ contains=@rakuInterp_qq,rakuEscDoubleQuote453 \ keepend extend454 455" Q// and friends456 457syn match rakuQuoteQStart display "\%(:\|\%(sub\|role\)\s\)\@5<![Qq]\@=" nextgroup=rakuQuoteQ,rakuQuoteQ_q,rakuQuoteQ_qww,rakuQuoteQ_qq,rakuQuoteQ_to,rakuQuoteQ_qto,rakuQuoteQ_qqto,rakuIdentifier458syn match rakuQuoteQ display "Q\%(qq\|ww\|[abcfhpsqvwx]\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ skipwhite skipempty contained459syn match rakuQuoteQ_q display "q[abcfhpsvwx]\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_q skipwhite skipempty contained460syn match rakuQuoteQ_qww display "qww[A-Za-z(]\@!" nextgroup=rakuPairsQ_qww skipwhite skipempty contained461syn match rakuQuoteQ_qq display "qq\%([pwx]\|ww\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_qq skipwhite skipempty contained462syn match rakuQuoteQ_to display "Qto[A-Za-z(]\@!" nextgroup=rakuStringQ_to skipwhite skipempty contained463syn match rakuQuoteQ_qto display "qto[A-Za-z(]\@!" nextgroup=rakuStringQ_qto skipwhite skipempty contained464syn match rakuQuoteQ_qqto display "qqto[A-Za-z(]\@!" nextgroup=rakuStringQ_qqto skipwhite skipempty contained465syn 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 contained466syn 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 contained467syn match rakuPairsQ "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ468syn 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_q469syn 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_qww470syn 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_qq471syn 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_qto472syn 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_qqto473 474 475if exists("raku_embedded_pir") || exists("raku_extended_all")476 syn include @rakuPIR syntax/pir.vim477 syn match rakuQuote_QPIR display "Q[A-Za-z(]\@!\%(\_s*:PIR\)\@=" nextgroup=rakuPairsQ_PIR skipwhite skipempty478 syn match rakuPairs_QPIR contained "\_s*:PIR" transparent skipwhite skipempty nextgroup=rakuStringQ_PIR479endif480 481" hardcoded set of delimiters482let 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\ ]492let 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\ ]499let s:all_delims = s:plain_delims + s:bracketing_delims500 501for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:all_delims502 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 endif513endfor514unlet s:name s:start_delim s:end_delim s:end_group s:skip s:plain_delims s:all_delims515 516" :key517syn match rakuOperator display ":\@1<!::\@!!\?" nextgroup=rakuKey,rakuStringAngleFixed,rakuStringAngles,rakuStringFrench518syn match rakuKey display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" contained nextgroup=rakuStringAngleFixed,rakuStringAngles,rakuStringFrench519 520" Regexes and grammars521 522syn match rakuRegexName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?" nextgroup=rakuRegexBlockCrap skipwhite skipempty contained523syn match rakuRegexBlockCrap "[^{]*" nextgroup=rakuRegexBlock skipwhite skipempty transparent contained524 525syn region rakuRegexBlock526 \ matchgroup=rakuNormal527 \ start="{"528 \ end="}"529 \ contained530 \ contains=@rakuRegexen,@rakuVariables531 532" Perl 6 regex bits533 534syn cluster rakuRegexen535 \ add=rakuRxMeta536 \ add=rakuRxEscape537 \ add=rakuEscCodePoint538 \ add=rakuEscHex539 \ add=rakuEscOct540 \ add=rakuEscNull541 \ add=rakuRxAnchor542 \ add=rakuRxCapture543 \ add=rakuRxGroup544 \ add=rakuRxAlternation545 \ add=rakuRxBoundary546 \ add=rakuRxAdverb547 \ add=rakuRxAdverbArg548 \ add=rakuRxStorage549 \ add=rakuRxAssertion550 \ add=rakuRxAssertGroup551 \ add=rakuRxQuoteWords552 \ add=rakuRxClosure553 \ add=rakuRxStringSQ554 \ add=rakuRxStringDQ555 \ add=rakuComment556 \ add=rakuBracketComment557 \ add=rakuMatchVarSigil558 559syn match rakuRxMeta display contained ".\%([A-Za-z_\xC0-\xFF0-9]\|\s\)\@1<!"560syn match rakuRxAnchor display contained "[$^]"561syn match rakuRxEscape display contained "\\\S"562syn match rakuRxCapture display contained "[()]"563syn match rakuRxAlternation display contained "|"564syn match rakuRxRange display contained "\.\."565 566" misc escapes567syn match rakuEscOctOld display "\\[1-9]\d\{1,2}" contained568syn match rakuEscNull display "\\0\d\@!" contained569syn match rakuEscCodePoint display "\\[cC]" contained nextgroup=rakuCodePoint570syn match rakuEscHex display "\\[xX]" contained nextgroup=rakuHexSequence571syn match rakuEscOct display "\\o" contained nextgroup=rakuOctSequence572syn match rakuEscQQ display "\\qq" contained nextgroup=rakuQQSequence573syn match rakuEscOpenCurly display "\\{" contained574syn match rakuEscHash display "\\#" contained575syn match rakuEscBackSlash display "\\\\" contained576 577syn region rakuQQSequence578 \ matchgroup=rakuEscape579 \ start="\["580 \ skip="\[[^\]]*]"581 \ end="]"582 \ contained transparent583 \ contains=@rakuInterp_qq584 585syn match rakuCodePoint display "\%(\d\+\|\S\)" contained586syn region rakuCodePoint587 \ matchgroup=rakuEscape588 \ start="\["589 \ end="]"590 \ contained591 592syn match rakuHexSequence display "\x\+" contained593syn region rakuHexSequence594 \ matchgroup=rakuEscape595 \ start="\["596 \ end="]"597 \ contained598 599syn match rakuOctSequence display "\o\+" contained600syn region rakuOctSequence601 \ matchgroup=rakuEscape602 \ start="\["603 \ end="]"604 \ contained605 606" $<match>, @<match>607syn region rakuMatchVarSigil608 \ matchgroup=rakuVariable609 \ start="[$@]\%(<<\@!\)\@="610 \ end=">\@1<="611 \ contains=rakuMatchVar612 613syn region rakuMatchVar614 \ matchgroup=rakuTwigil615 \ start="<"616 \ end=">"617 \ contained618 619syn region rakuRxClosure620 \ matchgroup=rakuNormal621 \ start="{"622 \ end="}"623 \ contained624 \ containedin=rakuRxClosure625 \ contains=TOP626syn region rakuRxGroup627 \ matchgroup=rakuStringSpecial2628 \ start="\["629 \ end="]"630 \ contained631 \ contains=@rakuRegexen,@rakuVariables,rakuMatchVarSigil632syn region rakuRxAssertion633 \ matchgroup=rakuStringSpecial2634 \ start="<\%(?\?\%(before\|after\)\|\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\)\|[+?*]\)\?"635 \ end=">"636 \ contained637 \ contains=@rakuRegexen,rakuIdentifier,@rakuVariables,rakuRxCharClass,rakuRxAssertCall638syn region rakuRxAssertGroup639 \ matchgroup=rakuStringSpecial2640 \ start="<\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\["641 \ skip="\\\@1<!\\]"642 \ end="]"643 \ contained644syn match rakuRxAssertCall display "\%(::\|\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)" contained nextgroup=rakuRxAssertArgs645syn region rakuRxAssertArgs646 \ start="("647 \ end=")"648 \ contained keepend649 \ contains=TOP650syn region rakuRxAssertArgs651 \ start=":"652 \ end="\ze>"653 \ contained keepend654 \ contains=TOP655syn match rakuRxBoundary display contained "\%([«»]\|<<\|>>\)"656syn region rakuRxCharClass657 \ matchgroup=rakuStringSpecial2658 \ start="\%(<[-!+?]\?\)\@2<=\["659 \ skip="\\]"660 \ end="]"661 \ contained662 \ contains=rakuRxRange,rakuRxEscape,rakuEscHex,rakuEscOct,rakuEscCodePoint,rakuEscNull663syn region rakuRxQuoteWords664 \ matchgroup=rakuStringSpecial2665 \ start="<\s"666 \ end="\s\?>"667 \ contained668syn region rakuRxAdverb669 \ 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 keepend672 \ contains=TOP673syn region rakuRxAdverbArg674 \ start="\%(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\@<=("675 \ skip="([^)]\{-})"676 \ end=")"677 \ contained678 \ keepend679 \ contains=TOP680syn region rakuRxStorage681 \ matchgroup=rakuOperator682 \ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@="683 \ end="$"684 \ contains=TOP685 \ contained686 \ keepend687 688" 'string' inside a regex689syn region rakuRxStringSQ690 \ matchgroup=rakuQuote691 \ start="'"692 \ skip="\\\@1<!\\'"693 \ end="'"694 \ contained695 \ contains=rakuEscQuote,rakuEscBackSlash696 697" "string" inside a regex698syn region rakuRxStringDQ699 \ matchgroup=rakuQuote700 \ start=+"+701 \ skip=+\\\@1<!\\"+702 \ end=+"+703 \ contained704 \ contains=rakuEscDoubleQuote,rakuEscBackSlash,@rakuInterp_qq705 706" $!, $var, $!var, $::var, $package::var $*::package::var, etc707" Thus must come after the matches for the "$" regex anchor, but before708" the match for the $ regex delimiter709syn cluster rakuVariables710 \ add=rakuVarSlash711 \ add=rakuVarExclam712 \ add=rakuVarMatch713 \ add=rakuVarNum714 \ add=rakuVariable715 716syn match rakuBareSigil display "[@$%&]\%(\s*\%([,)}=]\|where\>\)\)\@="717syn match rakuVarSlash display "\$/"718syn match rakuVarExclam display "\$!"719syn match rakuVarMatch display "\$¢"720syn match rakuVarNum display "\$\d\+"721syn match rakuVariable display "self"722syn match rakuVariable display "[@$%&]\?[@&$%]\$*\%(::\|\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\)\|[A-Za-z_\xC0-\xFF]\)\@=" nextgroup=rakuTwigil,rakuVarName,rakuPackageScope723syn match rakuVarName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" nextgroup=rakuPostHyperOp contained724syn match rakuClose display "[\])]" transparent nextgroup=rakuPostHyperOp725syn match rakuPostHyperOp display "\%(»\|>>\)" contained726syn match rakuTwigil display "\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=" nextgroup=rakuPackageScope,rakuVarName contained727syn match rakuPackageScope display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?::" nextgroup=rakuPackageScope,rakuVarName contained728 729" Perl 6 regex regions730 731syn match rakuMatchStart_m display "\.\@1<!\<\%(mm\?\|rx\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_m732syn match rakuMatchStart_s display "\.\@1<!\<[sS]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_s733syn match rakuMatchStart_tr display "\.\@1<!\<tr\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_tr734syn 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=rakuMatch735syn 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=rakuSubstitution736syn 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=rakuTransliteration737 738" /foo/739syn region rakuMatchBare740 \ matchgroup=rakuQuote741 \ start="/\@1<!\%(\%(\_^\|[!\[,=~|&/:({]\|\^\?fff\?\^\?\|=>\|\<\%(if\|unless\|while\|when\|where\|so\)\)\s*\)\@<=/[/=]\@!"742 \ skip="\\/"743 \ end="/"744 \ contains=@rakuRegexen,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum745 746" m/foo/, m$foo$, m!foo!, etc747syn region rakuMatch748 \ matchgroup=rakuQuote749 \ start=+\z([/!$,|`"]\)+750 \ skip="\\\z1"751 \ end="\z1"752 \ contained753 \ contains=@rakuRegexen,rakuVariable,rakuVarNum754 755" m<foo>, m«foo», m{foo}, etc756for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims757 exec "syn region rakuMatch matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables"758endfor759unlet s:name s:start_delim s:end_delim s:end_group s:skip760 761" Substitutions762 763" s/foo//, s$foo$$, s!foo!!, etc764syn region rakuSubstitution765 \ matchgroup=rakuQuote766 \ start=+\z([/!$,|`"]\)+767 \ skip="\\\z1"768 \ end="\z1"me=e-1769 \ contained770 \ contains=@rakuRegexen,rakuVariable,rakuVarNum771 \ nextgroup=rakuReplacement772 773syn region rakuReplacement774 \ matchgroup=rakuQuote775 \ start="\z(.\)"776 \ skip="\\\z1"777 \ end="\z1"778 \ contained779 \ contains=@rakuInterp_qq780 781" s<foo><bar>, s«foo»«bar», s{foo}{bar}, etc782for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims783 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:name784 exec "syn region rakuRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq"785endfor786unlet s:name s:start_delim s:end_delim s:end_group s:skip787 788" Transliteration789 790" tr/foo/bar/, tr|foo|bar, etc791syn region rakuTransliteration792 \ matchgroup=rakuQuote793 \ start=+\z([/!$,|`"]\)+794 \ skip="\\\z1"795 \ end="\z1"me=e-1796 \ contained797 \ contains=rakuRxRange798 \ nextgroup=rakuTransRepl799 800syn region rakuTransRepl801 \ matchgroup=rakuQuote802 \ start="\z(.\)"803 \ skip="\\\z1"804 \ end="\z1"805 \ contained806 \ contains=@rakuInterp_qq,rakuRxRange807 808" tr<foo><bar>, tr«foo»«bar», tr{foo}{bar}, etc809for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims810 exec "syn region rakuTransliteration matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=rakuRxRange nextgroup=rakuTransRepl".s:name811 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"812endfor813unlet s:name s:start_delim s:end_delim s:end_group s:skip s:bracketing_delims814 815if exists("raku_perl5_regexes") || exists("raku_extended_all")816 817" Perl 5 regex regions818 819syn cluster rakuRegexP5Base820 \ add=rakuRxP5Escape821 \ add=rakuRxP5Oct822 \ add=rakuRxP5Hex823 \ add=rakuRxP5EscMeta824 \ add=rakuRxP5CodePoint825 \ add=rakuRxP5Prop826 827" normal regex stuff828syn cluster rakuRegexP5829 \ add=@rakuRegexP5Base830 \ add=rakuRxP5Quantifier831 \ add=rakuRxP5Meta832 \ add=rakuRxP5QuoteMeta833 \ add=rakuRxP5ParenMod834 \ add=rakuRxP5Verb835 \ add=rakuRxP5Count836 \ add=rakuRxP5Named837 \ add=rakuRxP5ReadRef838 \ add=rakuRxP5WriteRef839 \ add=rakuRxP5CharClass840 \ add=rakuRxP5Anchor841 842" inside character classes843syn cluster rakuRegexP5Class844 \ add=@rakuRegexP5Base845 \ add=rakuRxP5Posix846 \ add=rakuRxP5Range847 848syn match rakuRxP5Escape display contained "\\\S"849syn match rakuRxP5CodePoint display contained "\\c\S\@=" nextgroup=rakuRxP5CPId850syn match rakuRxP5CPId display contained "\S"851syn match rakuRxP5Oct display contained "\\\%(\o\{1,3}\)\@=" nextgroup=rakuRxP5OctSeq852syn match rakuRxP5OctSeq display contained "\o\{1,3}"853syn match rakuRxP5Anchor display contained "[\^$]"854syn match rakuRxP5Hex display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=rakuRxP5HexSeq855syn match rakuRxP5HexSeq display contained "\x\{1,2}"856syn region rakuRxP5HexSeq857 \ matchgroup=rakuRxP5Escape858 \ start="{"859 \ end="}"860 \ contained861syn region rakuRxP5Named862 \ matchgroup=rakuRxP5Escape863 \ start="\%(\\N\)\@2<={"864 \ end="}"865 \ contained866syn match rakuRxP5Quantifier display contained "\%([+*]\|(\@1<!?\)"867syn match rakuRxP5ReadRef display contained "\\[1-9]\d\@!"868syn match rakuRxP5ReadRef display contained "\[A-Za-z_\xC0-\xFF0-9]<\@=" nextgroup=rakuRxP5ReadRefId869syn region rakuRxP5ReadRefId870 \ matchgroup=rakuRxP5Escape871 \ start="<"872 \ end=">"873 \ contained874syn match rakuRxP5WriteRef display contained "\\g\%(\d\|{\)\@=" nextgroup=rakuRxP5WriteRefId875syn match rakuRxP5WriteRefId display contained "\d\+"876syn region rakuRxP5WriteRefId877 \ matchgroup=rakuRxP5Escape878 \ start="{"879 \ end="}"880 \ contained881syn match rakuRxP5Prop display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=rakuRxP5PropId882syn match rakuRxP5PropId display contained "\a"883syn region rakuRxP5PropId884 \ matchgroup=rakuRxP5Escape885 \ start="{"886 \ end="}"887 \ contained888syn match rakuRxP5Meta display contained "[(|).]"889syn match rakuRxP5ParenMod display contained "(\@1<=?\@=" nextgroup=rakuRxP5Mod,rakuRxP5ModName,rakuRxP5Code890syn match rakuRxP5Mod display contained "?\%(<\?=\|<\?!\|[#:|]\)"891syn match rakuRxP5Mod display contained "?-\?[impsx]\+"892syn match rakuRxP5Mod display contained "?\%([-+]\?\d\+\|R\)"893syn match rakuRxP5Mod display contained "?(DEFINE)"894syn match rakuRxP5Mod display contained "?\%(&\|P[>=]\)" nextgroup=rakuRxP5ModDef895syn match rakuRxP5ModDef display contained "\h\w*"896syn region rakuRxP5ModName897 \ matchgroup=rakuStringSpecial898 \ start="?'"899 \ end="'"900 \ contained901syn region rakuRxP5ModName902 \ matchgroup=rakuStringSpecial903 \ start="?P\?<"904 \ end=">"905 \ contained906syn region rakuRxP5Code907 \ matchgroup=rakuStringSpecial908 \ start="??\?{"909 \ end="})\@="910 \ contained911 \ contains=TOP912syn match rakuRxP5EscMeta display contained "\\[?*.{}()[\]|\^$]"913syn match rakuRxP5Count display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=rakuRxP5CountId914syn region rakuRxP5CountId915 \ matchgroup=rakuRxP5Escape916 \ start="{"917 \ end="}"918 \ contained919syn match rakuRxP5Verb display contained "(\@1<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)"920syn region rakuRxP5QuoteMeta921 \ matchgroup=rakuRxP5Escape922 \ start="\\Q"923 \ end="\\E"924 \ contained925 \ contains=@rakuVariables,rakuEscBackSlash926syn region rakuRxP5CharClass927 \ matchgroup=rakuStringSpecial928 \ start="\[\^\?"929 \ skip="\\]"930 \ end="]"931 \ contained932 \ contains=@rakuRegexP5Class933syn region rakuRxP5Posix934 \ matchgroup=rakuRxP5Escape935 \ start="\[:"936 \ end=":]"937 \ contained938syn match rakuRxP5Range display contained "-"939 940" m:P5//941syn region rakuMatch942 \ matchgroup=rakuQuote943 \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=/"944 \ skip="\\/"945 \ end="/"946 \ contains=@rakuRegexP5,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum947 948" m:P5!!949syn region rakuMatch950 \ matchgroup=rakuQuote951 \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=!"952 \ skip="\\!"953 \ end="!"954 \ contains=@rakuRegexP5,rakuVariable,rakuVarSlash,rakuVarMatch,rakuVarNum955 956" m:P5$$, m:P5||, etc957syn region rakuMatch958 \ matchgroup=rakuQuote959 \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=\z([\"'`|,$]\)"960 \ skip="\\\z1"961 \ end="\z1"962 \ contains=@rakuRegexP5,@rakuVariables963 964" m:P5 ()965syn region rakuMatch966 \ matchgroup=rakuQuote967 \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s\+\)\@<=()\@!"968 \ skip="\\)"969 \ end=")"970 \ contains=@rakuRegexP5,@rakuVariables971 972" m:P5[]973syn region rakuMatch974 \ matchgroup=rakuQuote975 \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=[]\@!"976 \ skip="\\]"977 \ end="]"978 \ contains=@rakuRegexP5,@rakuVariables979 980" m:P5{}981syn region rakuMatch982 \ matchgroup=rakuQuote983 \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<={}\@!"984 \ skip="\\}"985 \ end="}"986 \ contains=@rakuRegexP5,rakuVariables987 988" m:P5<>989syn region rakuMatch990 \ matchgroup=rakuQuote991 \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=<>\@!"992 \ skip="\\>"993 \ end=">"994 \ contains=@rakuRegexP5,rakuVariables995 996" m:P5«»997syn region rakuMatch998 \ matchgroup=rakuQuote999 \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=«»\@!"1000 \ skip="\\»"1001 \ end="»"1002 \ contains=@rakuRegexP5,rakuVariables1003 1004endif1005 1006" Comments1007 1008syn match rakuAttention display "\<\%(ACHTUNG\|ATTN\|ATTENTION\|FIXME\|NB\|TODO\|TBD\|WTF\|XXX\|NOTE\)" contained1009 1010" normal end-of-line comment1011syn match rakuComment display "#.*" contains=rakuAttention1012 1013" Multiline comments. Arbitrary numbers of opening brackets are allowed,1014" but we only define regions for 1 to 31015syn region rakuBracketComment1016 \ start="#[`|=]("1017 \ skip="([^)]*)"1018 \ end=")"1019 \ contains=rakuAttention,rakuBracketComment1020syn region rakuBracketComment1021 \ start="#[`|=]\["1022 \ skip="\[[^\]]*]"1023 \ end="]"1024 \ contains=rakuAttention,rakuBracketComment1025syn region rakuBracketComment1026 \ start="#[`|=]{"1027 \ skip="{[^}]*}"1028 \ end="}"1029 \ contains=rakuAttention,rakuBracketComment1030syn region rakuBracketComment1031 \ start="#[`|=]<"1032 \ skip="<[^>]*>"1033 \ end=">"1034 \ contains=rakuAttention,rakuBracketComment1035syn region rakuBracketComment1036 \ start="#[`|=]«"1037 \ skip="«[^»]*»"1038 \ end="»"1039 \ contains=rakuAttention,rakuBracketComment1040 1041" Comments with double and triple delimiters1042syn region rakuBracketComment1043 \ matchgroup=rakuBracketComment1044 \ start="#[`|=](("1045 \ skip="((\%([^)\|))\@!]\)*))"1046 \ end="))"1047 \ contains=rakuAttention,rakuBracketComment1048syn region rakuBracketComment1049 \ matchgroup=rakuBracketComment1050 \ start="#[`|=]((("1051 \ skip="(((\%([^)]\|)\%())\)\@!\)*)))"1052 \ end=")))"1053 \ contains=rakuAttention,rakuBracketComment1054 1055syn region rakuBracketComment1056 \ matchgroup=rakuBracketComment1057 \ start="#[`|=]\[\["1058 \ skip="\[\[\%([^\]]\|]]\@!\)*]]"1059 \ end="]]"1060 \ contains=rakuAttention,rakuBracketComment1061syn region rakuBracketComment1062 \ matchgroup=rakuBracketComment1063 \ start="#[`|=]\[\[\["1064 \ skip="\[\[\[\%([^\]]\|]\%(]]\)\@!\)*]]]"1065 \ end="]]]"1066 \ contains=rakuAttention,rakuBracketComment1067 1068syn region rakuBracketComment1069 \ matchgroup=rakuBracketComment1070 \ start="#[`|=]{{"1071 \ skip="{{\%([^}]\|}}\@!\)*}}"1072 \ end="}}"1073 \ contains=rakuAttention,rakuBracketComment1074syn region rakuBracketComment1075 \ matchgroup=rakuBracketComment1076 \ start="#[`|=]{{{"1077 \ skip="{{{\%([^}]\|}\%(}}\)\@!\)*}}}"1078 \ end="}}}"1079 \ contains=rakuAttention,rakuBracketComment1080 1081syn region rakuBracketComment1082 \ matchgroup=rakuBracketComment1083 \ start="#[`|=]<<"1084 \ skip="<<\%([^>]\|>>\@!\)*>>"1085 \ end=">>"1086 \ contains=rakuAttention,rakuBracketComment1087syn region rakuBracketComment1088 \ matchgroup=rakuBracketComment1089 \ start="#[`|=]<<<"1090 \ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>"1091 \ end=">>>"1092 \ contains=rakuAttention,rakuBracketComment1093 1094syn region rakuBracketComment1095 \ matchgroup=rakuBracketComment1096 \ start="#[`|=]««"1097 \ skip="««\%([^»]\|»»\@!\)*»»"1098 \ end="»»"1099 \ contains=rakuAttention,rakuBracketComment1100syn region rakuBracketComment1101 \ matchgroup=rakuBracketComment1102 \ start="#[`|=]«««"1103 \ skip="«««\%([^»]\|»\%(»»\)\@!\)*»»»"1104 \ end="»»»"1105 \ contains=rakuAttention,rakuBracketComment1106 1107syn match rakuShebang display "\%^#!.*"1108 1109" => autoquoting1110syn 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<!=>"1111syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\s\+=>"1112syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)p5\ze=>"1113 1114" Pod1115 1116" Abbreviated blocks (implicit code forbidden)1117syn region rakuPodAbbrRegion1118 \ matchgroup=rakuPodPrefix1119 \ 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=rakuPodAbbrNoCodeType1122 \ keepend1123 1124syn region rakuPodAbbrNoCodeType1125 \ matchgroup=rakuPodType1126 \ 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 \ contained1129 \ contains=rakuPodName,rakuPodAbbrNoCode1130 1131syn match rakuPodName contained ".\+" contains=@rakuPodFormat1132syn match rakuPodComment contained ".\+"1133 1134syn region rakuPodAbbrNoCode1135 \ start="^"1136 \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"1137 \ contained1138 \ contains=@rakuPodFormat1139 1140" Abbreviated blocks (everything is code)1141syn region rakuPodAbbrRegion1142 \ matchgroup=rakuPodPrefix1143 \ start="^\s*\zs=\zecode\>"1144 \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"1145 \ contains=rakuPodAbbrCodeType1146 \ keepend1147 1148syn region rakuPodAbbrCodeType1149 \ matchgroup=rakuPodType1150 \ 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 \ contained1153 \ contains=rakuPodName,rakuPodAbbrCode1154 1155syn region rakuPodAbbrCode1156 \ start="^"1157 \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"1158 \ contained1159 1160" Abbreviated blocks (everything is a comment)1161syn region rakuPodAbbrRegion1162 \ matchgroup=rakuPodPrefix1163 \ start="^=\zecomment\>"1164 \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"1165 \ contains=rakuPodAbbrCommentType1166 \ keepend1167 1168syn region rakuPodAbbrCommentType1169 \ matchgroup=rakuPodType1170 \ 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 \ contained1173 \ contains=rakuPodComment,rakuPodAbbrNoCode1174 1175" Abbreviated blocks (implicit code allowed)1176syn region rakuPodAbbrRegion1177 \ matchgroup=rakuPodPrefix1178 \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>"1179 \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"1180 \ contains=rakuPodAbbrType1181 \ keepend1182 1183syn region rakuPodAbbrType1184 \ matchgroup=rakuPodType1185 \ 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 \ contained1188 \ contains=rakuPodName,rakuPodAbbr1189 1190syn region rakuPodAbbr1191 \ start="^"1192 \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"1193 \ contained1194 \ contains=@rakuPodFormat,rakuPodImplicitCode1195 1196" Abbreviated block to end-of-file1197syn region rakuPodAbbrRegion1198 \ matchgroup=rakuPodPrefix1199 \ start="^=\zeEND\>"1200 \ end="\%$"