home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / dos / syntax / perl6.vim < prev    next >
Encoding:
Text File  |  2012-05-31  |  74.0 KB  |  2,255 lines

  1. " Vim syntax file
  2. " Language:     Perl 6
  3. " Maintainer:   Andy Lester <andy@petdance.com>
  4. " Homepage:     http://github.com/petdance/vim-perl/tree/master
  5. " Last Change:  2012 Apr 30
  6.  
  7. " Contributors: Luke Palmer <fibonaci@babylonia.flatirons.org>
  8. "               Moritz Lenz <moritz@faui2k3.org>
  9. "               Hinrik ├ûrn Sigur├░sson <hinrik.sig@gmail.com>
  10. "
  11. " This is a big undertaking. Perl 6 is the sort of language that only Perl
  12. " can parse. But I'll do my best to get vim to.
  13. "
  14. " You can associate the extension ".pl" with the filetype "perl6" by setting
  15. "     autocmd BufNewFile,BufRead *.pl setf perl6
  16. " in your ~/.vimrc. But that will infringe on Perl 5, so you might want to
  17. " put a modeline near the beginning or end of your Perl 6 files instead:
  18. "     # vim: filetype=perl6
  19.  
  20. " TODO:
  21. "   * Deal with s:Perl5//
  22. "   * m:s// is a match, not a substitution
  23. "   * Make these highlight as strings, not operators:
  24. "       <==> <=:=> <===> <=~> <┬½ ┬╗> ┬½>┬╗ ┬½<┬╗
  25. "   * Allow more keywords to match as function calls(leave() is export(), etc)
  26. "   * Optimization: use nextgroup instead of lookaround (:help syn-nextgroup)
  27. "   * Fix s''' substitutions being matched as package names
  28. "   * Match s/// and m/// better, so things like "$s/" won't match
  29. "   * Add more support for folding (:help syn-fold)
  30. "   * Add more syntax syncing hooks (:help syn-sync)
  31. "   * Q//:
  32. "       :to, :heredoc
  33. "       interpolate \q:s{$scalar} (though the spec isn't very clear on it)
  34. "
  35. " Impossible TODO?:
  36. "   * Unspace
  37. "   * Unicode bracketing characters for quoting (there are so many)
  38. "   * Various tricks depending on context. I.e. we can't know when Perl
  39. "     expects ┬½*┬╗ to be a string or a hyperoperator. The latter is presumably
  40. "     more common, so that's what we assume.
  41. "   * Selective highlighting of Pod formatting codes with the :allow option
  42. "   * Arbitrary number, order, and negation of adverbs to Q//, q//, qq//.
  43. "     Currently only the first adverb is considered significant. Anything
  44. "     more would require an exponential amount of regexes, making this
  45. "     already slow syntax file even slower.
  46. "
  47. " If you want to have Pir code inside Q:PIR// strings highlighted, do:
  48. "  let perl6_embedded_pir=1
  49. "
  50. " The above requires pir.vim, which you can find in Parrot's repository:
  51. " https://svn.parrot.org/parrot/trunk/editor/
  52. "
  53. " Some less than crucial things have been made optional to speed things up.
  54. " Look at the comments near the if/else branches in this file to see exactly
  55. " which features are affected. "perl6_extended_all" enables everything.
  56. "
  57. " The defaults are:
  58. "
  59. "  unlet perl6_extended_comments
  60. "  unlet perl6_extended_q
  61. "  unlet perl6_extended_all
  62.  
  63. " For version 5.x: Clear all syntax items
  64. " For version 6.x: Quit when a syntax file was already loaded
  65. if version < 600
  66.     syntax clear
  67. elseif exists("b:current_syntax")
  68.     finish
  69. endif
  70. let s:keepcpo= &cpo
  71. set cpo&vim
  72.  
  73. " identifiers
  74. syn match p6Normal display "\K\%(\k\|[-']\K\@=\)*"
  75.  
  76. " This is used in the for loops below
  77. " Don't use the "syn keyword" construct because that always has higher
  78. " priority than matches/regions, so the words can't be autoquoted with
  79. " the "=>" and "p5=>" operators. All the lookaround stuff is to make sure
  80. " we don't match them as part of some other identifier.
  81. let s:before_keyword = " display \"\\%(\\k\\|\\K\\@<=[-']\\)\\@<!\\%("
  82. let s:after_keyword = "\\)\\%(\\k\\|[-']\\K\\@=\\)\\@!\""
  83.  
  84. " Billions of keywords
  85. let s:keywords = {
  86.  \ "p6Attention": [
  87.  \   "ACHTUNG ATTN ATTENTION FIXME NB TODO TBD WTF XXX NOTE",
  88.  \ ],
  89.  \ "p6DeclareRoutine": [
  90.  \   "macro sub submethod method multi proto only rule token regex category",
  91.  \ ],
  92.  \ "p6Module": [
  93.  \   "module class role package enum grammar slang subset",
  94.  \ ],
  95.  \ "p6Variable": [
  96.  \   "self",
  97.  \ ],
  98.  \ "p6Include": [
  99.  \   "use require",
  100.  \ ],
  101.  \ "p6Conditional": [
  102.  \   "if else elsif unless",
  103.  \ ],
  104.  \ "p6VarStorage": [
  105.  \   "let my our state temp has constant",
  106.  \ ],
  107.  \ "p6Repeat": [
  108.  \   "for loop repeat while until gather given",
  109.  \ ],
  110.  \ "p6FlowControl": [
  111.  \   "take do when next last redo return contend maybe defer",
  112.  \   "default exit make continue break goto leave async lift",
  113.  \ ],
  114.  \ "p6TypeConstraint": [
  115.  \   "is as but trusts of returns handles where augment supersede",
  116.  \ ],
  117.  \ "p6ClosureTrait": [
  118.  \   "BEGIN CHECK INIT START FIRST ENTER LEAVE KEEP",
  119.  \   "UNDO NEXT LAST PRE POST END CATCH CONTROL TEMP",
  120.  \ ],
  121.  \ "p6Exception": [
  122.  \   "die fail try warn",
  123.  \ ],
  124.  \ "p6Property": [
  125.  \   "prec irs ofs ors export deep binary unary reparsed rw parsed cached",
  126.  \   "readonly defequiv will ref copy inline tighter looser equiv assoc",
  127.  \   "required",
  128.  \ ],
  129.  \ "p6Number": [
  130.  \   "NaN Inf",
  131.  \ ],
  132.  \ "p6Pragma": [
  133.  \   "oo fatal",
  134.  \ ],
  135.  \ "p6Type": [
  136.  \   "Object Any Junction Whatever Capture Match",
  137.  \   "Signature Proxy Matcher Package Module Class",
  138.  \   "Grammar Scalar Array Hash KeyHash KeySet KeyBag",
  139.  \   "Pair List Seq Range Set Bag Mapping Void Undef",
  140.  \   "Failure Exception Code Block Routine Sub Macro",
  141.  \   "Method Submethod Regex Str Blob Char Byte",
  142.  \   "Codepoint Grapheme StrPos StrLen Version Num",
  143.  \   "Complex num complex Bit bit bool True False",
  144.  \   "Increasing Decreasing Ordered Callable AnyChar",
  145.  \   "Positional Associative Ordering KeyExtractor",
  146.  \   "Comparator OrderingPair IO KitchenSink Role",
  147.  \   "Int int int1 int2 int4 int8 int16 int32 int64",
  148.  \   "Rat rat rat1 rat2 rat4 rat8 rat16 rat32 rat64",
  149.  \   "Buf buf buf1 buf2 buf4 buf8 buf16 buf32 buf64",
  150.  \   "UInt uint uint1 uint2 uint4 uint8 uint16 uint32",
  151.  \   "uint64 Abstraction utf8 utf16 utf32",
  152.  \ ],
  153.  \ "p6Operator": [
  154.  \   "div x xx mod also leg cmp before after eq ne le lt",
  155.  \   "gt ge eqv ff fff and andthen Z X or xor",
  156.  \   "orelse extra m mm rx s tr",
  157.  \ ],
  158. \ }
  159.  
  160. for [group, words] in items(s:keywords)
  161.     let s:words_space = join(words, " ")
  162.     let s:temp = split(s:words_space)
  163.     let s:words = join(s:temp, "\\|")
  164.     exec "syn match ". group ." ". s:before_keyword . s:words . s:after_keyword
  165. endfor
  166. unlet s:keywords s:words_space s:temp s:words
  167.  
  168. " More operators
  169. " Don't put a "\+" at the end of the character class. That makes it so
  170. " greedy that the "%" " in "+%foo" won't be allowed to match as a sigil,
  171. " among other things
  172. syn match p6Operator display "[-+/*~?|=^!%&,<>.;\\]"
  173. syn match p6Operator display "\%(:\@<!::\@!\|::=\|\.::\)"
  174. " these require whitespace on the left side
  175. syn match p6Operator display "\%(\s\|^\)\@<=\%(xx=\|p5=>\)"
  176. " "i" requires a digit to the left, and no keyword char to the right
  177. syn match p6Operator display "\d\@<=i\k\@!"
  178. " index overloading
  179. syn match p6Operator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)"
  180.  
  181. " all infix operators except nonassocative ones
  182. let s:infix_a = [
  183.     \ "div % mod +& +< +> \\~& ?& \\~< \\~> +| +\\^ \\~| \\~\\^ ?| ?\\^ xx x",
  184.     \ "\\~ && & also <== ==> <<== ==>> == != < <= > >= \\~\\~ eq ne lt le gt",
  185.     \ "ge =:= === eqv before after \\^\\^ min max \\^ff ff\\^ \\^ff\\^",
  186.     \ "\\^fff fff\\^ \\^fff\\^ fff ff ::= := \\.= => , : p5=> Z minmax",
  187.     \ "\\.\\.\\. and andthen or orelse xor \\^ += -= /= \\*= \\~= //= ||=",
  188.     \ "+ - \\*\\* \\* // / \\~ || |",
  189. \ ]
  190. " nonassociative infix operators
  191. let s:infix_n = "but does <=> leg cmp \\.\\. \\.\\.\\^\\^ \\^\\.\\. \\^\\.\\.\\^"
  192.  
  193. let s:infix_a_long = join(s:infix_a, " ")
  194. let s:infix_a_words = split(s:infix_a_long)
  195. let s:infix_a_pattern = join(s:infix_a_words, "\\|")
  196.  
  197. let s:infix_n_words = split(s:infix_n)
  198. let s:infix_n_pattern = join(s:infix_n_words, "\\|")
  199.  
  200. let s:both = [s:infix_a_pattern, s:infix_n_pattern]
  201. let s:infix = join(s:both, "\\|")
  202.  
  203. let s:infix_assoc = "!\\?\\%(" . s:infix_a_pattern . "\\)"
  204. let s:infix = "!\\?\\%(" . s:infix . "\\)"
  205.  
  206. unlet s:infix_a s:infix_a_long s:infix_a_words s:infix_a_pattern
  207. unlet s:infix_n s:infix_n_pattern s:both
  208.  
  209. " [+] reduce
  210. exec "syn match p6ReduceOp display \"\\k\\@<!\\[[R\\\\]\\?!\\?". s:infix_assoc ."]\\%(┬½\\|<<\\)\\?\""
  211. unlet s:infix_assoc
  212.  
  213. " Reverse and cross operators (Rop, Xop)
  214. exec "syn match p6ReverseCrossOp display \"[RX]". s:infix ."\""
  215.  
  216. " q() or whatever() is always a function call
  217. syn match p6Normal display "\K\%(\k\|[-']\K\@=\)*(\@="
  218.  
  219. " basically all builtins that can be followed by parentheses
  220. let s:routines = [
  221.  \ "eager hyper substr index rindex grep map sort join lines hints chmod",
  222.  \ "split reduce min max reverse truncate zip cat roundrobin classify",
  223.  \ "first sum keys values pairs defined delete exists elems end kv any",
  224.  \ "all one wrap shape key value name pop push shift splice unshift floor",
  225.  \ "ceiling abs exp log log10 rand sign sqrt sin cos tan round strand",
  226.  \ "roots cis unpolar polar atan2 pick chop p5chop chomp p5chomp lc",
  227.  \ "lcfirst uc ucfirst capitalize normalize pack unpack quotemeta comb",
  228.  \ "samecase sameaccent chars nfd nfc nfkd nfkc printf sprintf caller",
  229.  \ "evalfile run runinstead nothing want bless chr ord gmtime time eof",
  230.  \ "localtime gethost getpw chroot getlogin getpeername kill fork wait",
  231.  \ "perl graphs codes bytes clone print open read write readline say seek",
  232.  \ "close opendir readdir slurp pos fmt vec link unlink symlink uniq pair",
  233.  \ "asin atan sec cosec cotan asec acosec acotan sinh cosh tanh asinh",
  234.  \ "acos acosh atanh sech cosech cotanh sech acosech acotanh asech ok",
  235.  \ "plan_ok dies_ok lives_ok skip todo pass flunk force_todo use_ok isa_ok",
  236.  \ "diag is_deeply isnt like skip_rest unlike cmp_ok eval_dies_ok nok_error",
  237.  \ "eval_lives_ok approx is_approx throws_ok version_lt plan eval succ pred",
  238.  \ "times nonce once signature new connect operator undef undefine sleep",
  239.  \ "from to infix postfix prefix circumfix postcircumfix minmax lazy count",
  240.  \ "unwrap getc pi e context void quasi body each contains rewinddir subst",
  241.  \ "can isa flush arity assuming rewind callwith callsame nextwith nextsame",
  242.  \ "attr eval_elsewhere none srand trim trim_start trim_end lastcall WHAT",
  243.  \ "WHERE HOW WHICH VAR WHO WHENCE ACCEPTS REJECTS does not true iterator by",
  244.  \ "re im invert flip",
  245. \ ]
  246.  
  247. " we want to highlight builtins like split() though, so this comes afterwards
  248. " TODO: check if this would be faster as one big regex
  249. let s:words_space = join(s:routines, " ")
  250. let s:temp = split(s:words_space)
  251. let s:words = join(s:temp, "\\|")
  252. exec "syn match p6Routine ". s:before_keyword . s:words . s:after_keyword
  253. unlet s:before_keyword s:after_keyword s:words_space s:temp s:words s:routines
  254.  
  255. " packages, must come after all the keywords
  256. syn match p6Normal display "\%(::\)\@<=\K\%(\k\|[-']\K\@=\)*"
  257. syn match p6Normal display "\K\%(\k\|[-']\K\@=\)*\%(::\)\@="
  258.  
  259. " some standard packages
  260. syn match p6Type display "\%(::\|\k\|\K\@<=[-']\)\@<!\%(Order\%(::Same\|::Increase\|::Decrease\)\?\)\%(\k\|[-']\K\@=\)\@!"
  261. syn match p6Type display "\%(::\|\k\|\K\@<=[-']\)\@<!\%(Bool\%(::True\|::False\)\?\)\%(\k\|[-']\K\@=\)\@!"
  262.  
  263.  
  264. syn match p6Shebang    display "\%^#!.*"
  265. syn match p6BlockLabel display "\%(^\s*\)\@<=\h\w*\s*::\@!\_s\@="
  266. syn match p6Number     display "\k\@<!_\@!\%(\d\|__\@!\)\+_\@<!\%([eE]_\@!+\?\%(\d\|_\)\+\)\?_\@<!"
  267. syn match p6Float      display "\k\@<!_\@!\%(\d\|__\@!\)\+_\@<![eE]_\@!-\%(\d\|_\)\+"
  268. syn match p6Float      display "\k\@<!_\@<!\%(\d\|__\@!\)*_\@<!\.\@<!\._\@!\.\@!\a\@!\%(\d\|_\)\+_\@<!\%([eE]_\@!\%(\d\|_\)\+\)\?"
  269.  
  270. syn match p6NumberBase display "[obxd]" contained
  271. syn match p6Number     display "\<0\%(o[0-7][0-7_]*\)\@="     nextgroup=p6NumberBase
  272. syn match p6Number     display "\<0\%(b[01][01_]*\)\@="       nextgroup=p6NumberBase
  273. syn match p6Number     display "\<0\%(x\x[[:xdigit:]_]*\)\@=" nextgroup=p6NumberBase
  274. syn match p6Number     display "\<0\%(d\d[[:digit:]_]*\)\@="  nextgroup=p6NumberBase
  275. syn match p6Number     display "\%(\<0o\)\@<=[0-7][0-7_]*"
  276. syn match p6Number     display "\%(\<0b\)\@<=[01][01_]*"
  277. syn match p6Number     display "\%(\<0x\)\@<=\x[[:xdigit:]_]*"
  278. syn match p6Number     display "\%(\<0d\)\@<=\d[[:digit:]_]*"
  279.  
  280. syn match p6Version    display "\<v\d\@=" nextgroup=p6VersionNum
  281. syn match p6VersionNum display "\d\+" nextgroup=p6VersionDot contained
  282. syn match p6VersionDot display "\.\%(\d\|\*\)\@=" nextgroup=p6VersionNum contained
  283.  
  284. " try to distinguish the "is" function from the "is" trail auxiliary
  285. syn match p6Routine     display "\%(\%(\S\k\@<!\|^\)\s*\)\@<=is\>"
  286.  
  287. " does is a type constraint sometimes
  288. syn match p6TypeConstraint display "does\%(\s*\%(\k\|[-']\K\@=\)\)\@="
  289.  
  290. " int is a type sometimes
  291. syn match p6Type        display "\<int\>\%(\s*(\|\s\+\d\)\@!"
  292.  
  293. " these Routine names are also Properties, if preceded by "is"
  294. syn match p6Property    display "\%(is\s\+\)\@<=\%(signature\|context\|also\|shape\)"
  295.  
  296. " The sigil in ::*Package
  297. syn match p6PackageTwigil display "\%(::\)\@<=\*"
  298.  
  299. " $<match>
  300. syn region p6MatchVarSigil
  301.     \ matchgroup=p6Variable
  302.     \ start="\$\%(<<\@!\)\@="
  303.     \ end=">\@<="
  304.     \ contains=p6MatchVar
  305.  
  306. syn region p6MatchVar
  307.     \ matchgroup=p6Twigil
  308.     \ start="<"
  309.     \ end=">"
  310.     \ contained
  311.  
  312. " Contextualizers
  313. syn match p6Context display "\<\%(item\|list\|slice\|hash\)\>"
  314. syn match p6Context display "\%(\$\|@\|%\|&\|@@\)(\@="
  315.  
  316. " the "$" placeholder in "$var1, $, var2 = @list"
  317. syn match p6Placeholder display "\%(,\s*\)\@<=\$\%(\K\|\%([.^*?=!~]\|:\@<!::\@!\)\)\@!"
  318. syn match p6Placeholder display "\$\%(\K\|\%([.^*?=!~]\|:\@<!::\@!\)\)\@!\%(,\s*\)\@="
  319.  
  320. " Quoting
  321.  
  322. " one cluster for every quote adverb
  323. syn cluster p6Interp_s
  324.     \ add=p6InterpScalar
  325. syn cluster p6Interp_scalar
  326.     \ add=p6InterpScalar
  327.  
  328. syn cluster p6Interp_a
  329.     \ add=p6InterpArray
  330. syn cluster p6Interp_array
  331.     \ add=p6InterpArray
  332.  
  333. syn cluster p6Interp_h
  334.     \ add=p6InterpHash
  335. syn cluster p6Interp_hash
  336.     \ add=p6InterpHash
  337.  
  338. syn cluster p6Interp_f
  339.     \ add=p6InterpFunction
  340. syn cluster p6Interp_f
  341.     \ add=p6InterpFunction
  342.  
  343. syn cluster p6Interp_c
  344.     \ add=p6InterpClosure
  345. syn cluster p6Interp_closure
  346.     \ add=p6InterpClosure
  347.  
  348.  
  349. if exists("perl6_extended_q") || exists("perl6_extended_all")
  350.     syn cluster p6Interp_ww
  351.         \ add=p6StringSQ
  352.         \ add=p6StringDQ
  353.     syn cluster p6Interp_quotewords
  354.         \ add=p6StringSQ
  355.         \ add=p6StringDQ
  356. endif
  357.  
  358. syn cluster p6Interp_q
  359.     \ add=p6EscQQ
  360.     \ add=p6EscBackSlash
  361. syn cluster p6Interp_single
  362.     \ add=p6EscQQ
  363.     \ add=p6EscBackSlash
  364.  
  365. syn cluster p6Interp_b
  366.     \ add=@p6Interp_q
  367.     \ add=p6Escape
  368.     \ add=p6EscOpenCurly
  369.     \ add=p6EscCodePoint
  370.     \ add=p6EscHex
  371.     \ add=p6EscOct
  372.     \ add=p6EscOctOld
  373.     \ add=p6EscNull
  374. syn cluster p6Interp_backslash
  375.     \ add=@p6Interp_q
  376.     \ add=p6Escape
  377.     \ add=p6EscOpenCurly
  378.     \ add=p6EscCodePoint
  379.     \ add=p6EscHex
  380.     \ add=p6EscOct
  381.     \ add=p6EscOctOld
  382.     \ add=p6EscNull
  383.  
  384. syn cluster p6Interp_qq
  385.     \ add=@p6Interp_scalar
  386.     \ add=@p6Interp_array
  387.     \ add=@p6Interp_hash
  388.     \ add=@p6Interp_function
  389.     \ add=@p6Interp_closure
  390.     \ add=@p6Interp_backslash
  391. syn cluster p6Interp_double
  392.     \ add=@p6Interp_scalar
  393.     \ add=@p6Interp_array
  394.     \ add=@p6Interp_hash
  395.     \ add=@p6Interp_function
  396.     \ add=@p6Interp_closure
  397.     \ add=@p6Interp_backslash
  398.  
  399. syn region p6InterpScalar
  400.     \ start="\ze\z(\$\%(\%(\%(\d\+\|!\|/\|┬ó\)\|\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\)\%(\.\%(\K\%(\k\|[-']\K\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\)\)"
  401.     \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\)\|\%(\d\+\|!\|/\|┬ó\)\)\)"
  402.     \ end="\z1\zs"
  403.     \ contained
  404.     \ contains=TOP
  405.     \ keepend
  406.  
  407. syn region p6InterpScalar
  408.     \ matchgroup=p6Context
  409.     \ start="\$\ze()\@!"
  410.     \ skip="([^)]*)"
  411.     \ end=")\zs"
  412.     \ contained
  413.     \ contains=TOP
  414.  
  415. syn region p6InterpArray
  416.     \ start="\ze\z(@\$*\%(\%(\%(!\|/\|┬ó\)\|\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\)\%(\.\%(\K\%(\k\|[-']\K\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\)\)"
  417.     \ end="\z1\zs"
  418.     \ contained
  419.     \ contains=TOP
  420.     \ keepend
  421.  
  422. syn region p6InterpArray
  423.     \ matchgroup=p6Context
  424.     \ start="@\ze()\@!"
  425.     \ start="@@\ze()\@!"
  426.     \ skip="([^)]*)"
  427.     \ end=")\zs"
  428.     \ contained
  429.     \ contains=TOP
  430.  
  431. syn region p6InterpHash
  432.     \ start="\ze\z(%\$*\%(\%(\%(!\|/\|┬ó\)\|\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\)\%(\.\%(\K\%(\k\|[-']\K\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\)\)"
  433.     \ end="\z1\zs"
  434.     \ contained
  435.     \ contains=TOP
  436.     \ keepend
  437.  
  438. syn region p6InterpHash
  439.     \ matchgroup=p6Context
  440.     \ start="%\ze()\@!"
  441.     \ skip="([^)]*)"
  442.     \ end=")\zs"
  443.     \ contained
  444.     \ contains=TOP
  445.  
  446. syn region p6InterpFunction
  447.     \ start="\ze\z(&\%(\%(!\|/\|┬ó\)\|\%(\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\@=\)\?\K\%(\k\|[-']\K\@=\)*\%(\.\%(\K\%(\k\|[-']\K\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\)\)"
  448.     \ end="\z1\zs"
  449.     \ contained
  450.     \ contains=TOP
  451.     \ keepend
  452.  
  453. syn region p6InterpFunction
  454.     \ matchgroup=p6Context
  455.     \ start="&\ze()\@!"
  456.     \ skip="([^)]*)"
  457.     \ end=")\zs"
  458.     \ contained
  459.     \ contains=TOP
  460.  
  461. syn region p6InterpClosure
  462.     \ start="\\\@<!{}\@!"
  463.     \ skip="{[^}]*}"
  464.     \ end="}"
  465.     \ contained
  466.     \ contains=TOP
  467.     \ keepend
  468.  
  469. " generic escape
  470. syn match p6Escape          display "\\\S" contained
  471.  
  472. " escaped closing delimiters
  473. syn match p6EscQuote        display "\\'" contained
  474. syn match p6EscDoubleQuote  display "\\\"" contained
  475. syn match p6EscCloseAngle   display "\\>" contained
  476. syn match p6EscCloseFrench  display "\\┬╗" contained
  477. syn match p6EscBackTick     display "\\`" contained
  478. syn match p6EscForwardSlash display "\\/" contained
  479. syn match p6EscVerticalBar  display "\\|" contained
  480. syn match p6EscExclamation  display "\\!" contained
  481. syn match p6EscComma        display "\\," contained
  482. syn match p6EscDollar       display "\\\$" contained
  483. syn match p6EscCloseCurly   display "\\}" contained
  484. syn match p6EscCloseBracket display "\\\]" contained
  485.  
  486. " misc escapes
  487. syn match p6EscOctOld    display "\\\d\{1,3}" contained
  488. syn match p6EscNull      display "\\0\d\@!" contained
  489. syn match p6EscCodePoint display "\%(\\c\)\@<=\%(\d\|\S\|\[\)\@=" contained nextgroup=p6CodePoint
  490. syn match p6EscHex       display "\%(\\x\)\@<=\%(\x\|\[\)\@=" contained nextgroup=p6HexSequence
  491. syn match p6EscOct       display "\%(\\o\)\@<=\%(\o\|\[\)\@=" contained nextgroup=p6OctSequence
  492. syn match p6EscQQ        display "\\qq" contained nextgroup=p6QQSequence
  493. syn match p6EscOpenCurly display "\\{" contained
  494. syn match p6EscHash      display "\\#" contained
  495. syn match p6EscBackSlash display "\\\\" contained
  496.  
  497. syn region p6QQSequence
  498.     \ matchgroup=p6Escape
  499.     \ start="\["
  500.     \ skip="\[[^\]]*]"
  501.     \ end="]"
  502.     \ contained
  503.     \ transparent
  504.     \ contains=@p6Interp_qq
  505.  
  506. syn match p6CodePoint   display "\%(\d\+\|\S\)" contained
  507. syn region p6CodePoint
  508.     \ matchgroup=p6Escape
  509.     \ start="\["
  510.     \ end="]"
  511.     \ contained
  512.  
  513. syn match p6HexSequence display "\x\+" contained
  514. syn region p6HexSequence
  515.     \ matchgroup=p6Escape
  516.     \ start="\["
  517.     \ end="]"
  518.     \ contained
  519.  
  520. syn match p6OctSequence display "\o\+" contained
  521. syn region p6OctSequence
  522.     \ matchgroup=p6Escape
  523.     \ start="\["
  524.     \ end="]"
  525.     \ contained
  526.  
  527. " matches :key, :!key, :$var, :key<var>, etc
  528. " Since we don't know in advance how the adverb ends, we use a trick.
  529. " Consume nothing with the start pattern (\ze at the beginning),
  530. " while capturing the whole adverb into \z1 and then putting it before
  531. " the match start (\zs) of the end pattern.
  532. syn region p6Adverb
  533.     \ start="\ze\z(:!\?\K\%(\k\|[-']\K\@=\)*\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\?\)"
  534.     \ start="\ze\z(:!\?[@$%]\$*\%(::\|\%(\$\@<=\d\+\|!\|/\|┬ó\)\|\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\)\|\%(\K\%(\k\|[-']\K\@=\)*\)\)\)"
  535.     \ end="\z1\zs"
  536.     \ contained
  537.     \ contains=TOP
  538.     \ keepend
  539.  
  540. " <words>
  541. " FIXME: not sure how to distinguish this from the "less than" operator
  542. " in all cases. For now, it matches if any of the following is true:
  543. "
  544. " * There is whitespace missing on either side of the "<", since
  545. "   people tend to put spaces around "less than"
  546. " * It comes after "enum", "for", "any", "all", or "none"
  547. " * It's the first or last thing on a line (ignoring whitespace)
  548. " * It's preceded by "= "
  549. "
  550. " It never matches when:
  551. "
  552. " * Preceded by [<+~=] (e.g. <<foo>>, =<$foo>)
  553. " * Followed by [-=] (e.g. <--, <=, <==)
  554. syn region p6StringAngle
  555.     \ matchgroup=p6Quote
  556.     \ start="\%(\<\%(enum\|for\|any\|all\|none\)\>\s*(\?\s*\)\@<=<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!"
  557.     \ start="\%(\s\|[<+~=]\)\@<!<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!"
  558.     \ start="[<+~=]\@<!<\%(\s\|<\|=>\|[-=]\{1,2}>\@!\)\@!"
  559.     \ start="\%(^\s*\)\@<=<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!"
  560.     \ start="[<+~=]\@<!<\%(\s*$\)\@="
  561.     \ start="\%(=\s\+\)\@=<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!"
  562.     \ skip="\\\@<!\\>"
  563.     \ end=">"
  564.     \ contains=p6InnerAnglesOne,p6EscBackSlash,p6EscCloseAngle
  565.  
  566. syn region p6InnerAnglesOne
  567.     \ matchgroup=p6StringAngle
  568.     \ start="<"
  569.     \ skip="\\\@<!\\>"
  570.     \ end=">"
  571.     \ transparent
  572.     \ contained
  573.     \ contains=p6InnerAnglesOne
  574.  
  575. " <<words>>
  576. syn region p6StringAngles
  577.     \ matchgroup=p6Quote
  578.     \ start="<<=\@!"
  579.     \ skip="\\\@<!\\>"
  580.     \ end=">>"
  581.     \ contains=p6InnerAnglesTwo,@p6Interp_qq,p6Comment,p6EscHash,p6EscCloseAngle,p6Adverb,p6StringSQ,p6StringDQ
  582.  
  583. syn region p6InnerAnglesTwo
  584.     \ matchgroup=p6StringAngles
  585.     \ start="<<"
  586.     \ skip="\\\@<!\\>"
  587.     \ end=">>"
  588.     \ transparent
  589.     \ contained
  590.     \ contains=p6InnerAnglesTwo
  591.  
  592. " ┬½words┬╗
  593. syn region p6StringFrench
  594.     \ matchgroup=p6Quote
  595.     \ start="┬½"
  596.     \ skip="\\\@<!\\┬╗"
  597.     \ end="┬╗"
  598.     \ contains=p6InnerFrench,@p6Interp_qq,p6Comment,p6EscHash,p6EscCloseFrench,p6Adverb,p6StringSQ,p6StringDQ
  599.  
  600. syn region p6InnerFrench
  601.     \ matchgroup=p6StringFrench
  602.     \ start="┬½"
  603.     \ skip="\\\@<!\\┬╗"
  604.     \ end="┬╗"
  605.     \ transparent
  606.     \ contained
  607.     \ contains=p6InnerFrench
  608.  
  609. " 'string'
  610. syn region p6StringSQ
  611.     \ matchgroup=p6Quote
  612.     \ start="'"
  613.     \ skip="\\\@<!\\'"
  614.     \ end="'"
  615.     \ contains=@p6Interp_q,p6EscQuote
  616.  
  617. " "string"
  618. syn region p6StringDQ
  619.     \ matchgroup=p6Quote
  620.     \ start=+"+
  621.     \ skip=+\\\@<!\\"+
  622.     \ end=+"+
  623.     \ contains=@p6Interp_qq,p6EscDoubleQuote
  624.  
  625. " Q// and friends.
  626.  
  627. syn match p6QuoteQ display "\%([Qq]\%(ww\|to\|[qwxsahfcb]\)\?\)\>" nextgroup=p6QPairs skipwhite skipempty
  628. syn match p6QPairs contained transparent skipwhite skipempty nextgroup=p6StringQ,p6StringQ_PIR "\%(\_s*:!\?\K\%(\k\|[-']\K\@=\)*\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|┬½[^┬╗]*┬╗\|{[^}]*}\)\?\)*"
  629.  
  630. if exists("perl6_embedded_pir")
  631.     syn include @p6PIR syntax/pir.vim
  632. endif
  633.  
  634. " hardcoded set of delimiters
  635. let s:delims = [
  636.   \ ["\\\"",         "\\\"", "p6EscDoubleQuote",  "\\\\\\@<!\\\\\\\""],
  637.   \ ["'",            "'",    "p6EscQuote",        "\\\\\\@<!\\\\'"],
  638.   \ ["/",            "/",    "p6EscForwardSlash", "\\\\\\@<!\\\\/"],
  639.   \ ["`",            "`",    "p6EscBackTick",     "\\\\\\@<!\\\\`"],
  640.   \ ["|",            "|",    "p6EscVerticalBar",  "\\\\\\@<!\\\\|"],
  641.   \ ["!",            "!",    "p6EscExclamation",  "\\\\\\@<!\\\\!"],
  642.   \ [",",            ",",    "p6EscComma",        "\\\\\\@<!\\\\,"],
  643.   \ ["\\$",          "\\$",  "p6EscDollar",       "\\\\\\@<!\\\\\\$"],
  644.   \ ["{",            "}",    "p6EscCloseCurly",   "\\%(\\\\\\@<!\\\\}\\|{[^}]*}\\)"],
  645.   \ ["<",            ">",    "p6EscCloseAngle",   "\\%(\\\\\\@<!\\\\>\\|<[^>]*>\\)"],
  646.   \ ["┬½",            "┬╗",    "p6EscCloseFrench",  "\\%(\\\\\\@<!\\\\┬╗\\|┬½[^┬╗]*┬╗\\)"],
  647.   \ ["\\\[",         "]",    "p6EscCloseBracket", "\\%(\\\\\\@<!\\\\]\\|\\[^\\]]*]\\)"],
  648.   \ ["\\s\\@<=(",    ")",    "p6EscCloseParen",   "\\%(\\\\\\@<!\\\\)\\|([^)]*)\\)"],
  649. \ ]
  650.  
  651. " double and triple delimiters too
  652. if exists("perl6_extended_q") || exists("perl6_extended_all")
  653.     call add(s:delims, ["┬½┬½",           "┬╗┬╗",  "p6EscCloseFrench",  "\\%(\\\\\\@<!\\\\┬╗┬╗\\|┬½┬½\\%([^┬╗]\\|┬╗┬╗\\@!\\)*┬╗┬╗\\)"])
  654.     call add(s:delims, ["┬½┬½┬½",          "┬╗┬╗┬╗", "p6EscCloseFrench",  "\\%(\\\\\\@<!\\\\┬╗┬╗┬╗\\|┬½┬½┬½\\%([^┬╗]\\|┬╗\\%(┬╗┬╗\\)\\@!\\)*┬╗┬╗┬╗\\)"])
  655.     call add(s:delims, ["{{",           "}}",  "p6EscCloseCurly",   "\\%(\\\\\\@<!\\\\}}\\|{{\\%([^}]\\|}}\\@!\\)*}}\\)"])
  656.     call add(s:delims, ["{{{",          "}}}", "p6EscCloseCurly",   "\\%(\\\\\\@<!\\\\}}}\\|{{{\\%([^}]\\|}\\%(}}\\)\\@!\\)*}}}\\)"])
  657.     call add(s:delims, ["\\\[\\\[",     "]]",  "p6EscCloseBracket", "\\%(\\\\\\@<!\\\\]]\\|\\[\\[\\%([^\\]]\\|]]\\@!\\)*]]\\)"])
  658.     call add(s:delims, ["\\\[\\\[\\\[", "]]]", "p6EscCloseBracket", "\\%(\\\\\\@<!\\\\]]]\\|\\[\\[\\[\\%([^\\]]\\|]\\%(]]\\)\\@!\\)*]]]\\)"])
  659.     call add(s:delims, ["\\s\\@<=((",   "))",  "p6EscCloseParen",   "\\%(\\\\\\@<!\\\\))\\|((\\%([^)]\\|))\\@!\\)*))\\)"])
  660.     call add(s:delims, ["\\s\\@<=(((",  ")))", "p6EscCloseParen",   "\\%(\\\\\\@<!\\\\)))\\|(((\\%([^)]\\|)\\%())\\)\\@!\\)*)))\\)"])
  661.     call add(s:delims, ["\\s\\@<=<<",   ">>",  "p6EscCloseAngle",   "\\%(\\\\\\@<!\\\\>>\\|<<\\%([^>]\\|>>\\@!\\)*>>\\)"])
  662.     call add(s:delims, ["\\s\\@<=<<<",  ">>>", "p6EscCloseAngle",   "\\%(\\\\\\@<!\\\\>>>\\|<<<\\%([^>]\\|>\\%(>>\\)\\@!\\)*>>>\\)"])
  663. endif
  664.  
  665. if !exists("perl6_extended_q") && !exists("perl6_extended_all")
  666.     " simple version, no special highlighting within the string
  667.     for [start_delim, end_delim, end_group, skip] in s:delims
  668.         exec "syn region p6StringQ matchgroup=p6Quote start=\"".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contains=".end_group." contained"
  669.     endfor
  670.  
  671.     if exists("perl6_embedded_pir")
  672.         " highlight embedded PIR code
  673.         for [start_delim, end_delim, end_group, skip] in s:delims
  674.             exec "syn region p6StringQ_PIR matchgroup=p6Quote start=\"\\%(Q\\s*:PIR\\s*\\)\\@<=".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contains=@p6PIR,".end_group." contained"
  675.         endfor
  676.     endif
  677. else
  678.     let s:before = "syn region p6StringQ matchgroup=p6Quote start=\"\\%("
  679.     let s:after  = "\\%(\\_s*:!\\?\\K\\%(\\k\\|[-']\\K\\@=\\)*\\%(([^)]*)\\|\\[[^\\]]*]\\|<[^>]*>\\|┬½[^┬╗]*┬╗\\|{[^}]*}\\)\\?\\)*\\_s*\\)\\@<="
  680.  
  681.     let s:adverbs = [
  682.         \ ["s", "scalar"],
  683.         \ ["a", "array"],
  684.         \ ["h", "hash"],
  685.         \ ["f", "function"],
  686.         \ ["c", "closure"],
  687.         \ ["b", "backslash"],
  688.         \ ["w", "words"],
  689.         \ ["ww", "quotewords"],
  690.         \ ["x", "exec"],
  691.     \ ]
  692.  
  693.     " these can't be conjoined with q and qq (e.g. as qqq and qqqq)
  694.     let s:q_adverbs = [
  695.         \ ["q", "single"],
  696.         \ ["qq", "double"],
  697.     \ ]
  698.  
  699.     for [start_delim, end_delim, end_group, skip] in s:delims
  700.         " Q, q, and qq with any number of (ignored) adverbs
  701.         exec s:before ."Q". s:after .start_delim."\" end=\"". end_delim ."\""." contained"
  702.         exec s:before ."q". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q"." contained"
  703.         exec s:before ."qq". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq"." contained"
  704.  
  705.         for [short, long] in s:adverbs
  706.             " Qs, qs, qqs, Qa, qa, qqa, etc, with ignored adverbs
  707.             exec s:before ."Q".short. s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long." contained"
  708.             exec s:before ."q".short. s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q,@p6Interp_".long." contained"
  709.             exec s:before ."qq".short. s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq,@p6Interp_".long." contained"
  710.  
  711.             " Q, q, and qq, with one significant adverb
  712.             exec s:before ."Q\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long." contained"
  713.             for [q_short, q_long] in s:q_adverbs
  714.                 exec s:before ."Q\\s*:\\%(".q_short."\\|".q_long."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".q_long." contained"
  715.             endfor
  716.             exec s:before ."q\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q,@p6Interp_".long." contained"
  717.             exec s:before ."qq\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq,@p6Interp_".long." contained"
  718.  
  719.             for [short2, long2] in s:adverbs
  720.                 " Qs, qs, qqs, Qa, qa, qqa, etc, with one significant adverb
  721.                 exec s:before ."Q".short."\\s*:\\%(".short2."\\|".long2."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long.",@p6Interp_".long2." contained"
  722.                 for [q_short2, q_long2] in s:q_adverbs
  723.                     exec s:before ."Q".short."\\s*:\\%(".q_short2."\\|".q_long2."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long.",@p6Interp_".q_long2." contained"
  724.                 endfor
  725.                 exec s:before ."q".short."\\s*:\\%(".short2."\\|".long2."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q,@p6Interp_".long.",@p6Interp_".long2." contained"
  726.                 exec s:before ."qq".short."\\s*:\\%(".short2."\\|".long2."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq,@p6Interp_".long.",@p6Interp_".long2." contained"
  727.             endfor
  728.         endfor
  729.     endfor
  730.     unlet s:before s:after s:adverbs s:q_adverbs
  731. endif
  732. unlet s:delims
  733.  
  734. " Match these so something else above can't. E.g. the "q" in "role q { }"
  735. " should not be considered a string
  736. syn match p6Normal display "\%(\<\%(role\|grammar\|slang\)\s\+\)\@<=\K\%(\k\|[-']\K\@=\)*"
  737.  
  738. " :key
  739. syn match p6Operator display ":\@<!::\@!!\?" nextgroup=p6Key
  740. syn match p6Key display "\k\%(\k\|[-']\K\@=\)*" contained
  741.  
  742. " => and p5=> autoquoting
  743. syn match p6StringP5Auto display "\K\%(\k\|[-']\K\@=\)*\ze\s\+p5=>"
  744. syn match p6StringAuto   display "\K\%(\k\|[-']\K\@=\)*\ze\%(p5\)\@<!=>"
  745. syn match p6StringAuto   display "\K\%(\k\|[-']\K\@=\)*\ze\s\+=>"
  746. syn match p6StringAuto   display "\K\%(\k\|[-']\K\@=\)*p5\ze=>"
  747.  
  748. " Hyperoperators. Needs to come after the quoting operators (<>, ┬½┬╗, etc)
  749. exec "syn match p6HyperOp display \"┬╗"   .s:infix."┬╗\\?\""
  750. exec "syn match p6HyperOp display \"┬½\\?".s:infix."┬½\""
  751. exec "syn match p6HyperOp display \"┬╗"   .s:infix."┬½\""
  752. exec "syn match p6HyperOp display \"┬½"   .s:infix. "┬╗\""
  753.  
  754. exec "syn match p6HyperOp display \">>"          .s:infix."\\%(>>\\)\\?\""
  755. exec "syn match p6HyperOp display \"\\%(<<\\)\\?".s:infix."<<\""
  756. exec "syn match p6HyperOp display \">>"          .s:infix."<<\""
  757. exec "syn match p6HyperOp display \"<<"          .s:infix.">>\""
  758. unlet s:infix
  759.  
  760. " Regexes and grammars
  761.  
  762. syn match p6RegexName display "\%(\<\%(regex\|rule\|token\)\s\+\)\@<=\K\%(\k\|[-']\K\@=\)*" nextgroup=p6RegexBlockCrap skipwhite skipempty
  763. syn match p6RegexBlockCrap "[^{]*" nextgroup=p6RegexBlock skipwhite skipempty transparent contained
  764.  
  765. syn region p6RegexBlock
  766.     \ matchgroup=p6Normal
  767.     \ start="{"
  768.     \ end="}"
  769.     \ contained
  770.     \ contains=@p6Regexen,@p6Variables
  771.  
  772. " Perl 6 regex bits
  773.  
  774. syn cluster p6Regexen
  775.     \ add=p6RxMeta
  776.     \ add=p6RxEscape
  777.     \ add=p6EscHex
  778.     \ add=p6EscOct
  779.     \ add=p6EscNull
  780.     \ add=p6RxAnchor
  781.     \ add=p6RxCapture
  782.     \ add=p6RxGroup
  783.     \ add=p6RxAlternation
  784.     \ add=p6RxAdverb
  785.     \ add=p6RxAdverbArg
  786.     \ add=p6RxStorage
  787.     \ add=p6RxAssertion
  788.     \ add=p6RxQuoteWords
  789.     \ add=p6RxClosure
  790.     \ add=p6RxStringSQ
  791.     \ add=p6RxStringDQ
  792.     \ add=p6Comment
  793.  
  794. syn match p6RxMeta        display contained ".\%(\k\|\s\)\@<!"
  795. syn match p6RxAnchor      display contained "[$^]"
  796. syn match p6RxEscape      display contained "\\\S"
  797. syn match p6RxCapture     display contained "[()]"
  798. syn match p6RxAlternation display contained "|"
  799. syn match p6RxRange       display contained "\.\."
  800.  
  801. syn region p6RxClosure
  802.     \ matchgroup=p6Normal
  803.     \ start="{"
  804.     \ end="}"
  805.     \ contained
  806.     \ containedin=p6RxClosure
  807.     \ contains=TOP
  808. syn region p6RxGroup
  809.     \ matchgroup=p6StringSpecial2
  810.     \ start="\["
  811.     \ end="]"
  812.     \ contained
  813.     \ contains=@p6Regexen,@p6Variables
  814. syn region p6RxAssertion
  815.     \ matchgroup=p6StringSpecial2
  816.     \ start="<"
  817.     \ end=">"
  818.     \ contained
  819.     \ contains=@p6Regexen,@p6Variables,p6RxCharClass,p6RxAssertCall
  820. syn region p6RxAssertCall
  821.     \ matchgroup=p6Normal
  822.     \ start="\%(::\|\%(\K\%(\k\|[-']\K\@=\)*\)\)\@<=(\@="
  823.     \ end=")\@<="
  824.     \ contained
  825.     \ contains=TOP
  826. syn region p6RxCharClass
  827.     \ matchgroup=p6StringSpecial2
  828.     \ start="\%(<[-!+?]\?\)\@<=\["
  829.     \ skip="\\]"
  830.     \ end="]"
  831.     \ contained
  832.     \ contains=p6RxRange,p6RxEscape,p6EscHex,p6EscOct,p6EscNull
  833. syn region p6RxQuoteWords
  834.     \ matchgroup=p6StringSpecial2
  835.     \ start="< "
  836.     \ end=">"
  837.     \ contained
  838. syn region p6RxAdverb
  839.     \ start="\ze\z(:!\?\K\%(\k\|[-']\K\@=\)*\)"
  840.     \ end="\z1\zs"
  841.     \ contained
  842.     \ contains=TOP
  843.     \ keepend
  844. syn region p6RxAdverbArg
  845.     \ start="\%(:!\?\K\%(\k\|[-']\K\@=\)*\)\@<=("
  846.     \ skip="([^)]*)"
  847.     \ end=")"
  848.     \ contained
  849.     \ contains=TOP
  850. syn region p6RxStorage
  851.     \ matchgroup=p6Operator
  852.     \ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@="
  853.     \ end="$"
  854.     \ contains=TOP
  855.     \ contained
  856.  
  857. " Perl 5 regex bits
  858.  
  859. syn cluster p6RegexP5Base
  860.     \ add=p6RxP5Escape
  861.     \ add=p6RxP5Oct
  862.     \ add=p6RxP5Hex
  863.     \ add=p6RxP5EscMeta
  864.     \ add=p6RxP5CodePoint
  865.     \ add=p6RxP5Prop
  866.  
  867. " normal regex stuff
  868. syn cluster p6RegexP5
  869.     \ add=@p6RegexP5Base
  870.     \ add=p6RxP5Quantifier
  871.     \ add=p6RxP5Meta
  872.     \ add=p6RxP5QuoteMeta
  873.     \ add=p6RxP5ParenMod
  874.     \ add=p6RxP5Verb
  875.     \ add=p6RxP5Count
  876.     \ add=p6RxP5Named
  877.     \ add=p6RxP5ReadRef
  878.     \ add=p6RxP5WriteRef
  879.     \ add=p6RxP5CharClass
  880.     \ add=p6RxP5Anchor
  881.  
  882. " inside character classes
  883. syn cluster p6RegexP5Class
  884.     \ add=@p6RegexP5Base
  885.     \ add=p6RxP5Posix
  886.     \ add=p6RxP5Range
  887.  
  888. syn match p6RxP5Escape     display contained "\\\S"
  889. syn match p6RxP5CodePoint  display contained "\\c\S\@=" nextgroup=p6RxP5CPId
  890. syn match p6RxP5CPId       display contained "\S"
  891. syn match p6RxP5Oct        display contained "\\\%(\o\{1,3}\)\@=" nextgroup=p6RxP5OctSeq
  892. syn match p6RxP5OctSeq     display contained "\o\{1,3}"
  893. syn match p6RxP5Anchor     display contained "[\^$]"
  894. syn match p6RxP5Hex        display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=p6RxP5HexSeq
  895. syn match p6RxP5HexSeq     display contained "\x\{1,2}"
  896. syn region p6RxP5HexSeq
  897.     \ matchgroup=p6RxP5Escape
  898.     \ start="{"
  899.     \ end="}"
  900.     \ contained
  901. syn region p6RxP5Named
  902.     \ matchgroup=p6RxP5Escape
  903.     \ start="\%(\\N\)\@<={"
  904.     \ end="}"
  905.     \ contained
  906. syn match p6RxP5Quantifier display contained "\%([+*]\|(\@<!?\)"
  907. syn match p6RxP5ReadRef    display contained "\\[1-9]\d\@!"
  908. syn match p6RxP5ReadRef    display contained "\\k<\@=" nextgroup=p6RxP5ReadRefId
  909. syn region p6RxP5ReadRefId
  910.     \ matchgroup=p6RxP5Escape
  911.     \ start="<"
  912.     \ end=">"
  913.     \ contained
  914. syn match p6RxP5WriteRef   display contained "\\g\%(\d\|{\)\@=" nextgroup=p6RxP5WriteRefId
  915. syn match p6RxP5WriteRefId display contained "\d\+"
  916. syn region p6RxP5WriteRefId
  917.     \ matchgroup=p6RxP5Escape
  918.     \ start="{"
  919.     \ end="}"
  920.     \ contained
  921. syn match p6RxP5Prop       display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=p6RxP5PropId
  922. syn match p6RxP5PropId     display contained "\a"
  923. syn region p6RxP5PropId
  924.     \ matchgroup=p6RxP5Escape
  925.     \ start="{"
  926.     \ end="}"
  927.     \ contained
  928. syn match p6RxP5Meta       display contained "[(|).]"
  929. syn match p6RxP5ParenMod   display contained "(\@<=?\@=" nextgroup=p6RxP5Mod,p6RxP5ModName,p6RxP5Code
  930. syn match p6RxP5Mod        display contained "?\%(<\?=\|<\?!\|[#:|]\)"
  931. syn match p6RxP5Mod        display contained "?-\?[impsx]\+"
  932. syn match p6RxP5Mod        display contained "?\%([-+]\?\d\+\|R\)"
  933. syn match p6RxP5Mod        display contained "?(DEFINE)"
  934. syn match p6RxP5Mod        display contained "?\%(&\|P[>=]\)" nextgroup=p6RxP5ModDef
  935. syn match p6RxP5ModDef     display contained "\h\w*"
  936. syn region p6RxP5ModName
  937.     \ matchgroup=p6StringSpecial
  938.     \ start="?'"
  939.     \ end="'"
  940.     \ contained
  941. syn region p6RxP5ModName
  942.     \ matchgroup=p6StringSpecial
  943.     \ start="?P\?<"
  944.     \ end=">"
  945.     \ contained
  946. syn region p6RxP5Code
  947.     \ matchgroup=p6StringSpecial
  948.     \ start="??\?{"
  949.     \ end="})\@="
  950.     \ contained
  951.     \ contains=TOP
  952. syn match p6RxP5EscMeta    display contained "\\[?*.{}()[\]|\^$]"
  953. syn match p6RxP5Count      display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=p6RxP5CountId
  954. syn region p6RxP5CountId
  955.     \ matchgroup=p6RxP5Escape
  956.     \ start="{"
  957.     \ end="}"
  958.     \ contained
  959. syn match p6RxP5Verb       display contained "(\@<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)"
  960. syn region p6RxP5QuoteMeta
  961.     \ matchgroup=p6RxP5Escape
  962.     \ start="\\Q"
  963.     \ end="\\E"
  964.     \ contained
  965.     \ contains=@p6Variables,p6EscBackSlash
  966. syn region p6RxP5CharClass
  967.     \ matchgroup=p6StringSpecial
  968.     \ start="\[\^\?"
  969.     \ skip="\\]"
  970.     \ end="]"
  971.     \ contained
  972.     \ contains=@p6RegexP5Class
  973. syn region p6RxP5Posix
  974.     \ matchgroup=p6RxP5Escape
  975.     \ start="\[:"
  976.     \ end=":]"
  977.     \ contained
  978. syn match p6RxP5Range      display contained "-"
  979.  
  980. " 'string' inside a regex
  981. syn region p6RxStringSQ
  982.     \ matchgroup=p6Quote
  983.     \ start="'"
  984.     \ skip="\\\@<!\\'"
  985.     \ end="'"
  986.     \ contained
  987.     \ contains=p6EscQuote,p6EscBackSlash
  988.  
  989. " "string" inside a regex
  990. syn region p6RxStringDQ
  991.     \ matchgroup=p6Quote
  992.     \ start=+"+
  993.     \ skip=+\\\@<!\\"+
  994.     \ end=+"+
  995.     \ contained
  996.     \ contains=p6EscDoubleQuote,p6EscBackSlash
  997.  
  998. " $!, $var, $!var, $::var, $package::var $*::package::var, etc
  999. " Thus must come after the matches for the "$" regex anchor, but before
  1000. " the match for the $ regex delimiter
  1001. syn cluster p6Variables
  1002.     \ add=p6VarSlash
  1003.     \ add=p6VarExclam
  1004.     \ add=p6VarMatch
  1005.     \ add=p6VarNum
  1006.     \ add=p6Variable
  1007.  
  1008. syn match p6VarSlash     display "\$/"
  1009. syn match p6VarExclam    display "\$!"
  1010. syn match p6VarMatch     display "\$┬ó"
  1011. syn match p6VarNum       display "\$\d\+"
  1012. syn match p6Variable     display "\%(@@\|[@&$%]\$*\)\%(::\|\%(\%([.^*?=!~]\|:\@<!::\@!\)\K\)\|\K\)\@=" nextgroup=p6Twigil,p6VarName,p6PackageScope
  1013. syn match p6VarName      display "\K\%(\k\|[-']\K\@=\)*" contained
  1014. syn match p6Twigil       display "\%([.^*?=!~]\|:\@<!::\@!\)\K\@=" nextgroup=p6PackageScope,p6VarName contained
  1015. syn match p6PackageScope display "\%(\K\%(\k\|[-']\K\@=\)*\)\?::" nextgroup=p6PackageScope,p6VarName contained
  1016.  
  1017. " Perl 6 regex regions
  1018.  
  1019. " /foo/
  1020. " Below some hacks to recognise the // variant. This is virtually impossible
  1021. " to catch in all cases as the / is used in so many other ways, but these
  1022. " should be the most obvious ones.
  1023. " TODO: mostly stolen from perl.vim, might need more work
  1024. syn region p6Match
  1025.     \ matchgroup=p6Quote
  1026.     \ start="\%([$@%&*]\@<!\%(\<\%(split\|while\|until\|if\|unless\)\|\.\.\|[-+*!~(\[{=]\)\s*\)\@<=//\@!"
  1027.     \ start="^//\@!"
  1028.     \ start=+\s\@<=/[^[:space:][:digit:]$@%=]\@=\%(/\_s*\%([([{$@%&*[:digit:]"'`]\|\_s\w\|[[:upper:]_abd-fhjklnqrt-wyz]\)\)\@!/\@!+
  1029.     \ skip="\\/"
  1030.     \ end="/"
  1031.     \ contains=@p6Regexen,p6Variable,p6VarExclam,p6VarMatch,p6VarNum
  1032.  
  1033. " m/foo/, mm/foo/, rx/foo/
  1034. syn region p6Match
  1035.     \ matchgroup=p6Quote
  1036.     \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=//\@!"
  1037.     \ skip="\\/"
  1038.     \ end="/"
  1039.     \ keepend
  1040.     \ contains=@p6Regexen,p6Variable,p6VarExclam,p6VarMatch,p6VarNum
  1041.  
  1042. " m!foo!, mm!foo!, rx!foo!
  1043. syn region p6Match
  1044.     \ matchgroup=p6Quote
  1045.     \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=!!\@!"
  1046.     \ skip="\\!"
  1047.     \ end="!"
  1048.     \ keepend
  1049.     \ contains=@p6Regexen,p6Variable,p6VarSlash,p6VarMatch,p6VarNum
  1050.  
  1051. " m$foo$, mm$foo$, rx$foo$, m|foo|, mm|foo|, rx|foo|, etc
  1052. syn region p6Match
  1053.     \ matchgroup=p6Quote
  1054.     \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\z([\"'`|,$]\)\$\@!"
  1055.     \ skip="\\\z1"
  1056.     \ end="\z1"
  1057.     \ keepend
  1058.     \ contains=@p6Regexen,@p6Variables
  1059.  
  1060. " m (foo), mm (foo), rx (foo)
  1061. syn region p6Match
  1062.     \ matchgroup=p6Quote
  1063.     \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s\+\)\@<=()\@!)\@!"
  1064.     \ skip="\\)"
  1065.     \ end=")"
  1066.     \ contains=@p6Regexen,@p6Variables
  1067.  
  1068. " m[foo], mm[foo], rx[foo]
  1069. syn region p6Match
  1070.     \ matchgroup=p6Quote
  1071.     \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\[]\@!]\@!"
  1072.     \ skip="\\]"
  1073.     \ end="]"
  1074.     \ contains=@p6Regexen,@p6Variables
  1075.  
  1076. " m{foo}, mm{foo}, rx{foo}
  1077. syn region p6Match
  1078.     \ matchgroup=p6Quote
  1079.     \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<={}\@!}\@!"
  1080.     \ skip="\\}"
  1081.     \ end="}"
  1082.     \ contains=@p6Regexen,@p6Variables
  1083.  
  1084. " m<foo>, mm<foo>, rx<foo>
  1085. syn region p6Match
  1086.     \ matchgroup=p6Quote
  1087.     \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=<>\@!>\@!"
  1088.     \ skip="\\>"
  1089.     \ end=">"
  1090.     \ contains=@p6Regexen,@p6Variables
  1091.  
  1092. " m┬½foo┬╗, mm┬½foo┬╗, rx┬½foo┬╗
  1093. syn region p6Match
  1094.     \ matchgroup=p6Quote
  1095.     \ start="\%(\<\%(mm\?\|rx\)\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=┬½┬╗\@!┬╗\@!"
  1096.     \ skip="\\┬╗"
  1097.     \ end="┬╗"
  1098.     \ contains=@p6Regexen,@p6Variables
  1099.  
  1100. " Substitutions
  1101.  
  1102. " s/foo/bar/
  1103. syn region p6Match
  1104.     \ matchgroup=p6Quote
  1105.     \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=/"
  1106.     \ skip="\\/"
  1107.     \ end="/"me=e-1
  1108.     \ keepend
  1109.     \ contains=@p6Regexen,p6Variable,p6VarExclam,p6VarMatch,p6VarNum
  1110.     \ nextgroup=p6Substitution
  1111.  
  1112. syn region p6Substitution
  1113.     \ matchgroup=p6Quote
  1114.     \ start="/"
  1115.     \ skip="\\/"
  1116.     \ end="/"
  1117.     \ contained
  1118.     \ keepend
  1119.     \ contains=@p6Interp_qq
  1120.  
  1121. " s!foo!bar!
  1122. syn region p6Match
  1123.     \ matchgroup=p6Quote
  1124.     \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=!"
  1125.     \ skip="\\!"
  1126.     \ end="!"me=e-1
  1127.     \ keepend
  1128.     \ contains=@p6Regexen,p6Variable,p6VarSlash,p6VarMatch,p6VarNum
  1129.     \ nextgroup=p6Substitution
  1130.  
  1131. syn region p6Substitution
  1132.     \ matchgroup=p6Quote
  1133.     \ start="!"
  1134.     \ skip="\\!"
  1135.     \ end="!"
  1136.     \ contained
  1137.     \ keepend
  1138.     \ contains=@p6Interp_qq
  1139.  
  1140. " s$foo$bar$, s|foo|bar, etc
  1141. syn region p6Match
  1142.     \ matchgroup=p6Quote
  1143.     \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\z([\"'`|,$]\)"
  1144.     \ skip="\\\z1"
  1145.     \ end="\z1"me=e-1
  1146.     \ keepend
  1147.     \ contains=@p6Regexen,@p6Variables
  1148.     \ nextgroup=p6Substitution
  1149.  
  1150. syn region p6Substitution
  1151.     \ matchgroup=p6Quote
  1152.     \ start="\z([\"'`|,$]\)"
  1153.     \ skip="\\\z1"
  1154.     \ end="\z1"
  1155.     \ contained
  1156.     \ keepend
  1157.     \ contains=@p6Interp_qq
  1158.  
  1159. " s{foo}
  1160. syn region p6Match
  1161.     \ matchgroup=p6Quote
  1162.     \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<={}\@!"
  1163.     \ skip="\\}"
  1164.     \ end="}"
  1165.     \ contains=@p6Regexen,@p6Variables
  1166.  
  1167. " s[foo]
  1168. syn region p6Match
  1169.     \ matchgroup=p6Quote
  1170.     \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\[]\@!"
  1171.     \ skip="\\]"
  1172.     \ end="]"
  1173.     \ contains=@p6Regexen,@p6Variables
  1174.  
  1175. " s<foo>
  1176. syn region p6Match
  1177.     \ matchgroup=p6Quote
  1178.     \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=<>\@!"
  1179.     \ skip="\\>"
  1180.     \ end=">"
  1181.     \ contains=@p6Regexen,@p6Variables
  1182.  
  1183. " s┬½foo┬╗
  1184. syn region p6Match
  1185.     \ matchgroup=p6Quote
  1186.     \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=┬½┬╗\@!"
  1187.     \ skip="\\┬╗"
  1188.     \ end="┬╗"
  1189.     \ contains=@p6Regexen,@p6Variables
  1190.  
  1191. " s (foo)
  1192. syn region p6Match
  1193.     \ matchgroup=p6Quote
  1194.     \ start="\%(\<s\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s\+\)\@<=()\@!"
  1195.     \ skip="\\)"
  1196.     \ end=")"
  1197.     \ contains=@p6Regexen,@p6Variables
  1198.  
  1199. " Perl 5 regex regions
  1200.  
  1201. " m:P5//
  1202. syn region p6Match
  1203.     \ matchgroup=p6Quote
  1204.     \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=/"
  1205.     \ skip="\\/"
  1206.     \ end="/"
  1207.     \ contains=@p6RegexP5,p6Variable,p6VarExclam,p6VarMatch,p6VarNum
  1208.  
  1209. " m:P5!!
  1210. syn region p6Match
  1211.     \ matchgroup=p6Quote
  1212.     \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=!"
  1213.     \ skip="\\!"
  1214.     \ end="!"
  1215.     \ contains=@p6RegexP5,p6Variable,p6VarSlash,p6VarMatch,p6VarNum
  1216.  
  1217. " m:P5$$, m:P5||, etc
  1218. syn region p6Match
  1219.     \ matchgroup=p6Quote
  1220.     \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=\z([\"'`|,$]\)"
  1221.     \ skip="\\\z1"
  1222.     \ end="\z1"
  1223.     \ contains=@p6RegexP5,@p6Variables
  1224.  
  1225. " m:P5 ()
  1226. syn region p6Match
  1227.     \ matchgroup=p6Quote
  1228.     \ start="\%(\<m\s*:P\%(erl\)\?5\s\+\)\@<=()\@!"
  1229.     \ skip="\\)"
  1230.     \ end=")"
  1231.     \ contains=@p6RegexP5,@p6Variables
  1232.  
  1233. " m:P5[]
  1234. syn region p6Match
  1235.     \ matchgroup=p6Quote
  1236.     \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=[]\@!"
  1237.     \ skip="\\]"
  1238.     \ end="]"
  1239.     \ contains=@p6RegexP5,@p6Variables
  1240.  
  1241. " m:P5{}
  1242. syn region p6Match
  1243.     \ matchgroup=p6Quote
  1244.     \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<={}\@!"
  1245.     \ skip="\\}"
  1246.     \ end="}"
  1247.     \ contains=@p6RegexP5,p6Variables
  1248.  
  1249. " m:P5<>
  1250. syn region p6Match
  1251.     \ matchgroup=p6Quote
  1252.     \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=<>\@!"
  1253.     \ skip="\\>"
  1254.     \ end=">"
  1255.     \ contains=@p6RegexP5,p6Variables
  1256.  
  1257. " m:P5┬½┬╗
  1258. syn region p6Match
  1259.     \ matchgroup=p6Quote
  1260.     \ start="\%(\<m\s*:P\%(erl\)\?5\s*\)\@<=┬½┬╗\@!"
  1261.     \ skip="\\┬╗"
  1262.     \ end="┬╗"
  1263.     \ contains=@p6RegexP5,p6Variables
  1264.  
  1265. " Transliteration
  1266.  
  1267. " tr/foo/bar/, tr|foo|bar, etc
  1268. syn region p6String
  1269.     \ matchgroup=p6Quote
  1270.     \ start="\%(\<tr\%(\s*:!\?\k\%(\k\|[-']\K\@=\)*\%(([^)]*)\)\?\)*\s*\)\@<=\z([/\"'`|!,$]\)"
  1271.     \ skip="\\\z1"
  1272.     \ end="\z1"me=e-1
  1273.     \ contains=p6RxRange
  1274.     \ nextgroup=p6Transliteration
  1275.  
  1276. syn region p6Transliteration
  1277.     \ matchgroup=p6Quote
  1278.     \ start="\z([/\"'`|!,$]\)"
  1279.     \ skip="\\\z1"
  1280.     \ end="\z1"
  1281.     \ contained
  1282.     \ contains=@p6Interp_qq
  1283.  
  1284. " Comments
  1285.  
  1286. " normal end-of-line comment
  1287. syn match p6Comment display "#.*" contains=p6Attention
  1288.  
  1289. " Multiline comments. Arbitrary numbers of opening brackets are allowed,
  1290. " but we only define regions for 1 to 3
  1291. syn region p6Comment
  1292.     \ matchgroup=p6Comment
  1293.     \ start="^\@<!#("
  1294.     \ skip="([^)]*)"
  1295.     \ end=")"
  1296.     \ matchgroup=p6Error
  1297.     \ start="^#("
  1298.     \ contains=p6Attention,p6Comment
  1299. syn region p6Comment
  1300.     \ matchgroup=p6Comment
  1301.     \ start="^\@<!#\["
  1302.     \ skip="\[[^\]]*]"
  1303.     \ end="]"
  1304.     \ matchgroup=p6Error
  1305.     \ start="^#\["
  1306.     \ contains=p6Attention,p6Comment
  1307. syn region p6Comment
  1308.     \ matchgroup=p6Comment
  1309.     \ start="^\@<!#{"
  1310.     \ skip="{[^}]*}"
  1311.     \ end="}"
  1312.     \ matchgroup=p6Error
  1313.     \ start="^#{"
  1314.     \ contains=p6Attention,p6Comment
  1315. syn region p6Comment
  1316.     \ matchgroup=p6Comment
  1317.     \ start="^\@<!#<"
  1318.     \ skip="<[^>]*>"
  1319.     \ end=">"
  1320.     \ matchgroup=p6Error
  1321.     \ start="^#<"
  1322.     \ contains=p6Attention,p6Comment
  1323. syn region p6Comment
  1324.     \ matchgroup=p6Comment
  1325.     \ start="^\@<!#┬½"
  1326.     \ skip="┬½[^┬╗]*┬╗"
  1327.     \ end="┬╗"
  1328.     \ matchgroup=p6Error
  1329.     \ start="^#┬½"
  1330.     \ contains=p6Attention,p6Comment
  1331.  
  1332. " double and triple delimiters
  1333. if exists("perl6_extended_comments") || exists("perl6_extended_all")
  1334.     syn region p6Comment
  1335.         \ matchgroup=p6Comment
  1336.         \ start="^\@<!#(("
  1337.         \ skip="((\%([^)\|))\@!]\)*))"
  1338.         \ end="))"
  1339.         \ matchgroup=p6Error
  1340.         \ start="^#(("
  1341.         \ contains=p6Attention,p6Comment
  1342.     syn region p6Comment
  1343.         \ matchgroup=p6Comment
  1344.         \ start="^\@<!#((("
  1345.         \ skip="(((\%([^)]\|)\%())\)\@!\)*)))"
  1346.         \ end=")))"
  1347.         \ matchgroup=p6Error
  1348.         \ start="^#((("
  1349.         \ contains=p6Attention,p6Comment
  1350.  
  1351.     syn region p6Comment
  1352.         \ matchgroup=p6Comment
  1353.         \ start="^\@<!#\[\["
  1354.         \ skip="\[\[\%([^\]]\|]]\@!\)*]]"
  1355.         \ end="]]"
  1356.         \ matchgroup=p6Error
  1357.         \ start="^#\[\["
  1358.         \ contains=p6Attention,p6Comment
  1359.     syn region p6Comment
  1360.         \ matchgroup=p6Comment
  1361.         \ start="^\@<!#\[\[\["
  1362.         \ skip="\[\[\[\%([^\]]\|]\%(]]\)\@!\)*]]]"
  1363.         \ end="]]]"
  1364.         \ matchgroup=p6Error
  1365.         \ start="^#\[\[\["
  1366.         \ contains=p6Attention,p6Comment
  1367.  
  1368.     syn region p6Comment
  1369.         \ matchgroup=p6Comment
  1370.         \ start="^\@<!#{{"
  1371.         \ skip="{{\%([^}]\|}}\@!\)*}}"
  1372.         \ end="}}"
  1373.         \ matchgroup=p6Error
  1374.         \ start="^#{{"
  1375.         \ contains=p6Attention,p6Comment
  1376.     syn region p6Comment
  1377.         \ matchgroup=p6Comment
  1378.         \ start="^\@<!#{{{"
  1379.         \ skip="{{{\%([^}]\|}\%(}}\)\@!\)*}}}"
  1380.         \ end="}}}"
  1381.         \ matchgroup=p6Error
  1382.         \ start="^#{{{"
  1383.         \ contains=p6Attention,p6Comment
  1384.  
  1385.     syn region p6Comment
  1386.         \ matchgroup=p6Comment
  1387.         \ start="^\@<!#<<"
  1388.         \ skip="<<\%([^>]\|>>\@!\)*>>"
  1389.         \ end=">>"
  1390.         \ matchgroup=p6Error
  1391.         \ start="^#<<"
  1392.         \ contains=p6Attention,p6Comment
  1393.     syn region p6Comment
  1394.         \ matchgroup=p6Comment
  1395.         \ start="^\@<!#<<<"
  1396.         \ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>"
  1397.         \ end=">>>"
  1398.         \ matchgroup=p6Error
  1399.         \ start="^#<<<"
  1400.         \ contains=p6Attention,p6Comment
  1401.  
  1402.     syn region p6Comment
  1403.         \ matchgroup=p6Comment
  1404.         \ start="^\@<!#┬½┬½"
  1405.         \ skip="┬½┬½\%([^┬╗]\|┬╗┬╗\@!\)*┬╗┬╗"
  1406.         \ end="┬╗┬╗"
  1407.         \ matchgroup=p6Error
  1408.         \ start="^#┬½┬½"
  1409.         \ contains=p6Attention,p6Comment
  1410.     syn region p6Comment
  1411.         \ matchgroup=p6Comment
  1412.         \ start="^\@<!#┬½┬½┬½"
  1413.         \ skip="┬½┬½┬½\%([^┬╗]\|┬╗\%(┬╗┬╗\)\@!\)*┬╗┬╗┬╗"
  1414.         \ end="┬╗┬╗┬╗"
  1415.         \ matchgroup=p6Error
  1416.         \ start="^#┬½┬½┬½"
  1417.         \ contains=p6Attention,p6Comment
  1418. endif
  1419.  
  1420. " Pod
  1421.  
  1422. " Abbreviated blocks (implicit code forbidden)
  1423. syn region p6PodAbbrRegion
  1424.     \ matchgroup=p6PodPrefix
  1425.     \ start="^=\ze\K\k*"
  1426.     \ end="^\ze\%(\s*$\|=\K\)"
  1427.     \ contains=p6PodAbbrNoCodeType
  1428.     \ keepend
  1429.  
  1430. syn region p6PodAbbrNoCodeType
  1431.     \ matchgroup=p6PodType
  1432.     \ start="\K\k*"
  1433.     \ end="^\ze\%(\s*$\|=\K\)"
  1434.     \ contained
  1435.     \ contains=p6PodName,p6PodAbbrNoCode
  1436.  
  1437. syn match p6PodName contained ".\+" contains=@p6PodFormat
  1438. syn match p6PodComment contained ".\+"
  1439.  
  1440. syn region p6PodAbbrNoCode
  1441.     \ start="^"
  1442.     \ end="^\ze\%(\s*$\|=\K\)"
  1443.     \ contained
  1444.     \ contains=@p6PodFormat
  1445.  
  1446. " Abbreviated blocks (everything is code)
  1447. syn region p6PodAbbrRegion
  1448.     \ matchgroup=p6PodPrefix
  1449.     \ start="^=\zecode\>"
  1450.     \ end="^\ze\%(\s*$\|=\K\)"
  1451.     \ contains=p6PodAbbrCodeType
  1452.     \ keepend
  1453.  
  1454. syn region p6PodAbbrCodeType
  1455.     \ matchgroup=p6PodType
  1456.     \ start="\K\k*"
  1457.     \ end="^\ze\%(\s*$\|=\K\)"
  1458.     \ contained
  1459.     \ contains=p6PodName,p6PodAbbrCode
  1460.  
  1461. syn region p6PodAbbrCode
  1462.     \ start="^"
  1463.     \ end="^\ze\%(\s*$\|=\K\)"
  1464.     \ contained
  1465.  
  1466. " Abbreviated blocks (everything is a comment)
  1467. syn region p6PodAbbrRegion
  1468.     \ matchgroup=p6PodPrefix
  1469.     \ start="^=\zecomment\>"
  1470.     \ end="^\ze\%(\s*$\|=\K\)"
  1471.     \ contains=p6PodAbbrCommentType
  1472.     \ keepend
  1473.  
  1474. syn region p6PodAbbrCommentType
  1475.     \ matchgroup=p6PodType
  1476.     \ start="\K\k*"
  1477.     \ end="^\ze\%(\s*$\|=\K\)"
  1478.     \ contained
  1479.     \ contains=p6PodComment,p6PodAbbrNoCode
  1480.  
  1481. " Abbreviated blocks (implicit code allowed)
  1482. syn region p6PodAbbrRegion
  1483.     \ matchgroup=p6PodPrefix
  1484.     \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>"
  1485.     \ end="^\ze\%(\s*$\|=\K\)"
  1486.     \ contains=p6PodAbbrType
  1487.     \ keepend
  1488.  
  1489. syn region p6PodAbbrType
  1490.     \ matchgroup=p6PodType
  1491.     \ start="\K\k*"
  1492.     \ end="^\ze\%(\s*$\|=\K\)"
  1493.     \ contained
  1494.     \ contains=p6PodName,p6PodAbbr
  1495.  
  1496. syn region p6PodAbbr
  1497.     \ start="^"
  1498.     \ end="^\ze\%(\s*$\|=\K\)"
  1499.     \ contained
  1500.     \ contains=@p6PodFormat,p6PodImplicitCode
  1501.  
  1502. " Abbreviated block to end-of-file
  1503. syn region p6PodAbbrRegion
  1504.     \ matchgroup=p6PodPrefix
  1505.     \ start="^=\zeEND\>"
  1506.     \ end="\%$"
  1507.     \ contains=p6PodAbbrEOFType
  1508.     \ keepend
  1509.  
  1510. syn region p6PodAbbrEOFType
  1511.     \ matchgroup=p6PodType
  1512.     \ start="\K\k*"
  1513.     \ end="\%$"
  1514.     \ contained
  1515.     \ contains=p6PodName,p6PodAbbrEOF
  1516.  
  1517. syn region p6PodAbbrEOF
  1518.     \ start="^"
  1519.     \ end="\%$"
  1520.     \ contained
  1521.     \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode
  1522.  
  1523. " Directives
  1524. syn region p6PodDirectRegion
  1525.     \ matchgroup=p6PodPrefix
  1526.     \ start="^=\%(config\|use\)\>"
  1527.     \ end="^\ze\%([^=]\|=\K\|\s*$\)"
  1528.     \ contains=p6PodDirectArgRegion
  1529.     \ keepend
  1530.  
  1531. syn region p6PodDirectArgRegion
  1532.     \ matchgroup=p6PodType
  1533.     \ start="\S\+"
  1534.     \ end="^\ze\%([^=]\|=\K\|\s*$\)"
  1535.     \ contained
  1536.     \ contains=p6PodDirectConfigRegion
  1537.  
  1538. syn region p6PodDirectConfigRegion
  1539.     \ start=""
  1540.     \ end="^\ze\%([^=]\|=\K\|\s*$\)"
  1541.     \ contained
  1542.     \ contains=@p6PodConfig
  1543.  
  1544. " =encoding is a special directive
  1545. syn region p6PodDirectRegion
  1546.     \ matchgroup=p6PodPrefix
  1547.     \ start="^=encoding\>"
  1548.     \ end="^\ze\%([^=]\|=\K\|\s*$\)"
  1549.     \ contains=p6PodEncodingArgRegion
  1550.     \ keepend
  1551.  
  1552. syn region p6PodEncodingArgRegion
  1553.     \ matchgroup=p6PodName
  1554.     \ start="\S\+"
  1555.     \ end="^\ze\%([^=]\|=\K\|\s*$\)"
  1556.     \ contained
  1557.  
  1558. " Paragraph blocks (implicit code forbidden)
  1559. syn region p6PodParaRegion
  1560.     \ matchgroup=p6PodPrefix
  1561.     \ start="^=for\>"
  1562.     \ end="^\ze\%(\s*$\|=\K\)"
  1563.     \ contains=p6PodParaNoCodeTypeRegion
  1564.     \ keepend
  1565.     \ extend
  1566.  
  1567. syn region p6PodParaNoCodeTypeRegion
  1568.     \ matchgroup=p6PodType
  1569.     \ start="\K\k*"
  1570.     \ end="^\ze\%(\s*$\|=\K\)"
  1571.     \ contained
  1572.     \ contains=p6PodParaNoCode,p6PodParaConfigRegion
  1573.  
  1574. syn region p6PodParaConfigRegion
  1575.     \ start=""
  1576.     \ end="^\ze\%([^=]\|=\k\@<!\)"
  1577.     \ contained
  1578.     \ contains=@p6PodConfig
  1579.  
  1580. syn region p6PodParaNoCode
  1581.     \ start="^[^=]"
  1582.     \ end="^\ze\%(\s*$\|=\K\)"
  1583.     \ contained
  1584.     \ contains=@p6PodFormat
  1585.  
  1586. " Paragraph blocks (everything is code)
  1587. syn region p6PodParaRegion
  1588.     \ matchgroup=p6PodPrefix
  1589.     \ start="^=for\>\ze\s*code\>"
  1590.     \ end="^\ze\%(\s*$\|=\K\)"
  1591.     \ contains=p6PodParaCodeTypeRegion
  1592.     \ keepend
  1593.     \ extend
  1594.  
  1595. syn region p6PodParaCodeTypeRegion
  1596.     \ matchgroup=p6PodType
  1597.     \ start="\K\k*"
  1598.     \ end="^\ze\%(\s*$\|=\K\)"
  1599.     \ contained
  1600.     \ contains=p6PodParaCode,p6PodParaConfigRegion
  1601.  
  1602. syn region p6PodParaCode
  1603.     \ start="^[^=]"
  1604.     \ end="^\ze\%(\s*$\|=\K\)"
  1605.     \ contained
  1606.  
  1607. " Paragraph blocks (implicit code allowed)
  1608. syn region p6PodParaRegion
  1609.     \ matchgroup=p6PodPrefix
  1610.     \ start="^=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
  1611.     \ end="^\ze\%(\s*$\|=\K\)"
  1612.     \ contains=p6PodParaTypeRegion
  1613.     \ keepend
  1614.     \ extend
  1615.  
  1616. syn region p6PodParaTypeRegion
  1617.     \ matchgroup=p6PodType
  1618.     \ start="\K\k*"
  1619.     \ end="^\ze\%(\s*$\|=\K\)"
  1620.     \ contained
  1621.     \ contains=p6PodPara,p6PodParaConfigRegion
  1622.  
  1623. syn region p6PodPara
  1624.     \ start="^[^=]"
  1625.     \ end="^\ze\%(\s*$\|=\K\)"
  1626.     \ contained
  1627.     \ contains=@p6PodFormat,p6PodImplicitCode
  1628.  
  1629. " Paragraph block to end-of-file
  1630. syn region p6PodParaRegion
  1631.     \ matchgroup=p6PodPrefix
  1632.     \ start="^=for\>\ze\s\+END\>"
  1633.     \ end="\%$"
  1634.     \ contains=p6PodParaEOFTypeRegion
  1635.     \ keepend
  1636.     \ extend
  1637.  
  1638. syn region p6PodParaEOFTypeRegion
  1639.     \ matchgroup=p6PodType
  1640.     \ start="\K\k*"
  1641.     \ end="\%$"
  1642.     \ contained
  1643.     \ contains=p6PodParaEOF,p6PodParaConfigRegion
  1644.  
  1645. syn region p6PodParaEOF
  1646.     \ start="^[^=]"
  1647.     \ end="\%$"
  1648.     \ contained
  1649.     \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode
  1650.  
  1651. " Delimited blocks (implicit code forbidden)
  1652. syn region p6PodDelimRegion
  1653.     \ matchgroup=p6PodPrefix
  1654.     \ start="^=begin\>"
  1655.     \ end="^=end\>"
  1656.     \ contains=p6PodDelimNoCodeTypeRegion
  1657.     \ keepend
  1658.     \ extend
  1659.  
  1660. syn region p6PodDelimNoCodeTypeRegion
  1661.     \ matchgroup=p6PodType
  1662.     \ start="\K\k*"
  1663.     \ end="^\ze=end\>"
  1664.     \ contained
  1665.     \ contains=p6PodDelimNoCode,p6PodDelimConfigRegion
  1666.  
  1667. syn region p6PodDelimConfigRegion
  1668.     \ start=""
  1669.     \ end="^\ze\%([^=]\|=\K\|\s*$\)"
  1670.     \ contained
  1671.     \ contains=@p6PodConfig
  1672.  
  1673. syn region p6PodDelimNoCode
  1674.     \ start="^"
  1675.     \ end="^\ze=end\>"
  1676.     \ contained
  1677.     \ contains=@p6PodNestedBlocks,@p6PodFormat
  1678.  
  1679. " Delimited blocks (everything is code)
  1680. syn region p6PodDelimRegion
  1681.     \ matchgroup=p6PodPrefix
  1682.     \ start="^=begin\>\ze\s*code\>"
  1683.     \ end="^=end\>"
  1684.     \ contains=p6PodDelimCodeTypeRegion
  1685.     \ keepend
  1686.     \ extend
  1687.  
  1688. syn region p6PodDelimCodeTypeRegion
  1689.     \ matchgroup=p6PodType
  1690.     \ start="\K\k*"
  1691.     \ end="^\ze=end\>"
  1692.     \ contained
  1693.     \ contains=p6PodDelimCode,p6PodDelimConfigRegion
  1694.  
  1695. syn region p6PodDelimCode
  1696.     \ start="^"
  1697.     \ end="^\ze=end\>"
  1698.     \ contained
  1699.     \ contains=@p6PodNestedBlocks
  1700.  
  1701. " Delimited blocks (implicit code allowed)
  1702. syn region p6PodDelimRegion
  1703.     \ matchgroup=p6PodPrefix
  1704.     \ start="^=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
  1705.     \ end="^=end\>"
  1706.     \ contains=p6PodDelimTypeRegion
  1707.     \ keepend
  1708.     \ extend
  1709.  
  1710. syn region p6PodDelimTypeRegion
  1711.     \ matchgroup=p6PodType
  1712.     \ start="\K\k*"
  1713.     \ end="^\ze=end\>"
  1714.     \ contained
  1715.     \ contains=p6PodDelim,p6PodDelimConfigRegion
  1716.  
  1717. syn region p6PodDelim
  1718.     \ start="^"
  1719.     \ end="^\ze=end\>"
  1720.     \ contained
  1721.     \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode
  1722.  
  1723. " Delimited block to end-of-file
  1724. syn region p6PodDelimRegion
  1725.     \ matchgroup=p6PodPrefix
  1726.     \ start="^=begin\>\ze\s\+END\>"
  1727.     \ end="\%$"
  1728.     \ contains=p6PodDelimEOFTypeRegion
  1729.     \ extend
  1730.  
  1731. syn region p6PodDelimEOFTypeRegion
  1732.     \ matchgroup=p6PodType
  1733.     \ start="\K\k*"
  1734.     \ end="\%$"
  1735.     \ contained
  1736.     \ contains=p6PodDelimEOF,p6PodDelimConfigRegion
  1737.  
  1738. syn region p6PodDelimEOF
  1739.     \ start="^"
  1740.     \ end="\%$"
  1741.     \ contained
  1742.     \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode
  1743.  
  1744. syn cluster p6PodConfig
  1745.     \ add=p6PodConfigOperator
  1746.     \ add=p6PodExtraConfig
  1747.     \ add=p6StringAuto
  1748.     \ add=p6PodAutoQuote
  1749.     \ add=p6StringSQ
  1750.  
  1751. syn region p6PodParens
  1752.     \ start="("
  1753.     \ end=")"
  1754.     \ contained
  1755.     \ contains=p6Number,p6StringSQ
  1756.  
  1757. syn match p6PodAutoQuote      display contained "=>"
  1758. syn match p6PodConfigOperator display contained ":!\?" nextgroup=p6PodConfigOption
  1759. syn match p6PodConfigOption   display contained "[^[:space:](<]\+" nextgroup=p6PodParens,p6StringAngle
  1760. syn match p6PodExtraConfig    display contained "^="
  1761. syn match p6PodVerticalBar    display contained "|"
  1762. syn match p6PodColon          display contained ":"
  1763. syn match p6PodSemicolon      display contained ";"
  1764. syn match p6PodComma          display contained ","
  1765. syn match p6PodImplicitCode   display contained "^\s.*"
  1766.  
  1767. syn region p6PodDelimEndRegion
  1768.     \ matchgroup=p6PodType
  1769.     \ start="\%(^=end\>\)\@<="
  1770.     \ end="\K\k*"
  1771.  
  1772. " These may appear inside delimited blocks
  1773. syn cluster p6PodNestedBlocks
  1774.     \ add=p6PodAbbrRegion
  1775.     \ add=p6PodDirectRegion
  1776.     \ add=p6PodParaRegion
  1777.     \ add=p6PodDelimRegion
  1778.     \ add=p6PodDelimEndRegion
  1779.  
  1780. " Pod formatting codes
  1781.  
  1782. syn cluster p6PodFormat
  1783.     \ add=p6PodFormatOne
  1784.     \ add=p6PodFormatTwo
  1785.     \ add=p6PodFormatThree
  1786.     \ add=p6PodFormatFrench
  1787.  
  1788. " Balanced angles found inside formatting codes. Ensures proper nesting.
  1789.  
  1790. syn region p6PodFormatAnglesOne
  1791.     \ matchgroup=p6PodFormat
  1792.     \ start="<"
  1793.     \ skip="<[^>]*>"
  1794.     \ end=">"
  1795.     \ transparent
  1796.     \ contained
  1797.     \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne
  1798.  
  1799. syn region p6PodFormatAnglesTwo
  1800.     \ matchgroup=p6PodFormat
  1801.     \ start="<<"
  1802.     \ skip="<<[^>]*>>"
  1803.     \ end=">>"
  1804.     \ transparent
  1805.     \ contained
  1806.     \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo
  1807.  
  1808. syn region p6PodFormatAnglesThree
  1809.     \ matchgroup=p6PodFormat
  1810.     \ start="<<<"
  1811.     \ skip="<<<[^>]*>>>"
  1812.     \ end=">>>"
  1813.     \ transparent
  1814.     \ contained
  1815.     \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo,p6PodFormatAnglesThree
  1816.  
  1817. syn region p6PodFormatAnglesFrench
  1818.     \ matchgroup=p6PodFormat
  1819.     \ start="┬½"
  1820.     \ skip="┬½[^┬╗]*┬╗"
  1821.     \ end="┬╗"
  1822.     \ transparent
  1823.     \ contained
  1824.     \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo,p6PodFormatAnglesThree
  1825.  
  1826. " All formatting codes
  1827.  
  1828. syn region p6PodFormatOne
  1829.     \ matchgroup=p6PodFormatCode
  1830.     \ start="\u<"
  1831.     \ skip="<[^>]*>"
  1832.     \ end=">"
  1833.     \ contained
  1834.     \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne
  1835.  
  1836. syn region p6PodFormatTwo
  1837.     \ matchgroup=p6PodFormatCode
  1838.     \ start="\u<<"
  1839.     \ skip="<<[^>]*>>"
  1840.     \ end=">>"
  1841.     \ contained
  1842.     \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo
  1843.  
  1844. syn region p6PodFormatThree
  1845.     \ matchgroup=p6PodFormatCode
  1846.     \ start="\u<<<"
  1847.     \ skip="<<<[^>]*>>>"
  1848.     \ end=">>>"
  1849.     \ contained
  1850.     \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree
  1851.  
  1852. syn region p6PodFormatFrench
  1853.     \ matchgroup=p6PodFormatCode
  1854.     \ start="\u┬½"
  1855.     \ skip="┬½[^┬╗]*┬╗"
  1856.     \ end="┬╗"
  1857.     \ contained
  1858.     \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree
  1859.  
  1860. " C<> and V<> don't allow nested formatting formatting codes
  1861.  
  1862. syn region p6PodFormatOne
  1863.     \ matchgroup=p6PodFormatCode
  1864.     \ start="[CV]<"
  1865.     \ skip="<[^>]*>"
  1866.     \ end=">"
  1867.     \ contained
  1868.     \ contains=p6PodFormatAnglesOne
  1869.  
  1870. syn region p6PodFormatTwo
  1871.     \ matchgroup=p6PodFormatCode
  1872.     \ start="[CV]<<"
  1873.     \ skip="<<[^>]*>>"
  1874.     \ end=">>"
  1875.     \ contained
  1876.     \ contains=p6PodFormatAnglesTwo
  1877.  
  1878. syn region p6PodFormatThree
  1879.     \ matchgroup=p6PodFormatCode
  1880.     \ start="[CV]<<<"
  1881.     \ skip="<<<[^>]*>>>"
  1882.     \ end=">>>"
  1883.     \ contained
  1884.     \ contains=p6PodFormatAnglesThree
  1885.  
  1886. syn region p6PodFormatFrench
  1887.     \ matchgroup=p6PodFormatCode
  1888.     \ start="[CV]┬½"
  1889.     \ skip="┬½[^┬╗]*┬╗"
  1890.     \ end="┬╗"
  1891.     \ contained
  1892.     \ contains=p6PodFormatAnglesFrench
  1893.  
  1894. " L<> can have a "|" separator
  1895.  
  1896. syn region p6PodFormatOne
  1897.     \ matchgroup=p6PodFormatCode
  1898.     \ start="L<"
  1899.     \ skip="<[^>]*>"
  1900.     \ end=">"
  1901.     \ contained
  1902.     \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar
  1903.  
  1904. syn region p6PodFormatTwo
  1905.     \ matchgroup=p6PodFormatCode
  1906.     \ start="L<<"
  1907.     \ skip="<<[^>]*>>"
  1908.     \ end=">>"
  1909.     \ contained
  1910.     \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar
  1911.  
  1912. syn region p6PodFormatThree
  1913.     \ matchgroup=p6PodFormatCode
  1914.     \ start="L<<<"
  1915.     \ skip="<<<[^>]*>>>"
  1916.     \ end=">>>"
  1917.     \ contained
  1918.     \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar
  1919.  
  1920. syn region p6PodFormatFrench
  1921.     \ matchgroup=p6PodFormatCode
  1922.     \ start="L┬½"
  1923.     \ skip="┬½[^┬╗]*┬╗"
  1924.     \ end="┬╗"
  1925.     \ contained
  1926.     \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar
  1927.  
  1928. " E<> can have a ";" separator
  1929.  
  1930. syn region p6PodFormatOne
  1931.     \ matchgroup=p6PodFormatCode
  1932.     \ start="E<"
  1933.     \ skip="<[^>]*>"
  1934.     \ end=">"
  1935.     \ contained
  1936.     \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodSemiColon
  1937.  
  1938. syn region p6PodFormatTwo
  1939.     \ matchgroup=p6PodFormatCode
  1940.     \ start="E<<"
  1941.     \ skip="<<[^>]*>>"
  1942.     \ end=">>"
  1943.     \ contained
  1944.     \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodSemiColon
  1945.  
  1946. syn region p6PodFormatThree
  1947.     \ matchgroup=p6PodFormatCode
  1948.     \ start="E<<<"
  1949.     \ skip="<<<[^>]*>>>"
  1950.     \ end=">>>"
  1951.     \ contained
  1952.     \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodSemiColon
  1953.  
  1954. syn region p6PodFormatFrench
  1955.     \ matchgroup=p6PodFormatCode
  1956.     \ start="E┬½"
  1957.     \ skip="┬½[^┬╗]*┬╗"
  1958.     \ end="┬╗"
  1959.     \ contained
  1960.     \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodSemiColon
  1961.  
  1962. " M<> can have a ":" separator
  1963.  
  1964. syn region p6PodFormatOne
  1965.     \ matchgroup=p6PodFormatCode
  1966.     \ start="M<"
  1967.     \ skip="<[^>]*>"
  1968.     \ end=">"
  1969.     \ contained
  1970.     \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodColon
  1971.  
  1972. syn region p6PodFormatTwo
  1973.     \ matchgroup=p6PodFormatCode
  1974.     \ start="M<<"
  1975.     \ skip="<<[^>]*>>"
  1976.     \ end=">>"
  1977.     \ contained
  1978.     \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodColon
  1979.  
  1980. syn region p6PodFormatThree
  1981.     \ matchgroup=p6PodFormatCode
  1982.     \ start="M<<<"
  1983.     \ skip="<<<[^>]*>>>"
  1984.     \ end=">>>"
  1985.     \ contained
  1986.     \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodColon
  1987.  
  1988. syn region p6PodFormatFrench
  1989.     \ matchgroup=p6PodFormatCode
  1990.     \ start="M┬½"
  1991.     \ skip="┬½[^┬╗]*┬╗"
  1992.     \ end="┬╗"
  1993.     \ contained
  1994.     \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodColon
  1995.  
  1996. " D<> can have "|" and ";" separators
  1997.  
  1998. syn region p6PodFormatOne
  1999.     \ matchgroup=p6PodFormatCode
  2000.     \ start="D<"
  2001.     \ skip="<[^>]*>"
  2002.     \ end=">"
  2003.     \ contained
  2004.     \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar,p6PodSemiColon
  2005.  
  2006. syn region p6PodFormatTwo
  2007.     \ matchgroup=p6PodFormatCode
  2008.     \ start="D<<"
  2009.     \ skip="<<[^>]*>>"
  2010.     \ end=">>"
  2011.     \ contained
  2012.     \ contains=p6PodFormatAngleTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar,p6PodSemiColon
  2013.  
  2014. syn region p6PodFormatThree
  2015.     \ matchgroup=p6PodFormatCode
  2016.     \ start="D<<<"
  2017.     \ skip="<<<[^>]*>>>"
  2018.     \ end=">>>"
  2019.     \ contained
  2020.     \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon
  2021.  
  2022. syn region p6PodFormatFrench
  2023.     \ matchgroup=p6PodFormatCode
  2024.     \ start="D┬½"
  2025.     \ skip="┬½[^┬╗]*┬╗"
  2026.     \ end="┬╗"
  2027.     \ contained
  2028.     \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon
  2029.  
  2030. " X<> can have "|", "," and ";" separators
  2031.  
  2032. syn region p6PodFormatOne
  2033.     \ matchgroup=p6PodFormatCode
  2034.     \ start="X<"
  2035.     \ skip="<[^>]*>"
  2036.     \ end=">"
  2037.     \ contained
  2038.     \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar,p6PodSemiColon,p6PodComma
  2039.  
  2040. syn region p6PodFormatTwo
  2041.     \ matchgroup=p6PodFormatCode
  2042.     \ start="X<<"
  2043.     \ skip="<<[^>]*>>"
  2044.     \ end=">>"
  2045.     \ contained
  2046.     \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar,p6PodSemiColon,p6PodComma
  2047.  
  2048. syn region p6PodFormatThree
  2049.     \ matchgroup=p6PodFormatCode
  2050.     \ start="X<<<"
  2051.     \ skip="<<<[^>]*>>>"
  2052.     \ end=">>>"
  2053.     \ contained
  2054.     \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon,p6PodComma
  2055.  
  2056. syn region p6PodFormatFrench
  2057.     \ matchgroup=p6PodFormatCode
  2058.     \ start="X┬½"
  2059.     \ skip="┬½[^┬╗]*┬╗"
  2060.     \ end="┬╗"
  2061.     \ contained
  2062.     \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon,p6PodComma
  2063.  
  2064. " Define the default highlighting.
  2065. " For version 5.7 and earlier: only when not done already
  2066. " For version 5.8 and later: only when an item doesn't have highlighting yet
  2067. if version >= 508 || !exists("did_perl6_syntax_inits")
  2068.     if version < 508
  2069.         let did_perl6_syntax_inits = 1
  2070.         command -nargs=+ HiLink hi link <args>
  2071.     else
  2072.         command -nargs=+ HiLink hi def link <args>
  2073.     endif
  2074.  
  2075.     HiLink p6EscOctOld       p6Error
  2076.     HiLink p6PackageTwigil   p6Twigil
  2077.     HiLink p6StringAngle     p6String
  2078.     HiLink p6StringFrench    p6String
  2079.     HiLink p6StringAngles    p6String
  2080.     HiLink p6StringSQ        p6String
  2081.     HiLink p6StringDQ        p6String
  2082.     HiLink p6StringQ         p6String
  2083.     HiLink p6RxStringSQ      p6String
  2084.     HiLink p6RxStringDQ      p6String
  2085.     HiLink p6Substitution    p6String
  2086.     HiLink p6Transliteration p6String
  2087.     HiLink p6StringAuto      p6String
  2088.     HiLink p6StringP5Auto    p6String
  2089.     HiLink p6Key             p6String
  2090.     HiLink p6Match           p6String
  2091.     HiLink p6RegexBlock      p6String
  2092.     HiLink p6RxP5CharClass   p6String
  2093.     HiLink p6RxP5QuoteMeta   p6String
  2094.     HiLink p6RxCharClass     p6String
  2095.     HiLink p6RxQuoteWords    p6String
  2096.     HiLink p6ReduceOp        p6Operator
  2097.     HiLink p6ReverseCrossOp  p6Operator
  2098.     HiLink p6HyperOp         p6Operator
  2099.     HiLink p6QuoteQ          p6Operator
  2100.     HiLink p6RxRange         p6StringSpecial
  2101.     HiLink p6RxAnchor        p6StringSpecial
  2102.     HiLink p6RxP5Anchor      p6StringSpecial
  2103.     HiLink p6CodePoint       p6StringSpecial
  2104.     HiLink p6RxMeta          p6StringSpecial
  2105.     HiLink p6RxP5Range       p6StringSpecial
  2106.     HiLink p6RxP5CPId        p6StringSpecial
  2107.     HiLink p6RxP5Posix       p6StringSpecial
  2108.     HiLink p6RxP5Mod         p6StringSpecial
  2109.     HiLink p6RxP5HexSeq      p6StringSpecial
  2110.     HiLink p6RxP5OctSeq      p6StringSpecial
  2111.     HiLink p6RxP5WriteRefId  p6StringSpecial
  2112.     HiLink p6HexSequence     p6StringSpecial
  2113.     HiLink p6OctSequence     p6StringSpecial
  2114.     HiLink p6RxP5Named       p6StringSpecial
  2115.     HiLink p6RxP5PropId      p6StringSpecial
  2116.     HiLink p6RxP5Quantifier  p6StringSpecial
  2117.     HiLink p6RxP5CountId     p6StringSpecial
  2118.     HiLink p6RxP5Verb        p6StringSpecial
  2119.     HiLink p6Escape          p6StringSpecial2
  2120.     HiLink p6EscNull         p6StringSpecial2
  2121.     HiLink p6EscHash         p6StringSpecial2
  2122.     HiLink p6EscQQ           p6StringSpecial2
  2123.     HiLink p6EscQuote        p6StringSpecial2
  2124.     HiLink p6EscDoubleQuote  p6StringSpecial2
  2125.     HiLink p6EscBackTick     p6StringSpecial2
  2126.     HiLink p6EscForwardSlash p6StringSpecial2
  2127.     HiLink p6EscVerticalBar  p6StringSpecial2
  2128.     HiLink p6EscExclamation  p6StringSpecial2
  2129.     HiLink p6EscDollar       p6StringSpecial2
  2130.     HiLink p6EscOpenCurly    p6StringSpecial2
  2131.     HiLink p6EscCloseCurly   p6StringSpecial2
  2132.     HiLink p6EscCloseBracket p6StringSpecial2
  2133.     HiLink p6EscCloseAngle   p6StringSpecial2
  2134.     HiLink p6EscCloseFrench  p6StringSpecial2
  2135.     HiLink p6EscBackSlash    p6StringSpecial2
  2136.     HiLink p6RxEscape        p6StringSpecial2
  2137.     HiLink p6RxCapture       p6StringSpecial2
  2138.     HiLink p6RxAlternation   p6StringSpecial2
  2139.     HiLink p6RxP5            p6StringSpecial2
  2140.     HiLink p6RxP5ReadRef     p6StringSpecial2
  2141.     HiLink p6RxP5Oct         p6StringSpecial2
  2142.     HiLink p6RxP5Hex         p6StringSpecial2
  2143.     HiLink p6RxP5EscMeta     p6StringSpecial2
  2144.     HiLink p6RxP5Meta        p6StringSpecial2
  2145.     HiLink p6RxP5Escape      p6StringSpecial2
  2146.     HiLink p6RxP5CodePoint   p6StringSpecial2
  2147.     HiLink p6RxP5WriteRef    p6StringSpecial2
  2148.     HiLink p6RxP5Prop        p6StringSpecial2
  2149.  
  2150.     HiLink p6Property       Tag
  2151.     HiLink p6Attention      Todo
  2152.     HiLink p6Type           Type
  2153.     HiLink p6Error          Error
  2154.     HiLink p6BlockLabel     Label
  2155.     HiLink p6Float          Float
  2156.     HiLink p6Normal         Normal
  2157.     HiLink p6Package        Normal
  2158.     HiLink p6PackageScope   Normal
  2159.     HiLink p6Number         Number
  2160.     HiLink p6VersionNum     Number
  2161.     HiLink p6String         String
  2162.     HiLink p6Repeat         Repeat
  2163.     HiLink p6Keyword        Keyword
  2164.     HiLink p6Pragma         Keyword
  2165.     HiLink p6Module         Keyword
  2166.     HiLink p6DeclareRoutine Keyword
  2167.     HiLink p6VarStorage     Special
  2168.     HiLink p6FlowControl    Special
  2169.     HiLink p6NumberBase     Special
  2170.     HiLink p6Twigil         Special
  2171.     HiLink p6StringSpecial2 Special
  2172.     HiLink p6VersionDot     Special
  2173.     HiLink p6Comment        Comment
  2174.     HiLink p6Include        Include
  2175.     HiLink p6Shebang        PreProc
  2176.     HiLink p6ClosureTrait   PreProc
  2177.     HiLink p6Routine        Function
  2178.     HiLink p6Operator       Operator
  2179.     HiLink p6Version        Operator
  2180.     HiLink p6Context        Operator
  2181.     HiLink p6Quote          Delimiter
  2182.     HiLink p6TypeConstraint PreCondit
  2183.     HiLink p6Exception      Exception
  2184.     HiLink p6Placeholder    Identifier
  2185.     HiLink p6Variable       Identifier
  2186.     HiLink p6VarSlash       Identifier
  2187.     HiLink p6VarNum         Identifier
  2188.     HiLink p6VarExclam      Identifier
  2189.     HiLink p6VarMatch       Identifier
  2190.     HiLink p6VarName        Identifier
  2191.     HiLink p6MatchVar       Identifier
  2192.     HiLink p6RxP5ReadRefId  Identifier
  2193.     HiLink p6RxP5ModDef     Identifier
  2194.     HiLink p6RxP5ModName    Identifier
  2195.     HiLink p6Conditional    Conditional
  2196.     HiLink p6StringSpecial  SpecialChar
  2197.  
  2198.     HiLink p6PodAbbr         p6Pod
  2199.     HiLink p6PodAbbrEOF      p6Pod
  2200.     HiLink p6PodAbbrNoCode   p6Pod
  2201.     HiLink p6PodAbbrCode     p6PodCode
  2202.     HiLink p6PodPara         p6Pod
  2203.     HiLink p6PodParaEOF      p6Pod
  2204.     HiLink p6PodParaNoCode   p6Pod
  2205.     HiLink p6PodParaCode     p6PodCode
  2206.     HiLink p6PodDelim        p6Pod
  2207.     HiLink p6PodDelimEOF     p6Pod
  2208.     HiLink p6PodDelimNoCode  p6Pod
  2209.     HiLink p6PodDelimCode    p6PodCode
  2210.     HiLink p6PodImplicitCode p6PodCode
  2211.     HiLink p6PodExtraConfig  p6PodPrefix
  2212.     HiLink p6PodVerticalBar  p6PodFormatCode
  2213.     HiLink p6PodColon        p6PodFormatCode
  2214.     HiLink p6PodSemicolon    p6PodFormatCode
  2215.     HiLink p6PodComma        p6PodFormatCode
  2216.     HiLink p6PodFormatOne    p6PodFormat
  2217.     HiLink p6PodFormatTwo    p6PodFormat
  2218.     HiLink p6PodFormatThree  p6PodFormat
  2219.     HiLink p6PodFormatFrench p6PodFormat
  2220.  
  2221.     HiLink p6PodType           Type
  2222.     HiLink p6PodConfigOption   String
  2223.     HiLink p6PodCode           PreProc
  2224.     HiLink p6Pod               Comment
  2225.     HiLink p6PodComment        Comment
  2226.     HiLink p6PodAutoQuote      Operator
  2227.     HiLink p6PodConfigOperator Operator
  2228.     HiLink p6PodPrefix         Statement
  2229.     HiLink p6PodName           Identifier
  2230.     HiLink p6PodFormatCode     SpecialChar
  2231.     HiLink p6PodFormat         SpecialComment
  2232.  
  2233.     delcommand HiLink
  2234. endif
  2235.  
  2236. " Syncing to speed up processing
  2237. "syn sync match p6SyncPod groupthere p6PodAbbrRegion     "^=\K\k*\>"
  2238. "syn sync match p6SyncPod groupthere p6PodDirectRegion   "^=\%(config\|use\|encoding\)\>"
  2239. "syn sync match p6SyncPod groupthere p6PodParaRegion     "^=for\>"
  2240. "syn sync match p6SyncPod groupthere p6PodDelimRegion    "^=begin\>"
  2241. "syn sync match p6SyncPod groupthere p6PodDelimEndRegion "^=end\>"
  2242.  
  2243. " Let's just sync whole file, the other methods aren't reliable (or I don't
  2244. " know how to use them reliably)
  2245. syn sync fromstart
  2246.  
  2247. setlocal foldmethod=syntax
  2248.  
  2249. let b:current_syntax = "perl6"
  2250.  
  2251. let &cpo = s:keepcpo
  2252. unlet s:keepcpo
  2253.  
  2254. " vim:ts=8:sts=4:sw=4:expandtab:ft=vim
  2255.