" Vim syntax file " Language: Raku " Maintainer: vim-perl " Homepage: https://github.com/Raku/vim-raku " Bugs/requests: https://github.com/Raku/vim-raku/issues " Last Change: 2021-04-16 " Contributors: Luke Palmer " Moritz Lenz " Hinrik Örn Sigurðsson " " 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". 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" nextgroup=rakuDeclare,rakuIdentifier skipwhite skipempty syn match rakuDeclare display "[.^]\@1" nextgroup=rakuIdentifier skipwhite skipempty syn match rakuDeclareRegex display "[.^]\@1" nextgroup=rakuRegexName skipwhite skipempty syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@" syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@».;\\∈∉∋∌∩∪≼≽⊂⊃⊄⊅⊆⊇⊈⊉⊍⊎⊖∅∘]" syn match rakuOperator display "\%(:\@1][=+]\?\|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" 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]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ 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]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ 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]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ 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" 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, 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 " 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>, * !< 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\|\%([=-]\{1,2}>\|[=-]\{1,2}\)\)\@!" \ start="\%(^\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" \ start="[<+~=!]\@1\|\%([=-]\{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" \ end=">" \ transparent contained \ contains=rakuInnerAnglesOne " <> 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" 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", "rakuEscCloseAngle", "\\%(\\\\\\@1\\|<[^>]*>\\)"], \ ["French", "«", "»", "rakuEscCloseFrench", "\\%(\\\\\\@1, @ 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" \ 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\)\)\@=" 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>\)" contained syn match rakuTwigil display "\%([.^*?=!~]\|:\@1\|\<\%(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, 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, 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, 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" \ 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 syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2\@!" \ skip="\\>" \ end=">" \ contains=@rakuRegexP5,rakuVariables " m:P5«» syn region rakuMatch \ matchgroup=rakuQuote \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2]*>" \ 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" syn match rakuStringAuto display "\.\@1" syn match rakuStringAuto display "\.\@1" " 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\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 else command -nargs=+ HiLink hi def link 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