mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	
		
			
	
	
		
			1972 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			1972 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " 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 |