diff runtime/syntax/raku.vim @ 24520:5bda4653aced

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