%PDF- %PDF-
Direktori : /usr/share/vim/vim82/syntax/ |
Current File : //usr/share/vim/vim82/syntax/raku.vim |
" Vim syntax file " Language: Raku " Maintainer: vim-perl <vim-perl@googlegroups.com> " Homepage: https://github.com/Raku/vim-raku " Bugs/requests: https://github.com/Raku/vim-raku/issues " Last Change: 2021-04-16 " Contributors: Luke Palmer <fibonaci@babylonia.flatirons.org> " Moritz Lenz <moritz@faui2k3.org> " Hinrik Örn Sigurðsson <hinrik.sig@gmail.com> " " This is a big undertaking. " " The ftdetect/raku.vim file in this repository takes care of setting the " right filetype for Raku files. To set it explicitly you can also add this " line near the bottom of your source file: " # vim: filetype=raku " TODO: " * Go over the list of keywords/types to see what's deprecated/missing " * Add more support for folding (:help syn-fold) " " If you want to have Pir code inside Q:PIR// strings highlighted, do: " let raku_embedded_pir=1 " " The above requires pir.vim, which you can find in Parrot's repository: " https://github.com/parrot/parrot/tree/master/editor " " To highlight Perl 5 regexes (m:P5//): " let raku_perl5_regexes=1 " " To enable folding: " let raku_fold=1 if version < 704 | throw "raku.vim uses regex syntax which Vim <7.4 doesn't support. Try 'make fix_old_vim' in the vim-perl repository." | endif " For version 5.x: Clear all syntax items " For version 6.x: Quit when a syntax file was already loaded if version < 600 syntax clear elseif exists("b:current_syntax") finish endif let s:keepcpo= &cpo set cpo&vim " Patterns which will be interpolated by the preprocessor (tools/preproc.pl): " " @@IDENT_NONDIGIT@@ "[A-Za-z_\xC0-\xFF]" " @@IDENT_CHAR@@ "[A-Za-z_\xC0-\xFF0-9]" " @@IDENTIFIER@@ "\%(@@IDENT_NONDIGIT@@\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\@=\)*\)" " @@IDENTIFIER_START@@ "@@IDENT_CHAR@@\@1<!\%(@@IDENT_NONDIGIT@@[-']\)\@2<!" " @@IDENTIFIER_END@@ "\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\)\@!" " @@METAOP@@ #\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+# " @@ADVERBS@@ "\%(\_s*:!\?@@IDENTIFIER@@\%(([^)]*)\)\?\)*" " " Same but escaped, for use in string eval " @@IDENT_NONDIGIT_Q@@ "[A-Za-z_\\xC0-\\xFF]" " @@IDENT_CHAR_Q@@ "[A-Za-z_\\xC0-\\xFF0-9]" " @@IDENTIFIER_Q@@ "\\%(@@IDENT_NONDIGIT_Q@@\\%(@@IDENT_CHAR_Q@@\\|[-']@@IDENT_NONDIGIT_Q@@\\@=\\)*\\)" " @@IDENTIFIER_START_Q@@ "@@IDENT_CHAR_Q@@\\@1<!\\%(@@IDENT_NONDIGIT_Q@@[-']\\)\\@2<!" " @@IDENTIFIER_END_Q@@ "\\%(@@IDENT_CHAR_Q@@\\|[-']@@IDENT_NONDIGIT_Q@@\\)\\@!" " Identifiers (subroutines, methods, constants, classes, roles, etc) syn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" let s:keywords = { \ "rakuInclude": [ \ "use require import unit", \ ], \ "rakuConditional": [ \ "if else elsif unless with orwith without once", \ ], \ "rakuVarStorage": [ \ "let my our state temp has constant", \ ], \ "rakuRepeat": [ \ "for loop repeat while until gather given", \ "supply react race hyper lazy quietly", \ ], \ "rakuFlowControl": [ \ "take take-rw do when next last redo return return-rw", \ "start default exit make continue break goto leave", \ "proceed succeed whenever emit done", \ ], \ "rakuClosureTrait": [ \ "BEGIN CHECK INIT FIRST ENTER LEAVE KEEP", \ "UNDO NEXT LAST PRE POST END CATCH CONTROL", \ "DOC QUIT CLOSE COMPOSE", \ ], \ "rakuException": [ \ "die fail try warn", \ ], \ "rakuPragma": [ \ "MONKEY-GUTS MONKEY-SEE-NO-EVAL MONKEY-TYPING MONKEY", \ "experimental fatal isms lib newline nqp precompilation", \ "soft strict trace variables worries", \ ], \ "rakuOperator": [ \ "div xx x mod also leg cmp before after eq ne le lt not", \ "gt ge eqv ff fff and andthen or xor orelse lcm gcd o", \ "unicmp notandthen minmax", \ ], \ "rakuType": [ \ "int int1 int2 int4 int8 int16 int32 int64", \ "rat rat1 rat2 rat4 rat8 rat16 rat32 rat64", \ "buf buf1 buf2 buf4 buf8 buf16 buf32 buf64", \ "blob blob1 blob2 blob4 blob8 blob16 blob32 blob64", \ "uint uint1 uint2 uint4 uint8 uint16 uint32 bit bool", \ "uint64 utf8 utf16 utf32 bag set mix complex", \ "num num32 num64 long longlong Pointer size_t str void", \ "ulong ulonglong ssize_t atomicint", \ ], \ } " These can be immediately followed by parentheses let s:types = [ \ "Object Any Cool Junction Whatever Capture Match", \ "Signature Proxy Matcher Package Module Class", \ "Grammar Scalar Array Hash KeyHash KeySet KeyBag", \ "Pair List Seq Range Set Bag Map Mapping Void Undef", \ "Failure Exception Code Block Routine Sub Macro", \ "Method Submethod Regex Str Blob Char Byte Parcel", \ "Codepoint Grapheme StrPos StrLen Version Num", \ "Complex Bit True False Order Same Less More", \ "Increasing Decreasing Ordered Callable AnyChar", \ "Positional Associative Ordering KeyExtractor", \ "Comparator OrderingPair IO KitchenSink Role", \ "Int Rat Buf UInt Abstraction Numeric Real", \ "Nil Mu SeekFromBeginning SeekFromEnd SeekFromCurrent", \ ] " We explicitly enumerate the alphanumeric infix operators allowed after [RSXZ] " to avoid matching package names that start with those letters. let s:alpha_metaops = [ \ "div mod gcd lcm xx x does but cmp leg eq ne gt ge lt le before after eqv", \ "min max not so andthen and or orelse unicmp coll minmax", \ ] let s:words_space = join(s:alpha_metaops, " ") let s:temp = split(s:words_space) let s:alpha_metaops_or = join(s:temp, "\\|") " We don't use "syn keyword" here because that always has higher priority " than matches/regions, which would prevent these words from matching as " autoquoted strings before "=>". syn match rakuKeywordStart display "\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!\)\@=[A-Za-z_\xC0-\xFF0-9]\@1<!\%([A-Za-z_\xC0-\xFF][-']\)\@2<!" \ nextgroup=rakuAttention,rakuVariable,rakuInclude,rakuConditional,rakuVarStorage,rakuRepeat,rakuFlowControl,rakuClosureTrait,rakuException,rakuNumber,rakuPragma,rakuType,rakuOperator,rakuIdentifier for [s:group, s:words_list] in items(s:keywords) let s:words_space = join(s:words_list, " ") let s:temp = split(s:words_space) let s:words = join(s:temp, "\\|") exec "syn match ". s:group ." display \"[.^]\\@1<!\\%(". s:words . "\\)(\\@!\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained" endfor let s:words_space = join(s:types, " ") let s:temp = split(s:words_space) let s:words = join(s:temp, "\\|") exec "syn match rakuType display \"\\%(". s:words . "\\)\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained" unlet s:group s:words_list s:keywords s:types s:words_space s:temp s:words syn match rakuPreDeclare display "[.^]\@1<!\<\%(multi\|proto\|only\)\>" nextgroup=rakuDeclare,rakuIdentifier skipwhite skipempty syn match rakuDeclare display "[.^]\@1<!\<\%(macro\|sub\|submethod\|method\|module\|class\|role\|package\|enum\|grammar\|slang\|subset\)\>" nextgroup=rakuIdentifier skipwhite skipempty syn match rakuDeclareRegex display "[.^]\@1<!\<\%(regex\|rule\|token\)\>" nextgroup=rakuRegexName skipwhite skipempty syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@<!\a\@=\%(does\|as\|but\|trusts\|of\|returns\|handles\|where\|augment\|supersede\)\>" syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@<![A-Za-z_\xC0-\xFF0-9]\@1<!\%([A-Za-z_\xC0-\xFF][-']\)\@2<!is\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuProperty syn match rakuProperty display "\a\@=\%(signature\|context\|also\|shape\|prec\|irs\|ofs\|ors\|export\|deep\|binary\|unary\|reparsed\|rw\|parsed\|cached\|readonly\|defequiv\|will\|ref\|copy\|inline\|tighter\|looser\|equiv\|assoc\|required\|DEPRECATED\|raw\|repr\|dynamic\|hidden-from-backtrace\|nodal\|pure\)" contained " packages, must come after all the keywords syn match rakuIdentifier display "\%(::\)\@2<=\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)*" syn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(::\)\@=" " The sigil in ::*Package syn match rakuPackageTwigil display "\%(::\)\@2<=\*" " some standard packages syn match rakuType display "\%(::\)\@2<!\%(SeekType\%(::SeekFromBeginning\|::SeekFromCurrent\|::SeekFromEnd\)\|Order\%(::Same\|::More\|::Less\)\?\|Bool\%(::True\|::False\)\?\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" " Don't put a "\+" at the end of the character class. That makes it so " greedy that the "%" " in "+%foo" won't be allowed to match as a sigil, " among other things syn match rakuOperator display "[-+/*~?|=^!%&,<>».;\\∈∉∋∌∩∪≼≽⊂⊃⊄⊅⊆⊇⊈⊉⊍⊎⊖∅∘]" syn match rakuOperator display "\%(:\@1<!::\@2!\|::=\|\.::\)" " these require whitespace on the left side syn match rakuOperator display "\%(\s\|^\)\@1<=\%(xx=\)" " index overloading syn match rakuOperator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)" " Reduce metaoperators like [+] syn match rakuReduceOp display "\%(^\|\s\|(\)\@1<=!*\%([RSXZ\[]\)*[&RSXZ]\?\[\+(\?\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+)\?]\+" syn match rakuSetOp display "R\?(\%([-^.+|&]\|[<>][=+]\?\|cont\|elem\))" " Reverse, cross, and zip metaoperators exec "syn match rakuRSXZOp display \"[RSXZ]:\\@!\\%(\\a\\@=\\%(". s:alpha_metaops_or . "\\)\\>\\|[[:alnum:]]\\@!\\%([.,]\\|[^[,.[:alnum:][:space:]]\\)\\+\\|\\s\\@=\\|$\\)\"" syn match rakuBlockLabel display "^\s*\zs\h\w*\s*::\@!\_s\@=" syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?Inf\|NaN\)" syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?\%(\%(\d\|__\@!\)*[._]\@1<!\.\)\?_\@!\%(\d\|_\)\+_\@1<!\%([eE]-\?_\@!\%(\d\|_\)\+\)\?i\?" syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?0[obxd]\@=" nextgroup=rakuOctBase,rakuBinBase,rakuHexBase,rakuDecBase syn match rakuOctBase display "o" contained nextgroup=rakuOctNumber syn match rakuBinBase display "b" contained nextgroup=rakuBinNumber syn match rakuHexBase display "x" contained nextgroup=rakuHexNumber syn match rakuDecBase display "d" contained nextgroup=rakuDecNumber syn match rakuOctNumber display "[0-7][0-7_]*" contained syn match rakuBinNumber display "[01][01_]*" contained syn match rakuHexNumber display "\x[[:xdigit:]_]*" contained syn match rakuDecNumber display "\d[[:digit:]_]*" contained syn match rakuVersion display "\<v\d\+\%(\.\%(\*\|\d\+\)\)*+\?" " Contextualizers syn match rakuContext display "\<\%(item\|list\|slice\|hash\)\>" syn match rakuContext display "\%(\$\|@\|%\|&\)(\@=" " Quoting " one cluster for every quote adverb syn cluster rakuInterp_scalar \ add=rakuInterpScalar syn cluster rakuInterp_array \ add=rakuInterpArray syn cluster rakuInterp_hash \ add=rakuInterpHash syn cluster rakuInterp_function \ add=rakuInterpFunction syn cluster rakuInterp_closure \ add=rakuInterpClosure syn cluster rakuInterp_q \ add=rakuEscQQ \ add=rakuEscBackSlash syn cluster rakuInterp_backslash \ add=@rakuInterp_q \ add=rakuEscape \ add=rakuEscOpenCurly \ add=rakuEscCodePoint \ add=rakuEscHex \ add=rakuEscOct \ add=rakuEscOctOld \ add=rakuEscNull syn cluster rakuInterp_qq \ add=@rakuInterp_scalar \ add=@rakuInterp_array \ add=@rakuInterp_hash \ add=@rakuInterp_function \ add=@rakuInterp_closure \ add=@rakuInterp_backslash \ add=rakuMatchVarSigil syn region rakuInterpScalar \ 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]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ 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\+\|!\|/\|¢\)\)\)" \ end="\z1\zs" \ contained keepend \ contains=TOP syn region rakuInterpScalar \ matchgroup=rakuContext \ start="\$\ze()\@!" \ skip="([^)]*)" \ end=")\zs" \ contained \ contains=TOP syn region rakuInterpArray \ 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]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ end="\z1\zs" \ contained keepend \ contains=TOP syn region rakuInterpArray \ matchgroup=rakuContext \ start="@\ze()\@!" \ skip="([^)]*)" \ end=")\zs" \ contained \ contains=TOP syn region rakuInterpHash \ 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]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ end="\z1\zs" \ contained keepend \ contains=TOP syn region rakuInterpHash \ matchgroup=rakuContext \ start="%\ze()\@!" \ skip="([^)]*)" \ end=")\zs" \ contained \ contains=TOP syn region rakuInterpFunction \ 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]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ end="\z1\zs" \ contained keepend \ contains=TOP syn region rakuInterpFunction \ matchgroup=rakuContext \ start="&\ze()\@!" \ skip="([^)]*)" \ end=")\zs" \ contained \ contains=TOP syn region rakuInterpClosure \ start="\\\@1<!{}\@!" \ skip="{[^}]*}" \ end="}" \ contained keepend \ contains=TOP " generic escape syn match rakuEscape display "\\\S" contained " escaped closing delimiters syn match rakuEscQuote display "\\'" contained syn match rakuEscDoubleQuote display "\\\"" contained syn match rakuEscCloseAngle display "\\>" contained syn match rakuEscCloseFrench display "\\»" contained syn match rakuEscBackTick display "\\`" contained syn match rakuEscForwardSlash display "\\/" contained syn match rakuEscVerticalBar display "\\|" contained syn match rakuEscExclamation display "\\!" contained syn match rakuEscComma display "\\," contained syn match rakuEscDollar display "\\\$" contained syn match rakuEscCloseCurly display "\\}" contained syn match rakuEscCloseBracket display "\\\]" contained " matches :key, :!key, :$var, :key<var>, etc " Since we don't know in advance how the adverb ends, we use a trick. " Consume nothing with the start pattern (\ze at the beginning), " while capturing the whole adverb into \z1 and then putting it before " the match start (\zs) of the end pattern. syn region rakuAdverb \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)" \ 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]\@=\)*\)\)\)" \ end="\z1\zs" \ contained keepend \ contains=TOP " <words> " Distinguishing this from the "less than" operator is tricky. For now, " it matches if any of the following is true: " " * There is whitespace missing on either side of the "<", since " people tend to put spaces around "less than". We make an exception " for " = < ... >" assignments though. " * It comes after "enum", "for", "any", "all", or "none" " * It's the first or last thing on a line (ignoring whitespace) " * It's preceded by "(\s*" or "=\s\+" " * It's empty and terminated on the same line (e.g. <> and < >) " " It never matches when: " " * Preceded by [<+~=!] (e.g. <<foo>>, =<$foo>, * !< 3) " * Followed by [-=] (e.g. <--, <=, <==, <->) syn region rakuStringAngle \ matchgroup=rakuQuote \ start="\%(\<\%(enum\|for\|any\|all\|none\)\>\s*(\?\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" \ start="\%(\s\|[<+~=!]\)\@<!<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" \ start="[<+~=!]\@1<!<\%(\s\|<\|=>\|\%([=-]\{1,2}>\|[=-]\{1,2}\)\)\@!" \ start="\%(^\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" \ start="[<+~=!]\@1<!<\%(\s*$\)\@=" \ start="\%((\s*\|=\s\+\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" \ start="<\%(\s*>\)\@=" \ skip="\\\@1<!\\>" \ end=">" \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle syn region rakuStringAngleFixed \ matchgroup=rakuQuote \ start="<" \ skip="\\\@1<!\\>" \ end=">" \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle \ contained syn region rakuInnerAnglesOne \ matchgroup=rakuStringAngle \ start="\\\@1<!<" \ skip="\\\@1<!\\>" \ end=">" \ transparent contained \ contains=rakuInnerAnglesOne " <<words>> syn region rakuStringAngles \ matchgroup=rakuQuote \ start="<<=\@!" \ skip="\\\@1<!\\>" \ end=">>" \ contains=rakuInnerAnglesTwo,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseAngle,rakuAdverb,rakuStringSQ,rakuStringDQ syn region rakuInnerAnglesTwo \ matchgroup=rakuStringAngles \ start="<<" \ skip="\\\@1<!\\>" \ end=">>" \ transparent contained \ contains=rakuInnerAnglesTwo " «words» syn region rakuStringFrench \ matchgroup=rakuQuote \ start="«" \ skip="\\\@1<!\\»" \ end="»" \ contains=rakuInnerFrench,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseFrench,rakuAdverb,rakuStringSQ,rakuStringDQ syn region rakuInnerFrench \ matchgroup=rakuStringFrench \ start="\\\@1<!«" \ skip="\\\@1<!\\»" \ end="»" \ transparent contained \ contains=rakuInnerFrench " Hyperops. They need to come after "<>" and "«»" strings in order to override " them, but before other types of strings, to avoid matching those delimiters " as parts of hyperops. syn match rakuHyperOp display #[^[:digit:][{('",:[:space:]][^[{('",:[:space:]]*\%(«\|<<\)# syn match rakuHyperOp display "«\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+[«»]" syn match rakuHyperOp display "»\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(«\|»\?\)" syn match rakuHyperOp display "<<\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|>>\)" syn match rakuHyperOp display ">>\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|\%(>>\)\?\)" " 'string' syn region rakuStringSQ \ matchgroup=rakuQuote \ start="'" \ skip="\\\@1<!\\'" \ end="'" \ contains=@rakuInterp_q,rakuEscQuote \ keepend extend " "string" syn region rakuStringDQ \ matchgroup=rakuQuote \ start=+"+ \ skip=+\\\@1<!\\"+ \ end=+"+ \ contains=@rakuInterp_qq,rakuEscDoubleQuote \ keepend extend " Q// and friends syn match rakuQuoteQStart display "\%(:\|\%(sub\|role\)\s\)\@5<![Qq]\@=" nextgroup=rakuQuoteQ,rakuQuoteQ_q,rakuQuoteQ_qww,rakuQuoteQ_qq,rakuQuoteQ_to,rakuQuoteQ_qto,rakuQuoteQ_qqto,rakuIdentifier syn match rakuQuoteQ display "Q\%(qq\|ww\|[abcfhpsqvwx]\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ skipwhite skipempty contained syn match rakuQuoteQ_q display "q[abcfhpsvwx]\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_q skipwhite skipempty contained syn match rakuQuoteQ_qww display "qww[A-Za-z(]\@!" nextgroup=rakuPairsQ_qww skipwhite skipempty contained syn match rakuQuoteQ_qq display "qq\%([pwx]\|ww\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_qq skipwhite skipempty contained syn match rakuQuoteQ_to display "Qto[A-Za-z(]\@!" nextgroup=rakuStringQ_to skipwhite skipempty contained syn match rakuQuoteQ_qto display "qto[A-Za-z(]\@!" nextgroup=rakuStringQ_qto skipwhite skipempty contained syn match rakuQuoteQ_qqto display "qqto[A-Za-z(]\@!" nextgroup=rakuStringQ_qqto skipwhite skipempty contained syn match rakuQuoteQ_qto display "q\_s*\%(\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*:\%(to\|heredoc\)\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*(\@!\)\@=" nextgroup=rakuPairsQ_qto skipwhite skipempty contained syn match rakuQuoteQ_qqto display "qq\_s*\%(\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*:\%(to\|heredoc\)\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*(\@!\)\@=" nextgroup=rakuPairsQ_qqto skipwhite skipempty contained syn match rakuPairsQ "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ syn match rakuPairsQ_q "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_q syn match rakuPairsQ_qww "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qww syn match rakuPairsQ_qq "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qq syn match rakuPairsQ_qto "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qto syn match rakuPairsQ_qqto "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qqto if exists("raku_embedded_pir") || exists("raku_extended_all") syn include @rakuPIR syntax/pir.vim syn match rakuQuote_QPIR display "Q[A-Za-z(]\@!\%(\_s*:PIR\)\@=" nextgroup=rakuPairsQ_PIR skipwhite skipempty syn match rakuPairs_QPIR contained "\_s*:PIR" transparent skipwhite skipempty nextgroup=rakuStringQ_PIR endif " hardcoded set of delimiters let s:plain_delims = [ \ ["DQ", "\\\"", "\\\"", "rakuEscDoubleQuote", "\\\\\\@1<!\\\\\\\""], \ ["SQ", "'", "'", "rakuEscQuote", "\\\\\\@1<!\\\\'"], \ ["Slash", "/", "/", "rakuEscForwardSlash", "\\\\\\@1<!\\\\/"], \ ["BackTick", "`", "`", "rakuEscBackTick", "\\\\\\@1<!\\\\`"], \ ["Bar", "|", "|", "rakuEscVerticalBar", "\\\\\\@1<!\\\\|"], \ ["Exclamation", "!", "!", "rakuEscExclamation", "\\\\\\@1<!\\\\!"], \ ["Comma", ",", ",", "rakuEscComma", "\\\\\\@1<!\\\\,"], \ ["Dollar", "\\$", "\\$", "rakuEscDollar", "\\\\\\@1<!\\\\\\$"], \ ] let s:bracketing_delims = [ \ ["Curly", "{", "}", "rakuEscCloseCurly", "\\%(\\\\\\@1<!\\\\}\\|{[^}]*}\\)"], \ ["Angle", "<", ">", "rakuEscCloseAngle", "\\%(\\\\\\@1<!\\\\>\\|<[^>]*>\\)"], \ ["French", "«", "»", "rakuEscCloseFrench", "\\%(\\\\\\@1<!\\\\»\\|«[^»]*»\\)"], \ ["Bracket", "\\\[", "]", "rakuEscCloseBracket", "\\%(\\\\\\@1<!\\\\]\\|\\[^\\]]*]\\)"], \ ["Paren", "\\s\\@1<=(", ")", "rakuEscCloseParen", "\\%(\\\\\\@1<!\\\\)\\|([^)]*)\\)"], \ ] let s:all_delims = s:plain_delims + s:bracketing_delims for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:all_delims exec "syn region rakuStringQ matchgroup=rakuQuote start=\"".s:start_delim."\" end=\"".s:end_delim."\" contained" 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" 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" 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" exec "syn region rakuStringQ_to matchgroup=rakuQuote start=\"".s:start_delim."\\z([^".s:end_delim."]\\+\\)".s:end_delim."\" end=\"^\\s*\\z1$\" contained" 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" 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" if exists("raku_embedded_pir") || exists("raku_extended_all") exec "syn region rakuStringQ_PIR matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuPIR,".s:end_group." contained" endif endfor unlet s:name s:start_delim s:end_delim s:end_group s:skip s:plain_delims s:all_delims " :key syn match rakuOperator display ":\@1<!::\@!!\?" nextgroup=rakuKey,rakuStringAngleFixed,rakuStringAngles,rakuStringFrench syn match rakuKey display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" contained nextgroup=rakuStringAngleFixed,rakuStringAngles,rakuStringFrench " Regexes and grammars syn match rakuRegexName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?" nextgroup=rakuRegexBlockCrap skipwhite skipempty contained syn match rakuRegexBlockCrap "[^{]*" nextgroup=rakuRegexBlock skipwhite skipempty transparent contained syn region rakuRegexBlock \ matchgroup=rakuNormal \ start="{" \ end="}" \ contained \ contains=@rakuRegexen,@rakuVariables " Perl 6 regex bits syn cluster rakuRegexen \ add=rakuRxMeta \ add=rakuRxEscape \ add=rakuEscCodePoint \ add=rakuEscHex \ add=rakuEscOct \ add=rakuEscNull \ add=rakuRxAnchor \ add=rakuRxCapture \ add=rakuRxGroup \ add=rakuRxAlternation \ add=rakuRxBoundary \ add=rakuRxAdverb \ add=rakuRxAdverbArg \ add=rakuRxStorage \ add=rakuRxAssertion \ add=rakuRxAssertGroup \ add=rakuRxQuoteWords \ add=rakuRxClosure \ add=rakuRxStringSQ \ add=rakuRxStringDQ \ add=rakuComment \ add=rakuBracketComment \ add=rakuMatchVarSigil syn match rakuRxMeta display contained ".\%([A-Za-z_\xC0-\xFF0-9]\|\s\)\@1<!" syn match rakuRxAnchor display contained "[$^]" syn match rakuRxEscape display contained "\\\S" syn match rakuRxCapture display contained "[()]" syn match rakuRxAlternation display contained "|" syn match rakuRxRange display contained "\.\." " misc escapes syn match rakuEscOctOld display "\\[1-9]\d\{1,2}" contained syn match rakuEscNull display "\\0\d\@!" contained syn match rakuEscCodePoint display "\\[cC]" contained nextgroup=rakuCodePoint syn match rakuEscHex display "\\[xX]" contained nextgroup=rakuHexSequence syn match rakuEscOct display "\\o" contained nextgroup=rakuOctSequence syn match rakuEscQQ display "\\qq" contained nextgroup=rakuQQSequence syn match rakuEscOpenCurly display "\\{" contained syn match rakuEscHash display "\\#" contained syn match rakuEscBackSlash display "\\\\" contained syn region rakuQQSequence \ matchgroup=rakuEscape \ start="\[" \ skip="\[[^\]]*]" \ end="]" \ contained transparent \ contains=@rakuInterp_qq syn match rakuCodePoint display "\%(\d\+\|\S\)" contained syn region rakuCodePoint \ matchgroup=rakuEscape \ start="\[" \ end="]" \ contained syn match rakuHexSequence display "\x\+" contained syn region rakuHexSequence \ matchgroup=rakuEscape \ start="\[" \ end="]" \ contained syn match rakuOctSequence display "\o\+" contained syn region rakuOctSequence \ matchgroup=rakuEscape \ start="\[" \ end="]" \ contained " $<match>, @<match> syn region rakuMatchVarSigil \ matchgroup=rakuVariable \ start="[$@]\%(<<\@!\)\@=" \ end=">\@1<=" \ contains=rakuMatchVar syn region rakuMatchVar \ matchgroup=rakuTwigil \ start="<" \ end=">" \ contained syn region rakuRxClosure \ matchgroup=rakuNormal \ start="{" \ end="}" \ contained \ containedin=rakuRxClosure \ contains=TOP syn region rakuRxGroup \ matchgroup=rakuStringSpecial2 \ start="\[" \ end="]" \ contained \ contains=@rakuRegexen,@rakuVariables,rakuMatchVarSigil syn region rakuRxAssertion \ matchgroup=rakuStringSpecial2 \ start="<\%(?\?\%(before\|after\)\|\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\)\|[+?*]\)\?" \ end=">" \ contained \ contains=@rakuRegexen,rakuIdentifier,@rakuVariables,rakuRxCharClass,rakuRxAssertCall syn region rakuRxAssertGroup \ matchgroup=rakuStringSpecial2 \ start="<\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\[" \ skip="\\\@1<!\\]" \ end="]" \ contained syn match rakuRxAssertCall display "\%(::\|\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)" contained nextgroup=rakuRxAssertArgs syn region rakuRxAssertArgs \ start="(" \ end=")" \ contained keepend \ contains=TOP syn region rakuRxAssertArgs \ start=":" \ end="\ze>" \ contained keepend \ contains=TOP syn match rakuRxBoundary display contained "\%([«»]\|<<\|>>\)" syn region rakuRxCharClass \ matchgroup=rakuStringSpecial2 \ start="\%(<[-!+?]\?\)\@2<=\[" \ skip="\\]" \ end="]" \ contained \ contains=rakuRxRange,rakuRxEscape,rakuEscHex,rakuEscOct,rakuEscCodePoint,rakuEscNull syn region rakuRxQuoteWords \ matchgroup=rakuStringSpecial2 \ start="<\s" \ end="\s\?>" \ contained syn region rakuRxAdverb \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)" \ end="\z1\zs" \ contained keepend \ contains=TOP syn region rakuRxAdverbArg \ start="\%(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\@<=(" \ skip="([^)]\{-})" \ end=")" \ contained \ keepend \ contains=TOP syn region rakuRxStorage \ matchgroup=rakuOperator \ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@=" \ end="$" \ contains=TOP \ contained \ keepend " 'string' inside a regex syn region rakuRxStringSQ \ matchgroup=rakuQuote \ start="'" \ skip="\\\@1<!\\'" \ end="'" \ contained \ contains=rakuEscQuote,rakuEscBackSlash " "string" inside a regex syn region rakuRxStringDQ \ matchgroup=rakuQuote \ start=+"+ \ skip=+\\\@1<!\\"+ \ end=+"+ \ contained \ contains=rakuEscDoubleQuote,rakuEscBackSlash,@rakuInterp_qq " $!, $var, $!var, $::var, $package::var $*::package::var, etc " Thus must come after the matches for the "$" regex anchor, but before " the match for the $ regex delimiter syn cluster rakuVariables \ add=rakuVarSlash \ add=rakuVarExclam \ add=rakuVarMatch \ add=rakuVarNum \ add=rakuVariable syn match rakuBareSigil display "[@$%&]\%(\s*\%([,)}=]\|where\>\)\)\@=" syn match rakuVarSlash display "\$/" syn match rakuVarExclam display "\$!" syn match rakuVarMatch display "\$¢" syn match rakuVarNum display "\$\d\+" syn match rakuVariable display "self" syn match rakuVariable display "[@$%&]\?[@&$%]\$*\%(::\|\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\)\|[A-Za-z_\xC0-\xFF]\)\@=" nextgroup=rakuTwigil,rakuVarName,rakuPackageScope syn match rakuVarName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" nextgroup=rakuPostHyperOp contained syn match rakuClose display "[\])]" transparent nextgroup=rakuPostHyperOp syn match rakuPostHyperOp display "\%(»\|>>\)" contained syn match rakuTwigil display "\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=" nextgroup=rakuPackageScope,rakuVarName contained syn match rakuPackageScope display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?::" nextgroup=rakuPackageScope,rakuVarName contained " Perl 6 regex regions syn match rakuMatchStart_m display "\.\@1<!\<\%(mm\?\|rx\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_m syn match rakuMatchStart_s display "\.\@1<!\<[sS]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_s syn match rakuMatchStart_tr display "\.\@1<!\<tr\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_tr syn match rakuMatchAdverbs_m "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuMatch syn match rakuMatchAdverbs_s "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuSubstitution syn match rakuMatchAdverbs_tr "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuTransliteration " /foo/ syn region rakuMatchBare \ matchgroup=rakuQuote \ start="/\@1<!\%(\%(\_^\|[!\[,=~|&/:({]\|\^\?fff\?\^\?\|=>\|\<\%(if\|unless\|while\|when\|where\|so\)\)\s*\)\@<=/[/=]\@!" \ skip="\\/" \ end="/" \ contains=@rakuRegexen,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum " m/foo/, m$foo$, m!foo!, etc syn region rakuMatch \ matchgroup=rakuQuote \ start=+\z([/!$,|`"]\)+ \ skip="\\\z1" \ end="\z1" \ contained \ contains=@rakuRegexen,rakuVariable,rakuVarNum " m<foo>, m«foo», m{foo}, etc for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims exec "syn region rakuMatch matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables" endfor unlet s:name s:start_delim s:end_delim s:end_group s:skip " Substitutions " s/foo//, s$foo$$, s!foo!!, etc syn region rakuSubstitution \ matchgroup=rakuQuote \ start=+\z([/!$,|`"]\)+ \ skip="\\\z1" \ end="\z1"me=e-1 \ contained \ contains=@rakuRegexen,rakuVariable,rakuVarNum \ nextgroup=rakuReplacement syn region rakuReplacement \ matchgroup=rakuQuote \ start="\z(.\)" \ skip="\\\z1" \ end="\z1" \ contained \ contains=@rakuInterp_qq " s<foo><bar>, s«foo»«bar», s{foo}{bar}, etc for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims exec "syn region rakuSubstitution matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables nextgroup=rakuRepl".s:name exec "syn region rakuRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq" endfor unlet s:name s:start_delim s:end_delim s:end_group s:skip " Transliteration " tr/foo/bar/, tr|foo|bar, etc syn region rakuTransliteration \ matchgroup=rakuQuote \ start=+\z([/!$,|`"]\)+ \ skip="\\\z1" \ end="\z1"me=e-1 \ contained \ contains=rakuRxRange \ nextgroup=rakuTransRepl syn region rakuTransRepl \ matchgroup=rakuQuote \ start="\z(.\)" \ skip="\\\z1" \ end="\z1" \ contained \ contains=@rakuInterp_qq,rakuRxRange " tr<foo><bar>, tr«foo»«bar», tr{foo}{bar}, etc for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims exec "syn region rakuTransliteration matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=rakuRxRange nextgroup=rakuTransRepl".s:name 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" endfor unlet s:name s:start_delim s:end_delim s:end_group s:skip s:bracketing_delims if exists("raku_perl5_regexes") || exists("raku_extended_all") " Perl 5 regex regions syn cluster rakuRegexP5Base \ add=rakuRxP5Escape \ add=rakuRxP5Oct \ add=rakuRxP5Hex \ add=rakuRxP5EscMeta \ add=rakuRxP5CodePoint \ add=rakuRxP5Prop " normal regex stuff syn cluster rakuRegexP5 \ add=@rakuRegexP5Base \ add=rakuRxP5Quantifier \ add=rakuRxP5Meta \ add=rakuRxP5QuoteMeta \ add=rakuRxP5ParenMod \ add=rakuRxP5Verb \ add=rakuRxP5Count \ add=rakuRxP5Named \ add=rakuRxP5ReadRef \ add=rakuRxP5WriteRef \ add=rakuRxP5CharClass \ add=rakuRxP5Anchor " inside character classes syn cluster rakuRegexP5Class \ add=@rakuRegexP5Base \ add=rakuRxP5Posix \ add=rakuRxP5Range syn match rakuRxP5Escape display contained "\\\S" syn match rakuRxP5CodePoint display contained "\\c\S\@=" nextgroup=rakuRxP5CPId syn match rakuRxP5CPId display contained "\S" syn match rakuRxP5Oct display contained "\\\%(\o\{1,3}\)\@=" nextgroup=rakuRxP5OctSeq syn match rakuRxP5OctSeq display contained "\o\{1,3}" syn match rakuRxP5Anchor display contained "[\^$]" syn match rakuRxP5Hex display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=rakuRxP5HexSeq syn match rakuRxP5HexSeq display contained "\x\{1,2}" syn region rakuRxP5HexSeq \ matchgroup=rakuRxP5Escape \ start="{" \ end="}" \ contained syn region rakuRxP5Named \ matchgroup=rakuRxP5Escape \ start="\%(\\N\)\@2<={" \ end="}" \ contained syn match rakuRxP5Quantifier display contained "\%([+*]\|(\@1<!?\)" syn match rakuRxP5ReadRef display contained "\\[1-9]\d\@!" syn match rakuRxP5ReadRef display contained "\[A-Za-z_\xC0-\xFF0-9]<\@=" nextgroup=rakuRxP5ReadRefId syn region rakuRxP5ReadRefId \ matchgroup=rakuRxP5Escape \ start="<" \ end=">" \ contained syn match rakuRxP5WriteRef display contained "\\g\%(\d\|{\)\@=" nextgroup=rakuRxP5WriteRefId syn match rakuRxP5WriteRefId display contained "\d\+" syn region rakuRxP5WriteRefId \ matchgroup=rakuRxP5Escape \ start="{" \ end="}" \ contained syn match rakuRxP5Prop display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=rakuRxP5PropId syn match rakuRxP5PropId display contained "\a" syn region rakuRxP5PropId \ matchgroup=rakuRxP5Escape \ start="{" \ end="}" \ contained syn match rakuRxP5Meta display contained "[(|).]" syn match rakuRxP5ParenMod display contained "(\@1<=?\@=" nextgroup=rakuRxP5Mod,rakuRxP5ModName,rakuRxP5Code syn match rakuRxP5Mod display contained "?\%(<\?=\|<\?!\|[#:|]\)" syn match rakuRxP5Mod display contained "?-\?[impsx]\+" syn match rakuRxP5Mod display contained "?\%([-+]\?\d\+\|R\)" syn match rakuRxP5Mod display contained "?(DEFINE)" syn match rakuRxP5Mod display contained "?\%(&\|P[>=]\)" nextgroup=rakuRxP5ModDef syn match rakuRxP5ModDef display contained "\h\w*" syn region rakuRxP5ModName \ matchgroup=rakuStringSpecial \ start="?'" \ end="'" \ contained syn region rakuRxP5ModName \ matchgroup=rakuStringSpecial \ start="?P\?<" \ end=">" \ contained syn region rakuRxP5Code \ matchgroup=rakuStringSpecial \ start="??\?{" \ end="})\@=" \ contained \ contains=TOP syn match rakuRxP5EscMeta display contained "\\[?*.{}()[\]|\^$]" syn match rakuRxP5Count display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=rakuRxP5CountId syn region rakuRxP5CountId \ matchgroup=rakuRxP5Escape \ start="{" \ end="}" \ contained syn match rakuRxP5Verb display contained "(\@1<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)" syn region rakuRxP5QuoteMeta \ matchgroup=rakuRxP5Escape \ start="\\Q" \ end="\\E" \ contained \ contains=@rakuVariables,rakuEscBackSlash syn region rakuRxP5CharClass \ matchgroup=rakuStringSpecial \ start="\[\^\?" \ skip="\\]" \ end="]" \ contained \ contains=@rakuRegexP5Class syn region rakuRxP5Posix \ matchgroup=rakuRxP5Escape \ start="\[:" \ end=":]" \ contained syn match rakuRxP5Range display contained "-" " m:P5// syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=/" \ skip="\\/" \ end="/" \ contains=@rakuRegexP5,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum " m:P5!! syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=!" \ skip="\\!" \ end="!" \ contains=@rakuRegexP5,rakuVariable,rakuVarSlash,rakuVarMatch,rakuVarNum " m:P5$$, m:P5||, etc syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=\z([\"'`|,$]\)" \ skip="\\\z1" \ end="\z1" \ contains=@rakuRegexP5,@rakuVariables " m:P5 () syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s\+\)\@<=()\@!" \ skip="\\)" \ end=")" \ contains=@rakuRegexP5,@rakuVariables " m:P5[] syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=[]\@!" \ skip="\\]" \ end="]" \ contains=@rakuRegexP5,@rakuVariables " m:P5{} syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<={}\@!" \ skip="\\}" \ end="}" \ contains=@rakuRegexP5,rakuVariables " m:P5<> syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=<>\@!" \ skip="\\>" \ end=">" \ contains=@rakuRegexP5,rakuVariables " m:P5«» syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=«»\@!" \ skip="\\»" \ end="»" \ contains=@rakuRegexP5,rakuVariables endif " Comments syn match rakuAttention display "\<\%(ACHTUNG\|ATTN\|ATTENTION\|FIXME\|NB\|TODO\|TBD\|WTF\|XXX\|NOTE\)" contained " normal end-of-line comment syn match rakuComment display "#.*" contains=rakuAttention " Multiline comments. Arbitrary numbers of opening brackets are allowed, " but we only define regions for 1 to 3 syn region rakuBracketComment \ start="#[`|=](" \ skip="([^)]*)" \ end=")" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ start="#[`|=]\[" \ skip="\[[^\]]*]" \ end="]" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ start="#[`|=]{" \ skip="{[^}]*}" \ end="}" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ start="#[`|=]<" \ skip="<[^>]*>" \ end=">" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ start="#[`|=]«" \ skip="«[^»]*»" \ end="»" \ contains=rakuAttention,rakuBracketComment " Comments with double and triple delimiters syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]((" \ skip="((\%([^)\|))\@!]\)*))" \ end="))" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=](((" \ skip="(((\%([^)]\|)\%())\)\@!\)*)))" \ end=")))" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]\[\[" \ skip="\[\[\%([^\]]\|]]\@!\)*]]" \ end="]]" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]\[\[\[" \ skip="\[\[\[\%([^\]]\|]\%(]]\)\@!\)*]]]" \ end="]]]" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]{{" \ skip="{{\%([^}]\|}}\@!\)*}}" \ end="}}" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]{{{" \ skip="{{{\%([^}]\|}\%(}}\)\@!\)*}}}" \ end="}}}" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]<<" \ skip="<<\%([^>]\|>>\@!\)*>>" \ end=">>" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]<<<" \ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>" \ end=">>>" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]««" \ skip="««\%([^»]\|»»\@!\)*»»" \ end="»»" \ contains=rakuAttention,rakuBracketComment syn region rakuBracketComment \ matchgroup=rakuBracketComment \ start="#[`|=]«««" \ skip="«««\%([^»]\|»\%(»»\)\@!\)*»»»" \ end="»»»" \ contains=rakuAttention,rakuBracketComment syn match rakuShebang display "\%^#!.*" " => autoquoting syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\%(p5\)\@2<![RSXZ]\@1<!=>" syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\s\+=>" syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)p5\ze=>" " Pod " Abbreviated blocks (implicit code forbidden) syn region rakuPodAbbrRegion \ matchgroup=rakuPodPrefix \ start="^\s*\zs=\ze\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=rakuPodAbbrNoCodeType \ keepend syn region rakuPodAbbrNoCodeType \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=rakuPodName,rakuPodAbbrNoCode syn match rakuPodName contained ".\+" contains=@rakuPodFormat syn match rakuPodComment contained ".\+" syn region rakuPodAbbrNoCode \ start="^" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=@rakuPodFormat " Abbreviated blocks (everything is code) syn region rakuPodAbbrRegion \ matchgroup=rakuPodPrefix \ start="^\s*\zs=\zecode\>" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=rakuPodAbbrCodeType \ keepend syn region rakuPodAbbrCodeType \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=rakuPodName,rakuPodAbbrCode syn region rakuPodAbbrCode \ start="^" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained " Abbreviated blocks (everything is a comment) syn region rakuPodAbbrRegion \ matchgroup=rakuPodPrefix \ start="^=\zecomment\>" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=rakuPodAbbrCommentType \ keepend syn region rakuPodAbbrCommentType \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=rakuPodComment,rakuPodAbbrNoCode " Abbreviated blocks (implicit code allowed) syn region rakuPodAbbrRegion \ matchgroup=rakuPodPrefix \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=rakuPodAbbrType \ keepend syn region rakuPodAbbrType \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=rakuPodName,rakuPodAbbr syn region rakuPodAbbr \ start="^" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=@rakuPodFormat,rakuPodImplicitCode " Abbreviated block to end-of-file syn region rakuPodAbbrRegion \ matchgroup=rakuPodPrefix \ start="^=\zeEND\>" \ end="\%$" \ contains=rakuPodAbbrEOFType \ keepend syn region rakuPodAbbrEOFType \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="\%$" \ contained \ contains=rakuPodName,rakuPodAbbrEOF syn region rakuPodAbbrEOF \ start="^" \ end="\%$" \ contained \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode " Directives syn region rakuPodDirectRegion \ matchgroup=rakuPodPrefix \ start="^=\%(config\|use\)\>" \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contains=rakuPodDirectArgRegion \ keepend syn region rakuPodDirectArgRegion \ matchgroup=rakuPodType \ start="\S\+" \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contained \ contains=rakuPodDirectConfigRegion syn region rakuPodDirectConfigRegion \ start="" \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contained \ contains=@rakuPodConfig " =encoding is a special directive syn region rakuPodDirectRegion \ matchgroup=rakuPodPrefix \ start="^=encoding\>" \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contains=rakuPodEncodingArgRegion \ keepend syn region rakuPodEncodingArgRegion \ matchgroup=rakuPodName \ start="\S\+" \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contained " Paragraph blocks (implicit code forbidden) syn region rakuPodParaRegion \ matchgroup=rakuPodPrefix \ start="^\s*\zs=for\>" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=rakuPodParaNoCodeTypeRegion \ keepend extend syn region rakuPodParaNoCodeTypeRegion \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=rakuPodParaNoCode,rakuPodParaConfigRegion syn region rakuPodParaConfigRegion \ start="" \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\@1<!\)" \ contained \ contains=@rakuPodConfig syn region rakuPodParaNoCode \ start="^[^=]" \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=@rakuPodFormat " Paragraph blocks (everything is code) syn region rakuPodParaRegion \ matchgroup=rakuPodPrefix \ start="^\s*\zs=for\>\ze\s*code\>" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=rakuPodParaCodeTypeRegion \ keepend extend syn region rakuPodParaCodeTypeRegion \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=rakuPodParaCode,rakuPodParaConfigRegion syn region rakuPodParaCode \ start="^[^=]" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained " Paragraph blocks (implicit code allowed) syn region rakuPodParaRegion \ matchgroup=rakuPodPrefix \ start="^\s*\zs=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=rakuPodParaTypeRegion \ keepend extend syn region rakuPodParaTypeRegion \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=rakuPodPara,rakuPodParaConfigRegion syn region rakuPodPara \ start="^[^=]" \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=@rakuPodFormat,rakuPodImplicitCode " Paragraph block to end-of-file syn region rakuPodParaRegion \ matchgroup=rakuPodPrefix \ start="^=for\>\ze\s\+END\>" \ end="\%$" \ contains=rakuPodParaEOFTypeRegion \ keepend extend syn region rakuPodParaEOFTypeRegion \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="\%$" \ contained \ contains=rakuPodParaEOF,rakuPodParaConfigRegion syn region rakuPodParaEOF \ start="^[^=]" \ end="\%$" \ contained \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode " Delimited blocks (implicit code forbidden) syn region rakuPodDelimRegion \ matchgroup=rakuPodPrefix \ start="^\z(\s*\)\zs=begin\>" \ end="^\z1\zs=end\>" \ contains=rakuPodDelimNoCodeTypeRegion \ keepend extend skipwhite \ nextgroup=rakuPodType syn region rakuPodDelimNoCodeTypeRegion \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\s*\zs\ze=end\>" \ contained \ contains=rakuPodDelimNoCode,rakuPodDelimConfigRegion syn region rakuPodDelimConfigRegion \ start="" \ end="^\s*\zs\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contained \ contains=@rakuPodConfig syn region rakuPodDelimNoCode \ start="^" \ end="^\s*\zs\ze=end\>" \ contained \ contains=@rakuPodNestedBlocks,@rakuPodFormat " Delimited blocks (everything is code) syn region rakuPodDelimRegion \ matchgroup=rakuPodPrefix \ start="^\z(\s*\)\zs=begin\>\ze\s*code\>" \ end="^\z1\zs=end\>" \ contains=rakuPodDelimCodeTypeRegion \ keepend extend skipwhite \ nextgroup=rakuPodType syn region rakuPodDelimCodeTypeRegion \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\s*\zs\ze=end\>" \ contained \ contains=rakuPodDelimCode,rakuPodDelimConfigRegion syn region rakuPodDelimCode \ start="^" \ end="^\s*\zs\ze=end\>" \ contained \ contains=@rakuPodNestedBlocks " Delimited blocks (implicit code allowed) syn region rakuPodDelimRegion \ matchgroup=rakuPodPrefix \ start="^\z(\s*\)\zs=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" \ end="^\z1\zs=end\>" \ contains=rakuPodDelimTypeRegion \ keepend extend skipwhite \ nextgroup=rakuPodType syn region rakuPodDelimTypeRegion \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="^\s*\zs\ze=end\>" \ contained \ contains=rakuPodDelim,rakuPodDelimConfigRegion syn region rakuPodDelim \ start="^" \ end="^\s*\zs\ze=end\>" \ contained \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode " Delimited block to end-of-file syn region rakuPodDelimRegion \ matchgroup=rakuPodPrefix \ start="^=begin\>\ze\s\+END\>" \ end="\%$" \ extend \ contains=rakuPodDelimEOFTypeRegion syn region rakuPodDelimEOFTypeRegion \ matchgroup=rakuPodType \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="\%$" \ contained \ contains=rakuPodDelimEOF,rakuPodDelimConfigRegion syn region rakuPodDelimEOF \ start="^" \ end="\%$" \ contained \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode syn cluster rakuPodConfig \ add=rakuPodConfigOperator \ add=rakuPodExtraConfig \ add=rakuStringAuto \ add=rakuPodAutoQuote \ add=rakuStringSQ syn region rakuPodParens \ start="(" \ end=")" \ contained \ contains=rakuNumber,rakuStringSQ syn match rakuPodAutoQuote display contained "=>" syn match rakuPodConfigOperator display contained ":!\?" nextgroup=rakuPodConfigOption syn match rakuPodConfigOption display contained "[^[:space:](<]\+" nextgroup=rakuPodParens,rakuStringAngle syn match rakuPodExtraConfig display contained "^=" syn match rakuPodVerticalBar display contained "|" syn match rakuPodColon display contained ":" syn match rakuPodSemicolon display contained ";" syn match rakuPodComma display contained "," syn match rakuPodImplicitCode display contained "^\s.*" syn match rakuPodType display contained "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" " These may appear inside delimited blocks syn cluster rakuPodNestedBlocks \ add=rakuPodAbbrRegion \ add=rakuPodDirectRegion \ add=rakuPodParaRegion \ add=rakuPodDelimRegion " Pod formatting codes syn cluster rakuPodFormat \ add=rakuPodFormatOne \ add=rakuPodFormatTwo \ add=rakuPodFormatThree \ add=rakuPodFormatFrench " Balanced angles found inside formatting codes. Ensures proper nesting. syn region rakuPodFormatAnglesOne \ matchgroup=rakuPodFormat \ start="<" \ skip="<[^>]*>" \ end=">" \ transparent contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne syn region rakuPodFormatAnglesTwo \ matchgroup=rakuPodFormat \ start="<<" \ skip="<<[^>]*>>" \ end=">>" \ transparent contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo syn region rakuPodFormatAnglesThree \ matchgroup=rakuPodFormat \ start="<<<" \ skip="<<<[^>]*>>>" \ end=">>>" \ transparent contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree syn region rakuPodFormatAnglesFrench \ matchgroup=rakuPodFormat \ start="«" \ skip="«[^»]*»" \ end="»" \ transparent contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree " All formatting codes syn region rakuPodFormatOne \ matchgroup=rakuPodFormatCode \ start="\u<" \ skip="<[^>]*>" \ end=">" \ contained \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne syn region rakuPodFormatTwo \ matchgroup=rakuPodFormatCode \ start="\u<<" \ skip="<<[^>]*>>" \ end=">>" \ contained \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo syn region rakuPodFormatThree \ matchgroup=rakuPodFormatCode \ start="\u<<<" \ skip="<<<[^>]*>>>" \ end=">>>" \ contained \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree syn region rakuPodFormatFrench \ matchgroup=rakuPodFormatCode \ start="\u«" \ skip="«[^»]*»" \ end="»" \ contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree " C<> and V<> don't allow nested formatting formatting codes syn region rakuPodFormatOne \ matchgroup=rakuPodFormatCode \ start="[CV]<" \ skip="<[^>]*>" \ end=">" \ contained \ contains=rakuPodFormatAnglesOne syn region rakuPodFormatTwo \ matchgroup=rakuPodFormatCode \ start="[CV]<<" \ skip="<<[^>]*>>" \ end=">>" \ contained \ contains=rakuPodFormatAnglesTwo syn region rakuPodFormatThree \ matchgroup=rakuPodFormatCode \ start="[CV]<<<" \ skip="<<<[^>]*>>>" \ end=">>>" \ contained \ contains=rakuPodFormatAnglesThree syn region rakuPodFormatFrench \ matchgroup=rakuPodFormatCode \ start="[CV]«" \ skip="«[^»]*»" \ end="»" \ contained \ contains=rakuPodFormatAnglesFrench " L<> can have a "|" separator syn region rakuPodFormatOne \ matchgroup=rakuPodFormatCode \ start="L<" \ skip="<[^>]*>" \ end=">" \ contained \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar syn region rakuPodFormatTwo \ matchgroup=rakuPodFormatCode \ start="L<<" \ skip="<<[^>]*>>" \ end=">>" \ contained \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar syn region rakuPodFormatThree \ matchgroup=rakuPodFormatCode \ start="L<<<" \ skip="<<<[^>]*>>>" \ end=">>>" \ contained \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar syn region rakuPodFormatFrench \ matchgroup=rakuPodFormatCode \ start="L«" \ skip="«[^»]*»" \ end="»" \ contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar " E<> can have a ";" separator syn region rakuPodFormatOne \ matchgroup=rakuPodFormatCode \ start="E<" \ skip="<[^>]*>" \ end=">" \ contained \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodSemiColon syn region rakuPodFormatTwo \ matchgroup=rakuPodFormatCode \ start="E<<" \ skip="<<[^>]*>>" \ end=">>" \ contained \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodSemiColon syn region rakuPodFormatThree \ matchgroup=rakuPodFormatCode \ start="E<<<" \ skip="<<<[^>]*>>>" \ end=">>>" \ contained \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon syn region rakuPodFormatFrench \ matchgroup=rakuPodFormatCode \ start="E«" \ skip="«[^»]*»" \ end="»" \ contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon " M<> can have a ":" separator syn region rakuPodFormatOne \ matchgroup=rakuPodFormatCode \ start="M<" \ skip="<[^>]*>" \ end=">" \ contained \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodColon syn region rakuPodFormatTwo \ matchgroup=rakuPodFormatCode \ start="M<<" \ skip="<<[^>]*>>" \ end=">>" \ contained \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodColon syn region rakuPodFormatThree \ matchgroup=rakuPodFormatCode \ start="M<<<" \ skip="<<<[^>]*>>>" \ end=">>>" \ contained \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon syn region rakuPodFormatFrench \ matchgroup=rakuPodFormatCode \ start="M«" \ skip="«[^»]*»" \ end="»" \ contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon " D<> can have "|" and ";" separators syn region rakuPodFormatOne \ matchgroup=rakuPodFormatCode \ start="D<" \ skip="<[^>]*>" \ end=">" \ contained \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon syn region rakuPodFormatTwo \ matchgroup=rakuPodFormatCode \ start="D<<" \ skip="<<[^>]*>>" \ end=">>" \ contained \ contains=rakuPodFormatAngleTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon syn region rakuPodFormatThree \ matchgroup=rakuPodFormatCode \ start="D<<<" \ skip="<<<[^>]*>>>" \ end=">>>" \ contained \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon syn region rakuPodFormatFrench \ matchgroup=rakuPodFormatCode \ start="D«" \ skip="«[^»]*»" \ end="»" \ contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon " X<> can have "|", "," and ";" separators syn region rakuPodFormatOne \ matchgroup=rakuPodFormatCode \ start="X<" \ skip="<[^>]*>" \ end=">" \ contained \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma syn region rakuPodFormatTwo \ matchgroup=rakuPodFormatCode \ start="X<<" \ skip="<<[^>]*>>" \ end=">>" \ contained \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma syn region rakuPodFormatThree \ matchgroup=rakuPodFormatCode \ start="X<<<" \ skip="<<<[^>]*>>>" \ end=">>>" \ contained \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma syn region rakuPodFormatFrench \ matchgroup=rakuPodFormatCode \ start="X«" \ skip="«[^»]*»" \ end="»" \ contained \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma " Define the default highlighting. " For version 5.7 and earlier: only when not done already " For version 5.8 and later: only when an item doesn't have highlighting yet if version >= 508 || !exists("did_raku_syntax_inits") if version < 508 let did_raku_syntax_inits = 1 command -nargs=+ HiLink hi link <args> else command -nargs=+ HiLink hi def link <args> endif HiLink rakuEscOctOld rakuError HiLink rakuPackageTwigil rakuTwigil HiLink rakuStringAngle rakuString HiLink rakuStringAngleFixed rakuString HiLink rakuStringFrench rakuString HiLink rakuStringAngles rakuString HiLink rakuStringSQ rakuString HiLink rakuStringDQ rakuString HiLink rakuStringQ rakuString HiLink rakuStringQ_q rakuString HiLink rakuStringQ_qww rakuString HiLink rakuStringQ_qq rakuString HiLink rakuStringQ_to rakuString HiLink rakuStringQ_qto rakuString HiLink rakuStringQ_qqto rakuString HiLink rakuRxStringSQ rakuString HiLink rakuRxStringDQ rakuString HiLink rakuReplacement rakuString HiLink rakuReplCurly rakuString HiLink rakuReplAngle rakuString HiLink rakuReplFrench rakuString HiLink rakuReplBracket rakuString HiLink rakuReplParen rakuString HiLink rakuTransliteration rakuString HiLink rakuTransRepl rakuString HiLink rakuTransReplCurly rakuString HiLink rakuTransReplAngle rakuString HiLink rakuTransReplFrench rakuString HiLink rakuTransReplBracket rakuString HiLink rakuTransReplParen rakuString HiLink rakuStringAuto rakuString HiLink rakuKey rakuString HiLink rakuMatch rakuString HiLink rakuSubstitution rakuString HiLink rakuMatchBare rakuString HiLink rakuRegexBlock rakuString HiLink rakuRxP5CharClass rakuString HiLink rakuRxP5QuoteMeta rakuString HiLink rakuRxCharClass rakuString HiLink rakuRxQuoteWords rakuString HiLink rakuReduceOp rakuOperator HiLink rakuSetOp rakuOperator HiLink rakuRSXZOp rakuOperator HiLink rakuHyperOp rakuOperator HiLink rakuPostHyperOp rakuOperator HiLink rakuQuoteQ rakuQuote HiLink rakuQuoteQ_q rakuQuote HiLink rakuQuoteQ_qww rakuQuote HiLink rakuQuoteQ_qq rakuQuote HiLink rakuQuoteQ_to rakuQuote HiLink rakuQuoteQ_qto rakuQuote HiLink rakuQuoteQ_qqto rakuQuote HiLink rakuQuoteQ_PIR rakuQuote HiLink rakuMatchStart_m rakuQuote HiLink rakuMatchStart_s rakuQuote HiLink rakuMatchStart_tr rakuQuote HiLink rakuBareSigil rakuVariable HiLink rakuRxRange rakuStringSpecial HiLink rakuRxAnchor rakuStringSpecial HiLink rakuRxBoundary rakuStringSpecial HiLink rakuRxP5Anchor rakuStringSpecial HiLink rakuCodePoint rakuStringSpecial HiLink rakuRxMeta rakuStringSpecial HiLink rakuRxP5Range rakuStringSpecial HiLink rakuRxP5CPId rakuStringSpecial HiLink rakuRxP5Posix rakuStringSpecial HiLink rakuRxP5Mod rakuStringSpecial HiLink rakuRxP5HexSeq rakuStringSpecial HiLink rakuRxP5OctSeq rakuStringSpecial HiLink rakuRxP5WriteRefId rakuStringSpecial HiLink rakuHexSequence rakuStringSpecial HiLink rakuOctSequence rakuStringSpecial HiLink rakuRxP5Named rakuStringSpecial HiLink rakuRxP5PropId rakuStringSpecial HiLink rakuRxP5Quantifier rakuStringSpecial HiLink rakuRxP5CountId rakuStringSpecial HiLink rakuRxP5Verb rakuStringSpecial HiLink rakuRxAssertGroup rakuStringSpecial2 HiLink rakuEscape rakuStringSpecial2 HiLink rakuEscNull rakuStringSpecial2 HiLink rakuEscHash rakuStringSpecial2 HiLink rakuEscQQ rakuStringSpecial2 HiLink rakuEscQuote rakuStringSpecial2 HiLink rakuEscDoubleQuote rakuStringSpecial2 HiLink rakuEscBackTick rakuStringSpecial2 HiLink rakuEscForwardSlash rakuStringSpecial2 HiLink rakuEscVerticalBar rakuStringSpecial2 HiLink rakuEscExclamation rakuStringSpecial2 HiLink rakuEscDollar rakuStringSpecial2 HiLink rakuEscOpenCurly rakuStringSpecial2 HiLink rakuEscCloseCurly rakuStringSpecial2 HiLink rakuEscCloseBracket rakuStringSpecial2 HiLink rakuEscCloseAngle rakuStringSpecial2 HiLink rakuEscCloseFrench rakuStringSpecial2 HiLink rakuEscBackSlash rakuStringSpecial2 HiLink rakuEscCodePoint rakuStringSpecial2 HiLink rakuEscOct rakuStringSpecial2 HiLink rakuEscHex rakuStringSpecial2 HiLink rakuRxEscape rakuStringSpecial2 HiLink rakuRxCapture rakuStringSpecial2 HiLink rakuRxAlternation rakuStringSpecial2 HiLink rakuRxP5 rakuStringSpecial2 HiLink rakuRxP5ReadRef rakuStringSpecial2 HiLink rakuRxP5Oct rakuStringSpecial2 HiLink rakuRxP5Hex rakuStringSpecial2 HiLink rakuRxP5EscMeta rakuStringSpecial2 HiLink rakuRxP5Meta rakuStringSpecial2 HiLink rakuRxP5Escape rakuStringSpecial2 HiLink rakuRxP5CodePoint rakuStringSpecial2 HiLink rakuRxP5WriteRef rakuStringSpecial2 HiLink rakuRxP5Prop rakuStringSpecial2 HiLink rakuProperty Tag HiLink rakuAttention Todo HiLink rakuType Type HiLink rakuError Error HiLink rakuBlockLabel Label HiLink rakuNormal Normal HiLink rakuIdentifier Normal HiLink rakuPackage Normal HiLink rakuPackageScope Normal HiLink rakuNumber Number HiLink rakuOctNumber Number HiLink rakuBinNumber Number HiLink rakuHexNumber Number HiLink rakuDecNumber Number HiLink rakuString String HiLink rakuRepeat Repeat HiLink rakuPragma Keyword HiLink rakuPreDeclare Keyword HiLink rakuDeclare Keyword HiLink rakuDeclareRegex Keyword HiLink rakuVarStorage Special HiLink rakuFlowControl Special HiLink rakuOctBase Special HiLink rakuBinBase Special HiLink rakuHexBase Special HiLink rakuDecBase Special HiLink rakuTwigil Special HiLink rakuStringSpecial2 Special HiLink rakuVersion Special HiLink rakuComment Comment HiLink rakuBracketComment Comment HiLink rakuInclude Include HiLink rakuShebang PreProc HiLink rakuClosureTrait PreProc HiLink rakuOperator Operator HiLink rakuContext Operator HiLink rakuQuote Delimiter HiLink rakuTypeConstraint PreCondit HiLink rakuException Exception HiLink rakuVariable Identifier HiLink rakuVarSlash Identifier HiLink rakuVarNum Identifier HiLink rakuVarExclam Identifier HiLink rakuVarMatch Identifier HiLink rakuVarName Identifier HiLink rakuMatchVar Identifier HiLink rakuRxP5ReadRefId Identifier HiLink rakuRxP5ModDef Identifier HiLink rakuRxP5ModName Identifier HiLink rakuConditional Conditional HiLink rakuStringSpecial SpecialChar HiLink rakuPodAbbr rakuPod HiLink rakuPodAbbrEOF rakuPod HiLink rakuPodAbbrNoCode rakuPod HiLink rakuPodAbbrCode rakuPodCode HiLink rakuPodPara rakuPod HiLink rakuPodParaEOF rakuPod HiLink rakuPodParaNoCode rakuPod HiLink rakuPodParaCode rakuPodCode HiLink rakuPodDelim rakuPod HiLink rakuPodDelimEOF rakuPod HiLink rakuPodDelimNoCode rakuPod HiLink rakuPodDelimCode rakuPodCode HiLink rakuPodImplicitCode rakuPodCode HiLink rakuPodExtraConfig rakuPodPrefix HiLink rakuPodVerticalBar rakuPodFormatCode HiLink rakuPodColon rakuPodFormatCode HiLink rakuPodSemicolon rakuPodFormatCode HiLink rakuPodComma rakuPodFormatCode HiLink rakuPodFormatOne rakuPodFormat HiLink rakuPodFormatTwo rakuPodFormat HiLink rakuPodFormatThree rakuPodFormat HiLink rakuPodFormatFrench rakuPodFormat HiLink rakuPodType Type HiLink rakuPodConfigOption String HiLink rakuPodCode PreProc HiLink rakuPod Comment HiLink rakuPodComment Comment HiLink rakuPodAutoQuote Operator HiLink rakuPodConfigOperator Operator HiLink rakuPodPrefix Statement HiLink rakuPodName Identifier HiLink rakuPodFormatCode SpecialChar HiLink rakuPodFormat SpecialComment delcommand HiLink endif if exists("raku_fold") || exists("raku_extended_all") setl foldmethod=syntax syn region rakuBlockFold \ start="^\z(\s*\)\%(my\|our\|augment\|multi\|proto\|only\)\?\s*\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\s\+\)\?\<\%(CATCH\|try\|ENTER\|LEAVE\|CHECK\|INIT\|BEGIN\|END\|KEEP\|UNDO\|PRE\|POST\|module\|package\|enum\|subset\|class\|sub\%(method\)\?\|multi\|method\|slang\|grammar\|regex\|token\|rule\)\>[^{]\+\%({\s*\%(#.*\)\?\)\?$" \ end="^\z1}" \ transparent fold keepend extend endif let b:current_syntax = "raku" let &cpo = s:keepcpo unlet s:keepcpo " vim:ts=8:sts=4:sw=4:expandtab:ft=vim