forked from aniani/vim
		
	
		
			
				
	
	
		
			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
 |