neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

raku.vim (75693B)


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