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