From 23913e0598d23ec5948b71ea78c549b39cecf764 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Sun, 8 Mar 2015 21:32:50 -0700 Subject: Update --- syntax/perl6.vim | 1778 +++++++++++++++++++++++------------------------------- 1 file changed, 742 insertions(+), 1036 deletions(-) (limited to 'syntax/perl6.vim') diff --git a/syntax/perl6.vim b/syntax/perl6.vim index 066d6cad..ed928852 100644 --- a/syntax/perl6.vim +++ b/syntax/perl6.vim @@ -12,54 +12,28 @@ " This is a big undertaking. Perl 6 is the sort of language that only Perl " can parse. But I'll do my best to get vim to. " -" You can associate the extension ".pl" with the filetype "perl6" by setting -" autocmd BufNewFile,BufRead *.pl setf perl6 -" in your ~/.vimrc. But that will infringe on Perl 5, so you might want to -" put a modeline near the beginning or end of your Perl 6 files instead: -" # vim: filetype=perl6 +" The ftdetect/perl11.vim file in this repository takes care of setting the +" right filetype for Perl 6 files. To set it explicitly you can also add this +" line near the bottom of your source file: +" # vim: filetype=perl6 " TODO: -" * Deal with s:Perl5// -" * m:s// is a match, not a substitution -" * Make these highlight as strings, not operators: -" <==> <=:=> <===> <=~> <« »> «>» «<» -" * Allow more keywords to match as function calls(leave() is export(), etc) -" * Optimization: use nextgroup instead of lookaround (:help syn-nextgroup) -" * Fix s''' substitutions being matched as package names -" * Match s/// and m/// better, so things like "$s/" won't match +" * Go over the list of keywords/types to see what's deprecated/missing " * Add more support for folding (:help syn-fold) -" * Add more syntax syncing hooks (:help syn-sync) -" * Q//: -" :to, :heredoc -" interpolate \q:s{$scalar} (though the spec isn't very clear on it) -" -" Impossible TODO?: -" * Unspace -" * Unicode bracketing characters for quoting (there are so many) -" * Various tricks depending on context. I.e. we can't know when Perl -" expects «*» to be a string or a hyperoperator. The latter is presumably -" more common, so that's what we assume. -" * Selective highlighting of Pod formatting codes with the :allow option -" * Arbitrary number, order, and negation of adverbs to Q//, q//, qq//. -" Currently only the first adverb is considered significant. Anything -" more would require an exponential amount of regexes, making this -" already slow syntax file even slower. " " If you want to have Pir code inside Q:PIR// strings highlighted, do: -" let perl6_embedded_pir=1 +" let perl6_embedded_pir=1 " " The above requires pir.vim, which you can find in Parrot's repository: -" https://svn.parrot.org/parrot/trunk/editor/ -" -" Some less than crucial things have been made optional to speed things up. -" Look at the comments near the if/else branches in this file to see exactly -" which features are affected. "perl6_extended_all" enables everything. +" https://github.com/parrot/parrot/tree/master/editor " -" The defaults are: +" To highlight Perl 5 regexes (m:P5//): +" let perl6_perl5_regexes=1 " -" unlet perl6_extended_comments -" unlet perl6_extended_q -" unlet perl6_extended_all +" To enable folding: +" let perl6_fold=1 + +if version < 704 | throw "perl6.vim uses regex syntax which Vim <7.4 doesn't support. Try 'make fix_old_vim' in the vim-perl repository." | endif " For version 5.x: Clear all syntax items " For version 6.x: Quit when a syntax file was already loaded @@ -71,31 +45,33 @@ endif let s:keepcpo= &cpo set cpo&vim -" identifiers -syn match p6Normal display "\K\%(\k\|[-']\K\@=\)*" +" Patterns which will be interpolated by the preprocessor (tools/preproc.pl): +" +" @@IDENT_NONDIGIT@@ "[A-Za-z_\xC0-\xFF]" +" @@IDENT_CHAR@@ "[A-Za-z_\xC0-\xFF0-9]" +" @@IDENTIFIER@@ "\%(@@IDENT_NONDIGIT@@\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\@=\)*\)" +" @@IDENTIFIER_START@@ "@@IDENT_CHAR@@\@1" and "p5=>" operators. All the lookaround stuff is to make sure -" we don't match them as part of some other identifier. -let s:before_keyword = " display \"\\%(\\k\\|\\K\\@<=[-']\\)\\@" or "p5=>". +syn match p6KeywordStart 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.;\\]" -syn match p6Operator display "\%(:\@\)" -" "i" requires a digit to the left, and no keyword char to the right -syn match p6Operator display "\d\@<=i\k\@!" -" index overloading -syn match p6Operator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)" -" all infix operators except nonassocative ones -let s:infix_a = [ - \ "div % mod +& +< +> \\~& ?& \\~< \\~> +| +\\^ \\~| \\~\\^ ?| ?\\^ xx x", - \ "\\~ && & also <== ==> <<== ==>> == != < <= > >= \\~\\~ eq ne lt le gt", - \ "ge =:= === eqv before after \\^\\^ min max \\^ff ff\\^ \\^ff\\^", - \ "\\^fff fff\\^ \\^fff\\^ fff ff ::= := \\.= => , : p5=> Z minmax", - \ "\\.\\.\\. and andthen or orelse xor \\^ += -= /= \\*= \\~= //= ||=", - \ "+ - \\*\\* \\* // / \\~ || |", -\ ] -" nonassociative infix operators -let s:infix_n = "but does <=> leg cmp \\.\\. \\.\\.\\^\\^ \\^\\.\\. \\^\\.\\.\\^" - -let s:infix_a_long = join(s:infix_a, " ") -let s:infix_a_words = split(s:infix_a_long) -let s:infix_a_pattern = join(s:infix_a_words, "\\|") - -let s:infix_n_words = split(s:infix_n) -let s:infix_n_pattern = join(s:infix_n_words, "\\|") - -let s:both = [s:infix_a_pattern, s:infix_n_pattern] -let s:infix = join(s:both, "\\|") - -let s:infix_assoc = "!\\?\\%(" . s:infix_a_pattern . "\\)" -let s:infix = "!\\?\\%(" . s:infix . "\\)" - -unlet s:infix_a s:infix_a_long s:infix_a_words s:infix_a_pattern -unlet s:infix_n s:infix_n_pattern s:both - -" [+] reduce -exec "syn match p6ReduceOp display \"\\k\\@" +syn match p6TypeConstraint display "\%([.^]\|^\s*\)\@" +" some standard packages +syn match p6Type display "\%(::\)\@2».;\\∈∉∋∌∩∪≼≽⊂⊃⊄⊅⊆⊇⊈⊉⊍⊎⊖∅]" +syn match p6Operator display "\%(:\@1\)" +" index overloading +syn match p6Operator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)" -" int is a type sometimes -syn match p6Type display "\\%(\s*(\|\s\+\d\)\@!" +" Reduce metaoperators like [+] +syn match p6ReduceOp display "\%(^\|\s\|(\)\@1<=!*\%([RSXZ\[]\)*[&RSXZ]\?\[\+(\?\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".([:space:]]\)\+)\?]\+" +syn match p6SetOp display "R\?(\%([-^.+|&]\|[<>][=+]\?\|cont\|elem\))" -" these Routine names are also Properties, if preceded by "is" -syn match p6Property display "\%(is\s\+\)\@<=\%(signature\|context\|also\|shape\)" +" Reverse, cross, and zip metaoperators +exec "syn match p6RSXZOp display \"[RSXZ]:\\@!\\%(\\a\\@=\\%(". s:alpha_metaops_or . "\\)\\|[[:alnum:]]\\@!\\%([.,]\\|[^[,.[:space:]]\\)\\+\\|\\s\\@=\\|$\\)\"" -" The sigil in ::*Package -syn match p6PackageTwigil display "\%(::\)\@<=\*" +syn match p6BlockLabel display "^\s*\zs\h\w*\s*::\@!\_s\@=" -" $ -syn region p6MatchVarSigil - \ matchgroup=p6Variable - \ start="\$\%(<<\@!\)\@=" - \ end=">\@<=" - \ contains=p6MatchVar +syn match p6Number display "[A-Za-z_\xC0-\xFF0-9]\@1" - \ contained +syn match p6Version display "\" -syn match p6Context display "\%(\$\|@\|%\|&\|@@\)(\@=" - -" the "$" placeholder in "$var1, $, var2 = @list" -syn match p6Placeholder display "\%(,\s*\)\@<=\$\%(\K\|\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" - \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" + \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" + \ start="\ze\z(@\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ end="\z1\zs" - \ contained + \ contained keepend \ contains=TOP - \ keepend syn region p6InterpArray \ matchgroup=p6Context \ start="@\ze()\@!" - \ start="@@\ze()\@!" \ skip="([^)]*)" \ end=")\zs" \ contained \ contains=TOP syn region p6InterpHash - \ start="\ze\z(%\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" + \ start="\ze\z(%\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ end="\z1\zs" - \ contained + \ contained keepend \ contains=TOP - \ keepend syn region p6InterpHash \ matchgroup=p6Context @@ -445,11 +292,10 @@ syn region p6InterpHash \ contains=TOP syn region p6InterpFunction - \ start="\ze\z(&\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" + \ start="\ze\z(&\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" \ end="\z1\zs" - \ contained + \ contained keepend \ contains=TOP - \ keepend syn region p6InterpFunction \ matchgroup=p6Context @@ -460,12 +306,11 @@ syn region p6InterpFunction \ contains=TOP syn region p6InterpClosure - \ start="\\\@, etc " Since we don't know in advance how the adverb ends, we use a trick. " Consume nothing with the start pattern (\ze at the beginning), " while capturing the whole adverb into \z1 and then putting it before " the match start (\zs) of the end pattern. syn region p6Adverb - \ start="\ze\z(:!\?\K\%(\k\|[-']\K\@=\)*\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)" - \ start="\ze\z(:!\?[@$%]\$*\%(::\|\%(\$\@<=\d\+\|!\|/\|¢\)\|\%(\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\?\)" + \ start="\ze\z(:!\?[@$%]\$*\%(::\|\%(\$\@1<=\d\+\|!\|/\|¢\)\|\%(\%([.^*?=!~]\|:\@1 -" FIXME: not sure how to distinguish this from the "less than" operator -" in all cases. For now, it matches if any of the following is true: +" Distinguishing this from the "less than" operator is tricky. For now, +" it matches if any of the following is true: " " * There is whitespace missing on either side of the "<", since -" people tend to put spaces around "less than" +" people tend to put spaces around "less than". We make an exception +" for " = < ... >" assignments though. " * It comes after "enum", "for", "any", "all", or "none" " * It's the first or last thing on a line (ignoring whitespace) " * It's preceded by "= " +" * It's empty and terminated on the same line (e.g. <> and < >) " " It never matches when: " -" * Preceded by [<+~=] (e.g. <>, =<$foo>) -" * Followed by [-=] (e.g. <--, <=, <==) +" * Preceded by [<+~=!] (e.g. <>, =<$foo>, * !< 3) +" * Followed by [-=] (e.g. <--, <=, <==, <->) syn region p6StringAngle \ matchgroup=p6Quote \ start="\%(\<\%(enum\|for\|any\|all\|none\)\>\s*(\?\s*\)\@<=<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!" - \ start="\%(\s\|[<+~=]\)\@\|[-=]\{1,2}>\@!\)\@!" - \ start="[<+~=]\@\|[-=]\{1,2}>\@!\)\@!" + \ start="\%(\s\|[<+~=!]\)\@\|[-=]\{1,2}>\@!\)\@!" + \ start="[<+~=!]\@1\|[-=]\{1,2}\)\@!" \ start="\%(^\s*\)\@<=<\%(<\|=>\|[-=]\{1,2}>\@!\)\@!" - \ start="[<+~=]\@\|[-=]\{1,2}>\@!\)\@!" - \ skip="\\\@" + \ start="[<+~=!]\@1\|[-=]\{1,2}>\@!\)\@!" + \ start="<\%(\s*>\)\@=" + \ skip="\\\@1" \ end=">" \ contains=p6InnerAnglesOne,p6EscBackSlash,p6EscCloseAngle -syn region p6InnerAnglesOne - \ matchgroup=p6StringAngle +syn region p6StringAngleFixed + \ matchgroup=p6Quote \ start="<" - \ skip="\\\@" + \ skip="\\\@1" \ end=">" - \ transparent + \ contains=p6InnerAnglesOne,p6EscBackSlash,p6EscCloseAngle \ contained + +syn region p6InnerAnglesOne + \ matchgroup=p6StringAngle + \ start="\\\@1" + \ end=">" + \ transparent contained \ contains=p6InnerAnglesOne " <> syn region p6StringAngles \ matchgroup=p6Quote \ start="<<=\@!" - \ skip="\\\@" + \ skip="\\\@1" \ end=">>" \ contains=p6InnerAnglesTwo,@p6Interp_qq,p6Comment,p6EscHash,p6EscCloseAngle,p6Adverb,p6StringSQ,p6StringDQ syn region p6InnerAnglesTwo \ matchgroup=p6StringAngles \ start="<<" - \ skip="\\\@" + \ skip="\\\@1" \ end=">>" - \ transparent - \ contained + \ transparent contained \ contains=p6InnerAnglesTwo " «words» syn region p6StringFrench \ matchgroup=p6Quote \ start="«" - \ skip="\\\@" and "«»" strings in order to override +" them, but before other types of strings, to avoid matching those delimiters +" as parts of hyperops. +syn match p6HyperOp display #[^[:digit:][{('",:[:space:]][^[{('",:[:space:]]*\%(«\|<<\)# +syn match p6HyperOp display "«\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".([:space:]]\)\+[«»]" +syn match p6HyperOp display "»\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".([:space:]]\)\+\%(«\|»\?\)" +syn match p6HyperOp display "<<\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".([:space:]]\)\+\%(<<\|>>\)" +syn match p6HyperOp display ">>\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".([:space:]]\)\+\%(<<\|\%(>>\)\?\)" + " 'string' syn region p6StringSQ \ matchgroup=p6Quote \ start="'" - \ skip="\\\@" nextgroup=p6QPairs skipwhite skipempty -syn match p6QPairs contained transparent skipwhite skipempty nextgroup=p6StringQ,p6StringQ_PIR "\%(\_s*:!\?\K\%(\k\|[-']\K\@=\)*\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)*" - -if exists("perl6_embedded_pir") + \ keepend extend + +" Q// and friends + +syn match p6QuoteQStart display "\%(:\|\%(sub\|role\)\s\)\@5", "p6EscCloseAngle", "\\%(\\\\\\@\\|<[^>]*>\\)"], - \ ["«", "»", "p6EscCloseFrench", "\\%(\\\\\\@>", "p6EscCloseAngle", "\\%(\\\\\\@>\\|<<\\%([^>]\\|>>\\@!\\)*>>\\)"]) - call add(s:delims, ["\\s\\@<=<<<", ">>>", "p6EscCloseAngle", "\\%(\\\\\\@>>\\|<<<\\%([^>]\\|>\\%(>>\\)\\@!\\)*>>>\\)"]) -endif - -if !exists("perl6_extended_q") && !exists("perl6_extended_all") - " simple version, no special highlighting within the string - for [start_delim, end_delim, end_group, skip] in s:delims - exec "syn region p6StringQ matchgroup=p6Quote start=\"".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contains=".end_group." contained" - endfor - - if exists("perl6_embedded_pir") - " highlight embedded PIR code - for [start_delim, end_delim, end_group, skip] in s:delims - exec "syn region p6StringQ_PIR matchgroup=p6Quote start=\"\\%(Q\\s*:PIR\\s*\\)\\@<=".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contains=@p6PIR,".end_group." contained" - endfor +let s:bracketing_delims = [ + \ ["Curly", "{", "}", "p6EscCloseCurly", "\\%(\\\\\\@1", "p6EscCloseAngle", "\\%(\\\\\\@1\\|<[^>]*>\\)"], + \ ["French", "«", "»", "p6EscCloseFrench", "\\%(\\\\\\@1]*>\\|«[^»]*»\\|{[^}]*}\\)\\?\\)*\\_s*\\)\\@<=" - - let s:adverbs = [ - \ ["s", "scalar"], - \ ["a", "array"], - \ ["h", "hash"], - \ ["f", "function"], - \ ["c", "closure"], - \ ["b", "backslash"], - \ ["w", "words"], - \ ["ww", "quotewords"], - \ ["x", "exec"], - \ ] - - " these can't be conjoined with q and qq (e.g. as qqq and qqqq) - let s:q_adverbs = [ - \ ["q", "single"], - \ ["qq", "double"], - \ ] - - for [start_delim, end_delim, end_group, skip] in s:delims - " Q, q, and qq with any number of (ignored) adverbs - exec s:before ."Q". s:after .start_delim."\" end=\"". end_delim ."\""." contained" - exec s:before ."q". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q"." contained" - exec s:before ."qq". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq"." contained" - - for [short, long] in s:adverbs - " Qs, qs, qqs, Qa, qa, qqa, etc, with ignored adverbs - exec s:before ."Q".short. s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long." contained" - exec s:before ."q".short. s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q,@p6Interp_".long." contained" - exec s:before ."qq".short. s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq,@p6Interp_".long." contained" - - " Q, q, and qq, with one significant adverb - exec s:before ."Q\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long." contained" - for [q_short, q_long] in s:q_adverbs - exec s:before ."Q\\s*:\\%(".q_short."\\|".q_long."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".q_long." contained" - endfor - exec s:before ."q\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_q,@p6Interp_".long." contained" - exec s:before ."qq\\s*:\\%(".short."\\|".long."\\)". s:after .start_delim ."\" skip=\"". skip ."\" end=\"". end_delim ."\" contains=". end_group .",@p6Interp_qq,@p6Interp_".long." contained" - - for [short2, long2] in s:adverbs - " Qs, qs, qqs, Qa, qa, qqa, etc, with one significant adverb - exec s:before ."Q".short."\\s*:\\%(".short2."\\|".long2."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long.",@p6Interp_".long2." contained" - for [q_short2, q_long2] in s:q_adverbs - exec s:before ."Q".short."\\s*:\\%(".q_short2."\\|".q_long2."\\)". s:after .start_delim ."\" end=\"". end_delim ."\" contains=@p6Interp_".long.",@p6Interp_".q_long2." contained" - endfor - 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" - 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" - endfor - endfor - endfor - unlet s:before s:after s:adverbs s:q_adverbs -endif -unlet s:delims - -" Match these so something else above can't. E.g. the "q" in "role q { }" -" should not be considered a string -syn match p6Normal display "\%(\<\%(role\|grammar\|slang\)\s\+\)\@<=\K\%(\k\|[-']\K\@=\)*" +endfor +unlet s:plain_delims s:all_delims " :key -syn match p6Operator display ":\@ and p5=> autoquoting -syn match p6StringP5Auto display "\K\%(\k\|[-']\K\@=\)*\ze\s\+p5=>" -syn match p6StringAuto display "\K\%(\k\|[-']\K\@=\)*\ze\%(p5\)\@" -syn match p6StringAuto display "\K\%(\k\|[-']\K\@=\)*\ze\s\+=>" -syn match p6StringAuto display "\K\%(\k\|[-']\K\@=\)*p5\ze=>" - -" Hyperoperators. Needs to come after the quoting operators (<>, «», etc) -exec "syn match p6HyperOp display \"»" .s:infix."»\\?\"" -exec "syn match p6HyperOp display \"«\\?".s:infix."«\"" -exec "syn match p6HyperOp display \"»" .s:infix."«\"" -exec "syn match p6HyperOp display \"«" .s:infix. "»\"" - -exec "syn match p6HyperOp display \">>" .s:infix."\\%(>>\\)\\?\"" -exec "syn match p6HyperOp display \"\\%(<<\\)\\?".s:infix."<<\"" -exec "syn match p6HyperOp display \">>" .s:infix."<<\"" -exec "syn match p6HyperOp display \"<<" .s:infix.">>\"" -unlet s:infix +syn match p6StringP5Auto display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\s\+p5=>" +syn match p6StringAuto display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\%(p5\)\@2" +syn match p6StringAuto display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\s\+=>" +syn match p6StringAuto display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)p5\ze=>" " Regexes and grammars -syn match p6RegexName display "\%(\<\%(regex\|rule\|token\)\s\+\)\@<=\K\%(\k\|[-']\K\@=\)*" nextgroup=p6RegexBlockCrap skipwhite skipempty +syn match p6DeclareRegex display "\%(regex\|rule\|token\)" nextgroup=p6RegexName skipwhite skipempty +syn match p6RegexName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?" nextgroup=p6RegexBlockCrap skipwhite skipempty contained syn match p6RegexBlockCrap "[^{]*" nextgroup=p6RegexBlock skipwhite skipempty transparent contained syn region p6RegexBlock @@ -775,6 +532,7 @@ syn region p6RegexBlock syn cluster p6Regexen \ add=p6RxMeta \ add=p6RxEscape + \ add=p6EscCodePoint \ add=p6EscHex \ add=p6EscOct \ add=p6EscNull @@ -782,23 +540,79 @@ syn cluster p6Regexen \ add=p6RxCapture \ add=p6RxGroup \ add=p6RxAlternation + \ add=p6RxBoundary \ add=p6RxAdverb \ add=p6RxAdverbArg \ add=p6RxStorage \ add=p6RxAssertion + \ add=p6RxAssertGroup \ add=p6RxQuoteWords \ add=p6RxClosure \ add=p6RxStringSQ \ add=p6RxStringDQ \ add=p6Comment + \ add=p6MatchVarSigil -syn match p6RxMeta display contained ".\%(\k\|\s\)\@, @ +syn region p6MatchVarSigil + \ matchgroup=p6Variable + \ start="[$@]\%(<<\@!\)\@=" + \ end=">\@1<=" + \ contains=p6MatchVar + +syn region p6MatchVar + \ matchgroup=p6Twigil + \ start="<" + \ end=">" + \ contained + syn region p6RxClosure \ matchgroup=p6Normal \ start="{" @@ -811,42 +625,54 @@ syn region p6RxGroup \ start="\[" \ end="]" \ contained - \ contains=@p6Regexen,@p6Variables + \ contains=@p6Regexen,@p6Variables,p6MatchVarSigil syn region p6RxAssertion \ matchgroup=p6StringSpecial2 - \ start="<" + \ start="<\%(?\?\%(before\|after\)\|\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\)\|[+?*]\)\?" \ end=">" \ contained - \ contains=@p6Regexen,@p6Variables,p6RxCharClass,p6RxAssertCall -syn region p6RxAssertCall - \ matchgroup=p6Normal - \ start="\%(::\|\%(\K\%(\k\|[-']\K\@=\)*\)\)\@<=(\@=" - \ end=")\@<=" + \ contains=@p6Regexen,p6Identifier,@p6Variables,p6RxCharClass,p6RxAssertCall +syn region p6RxAssertGroup + \ matchgroup=p6StringSpecial2 + \ start="<\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\[" + \ skip="\\\@1" + \ contained keepend \ contains=TOP +syn match p6RxBoundary display contained "\%([«»]\|<<\|>>\)" syn region p6RxCharClass \ matchgroup=p6StringSpecial2 - \ start="\%(<[-!+?]\?\)\@<=\[" + \ start="\%(<[-!+?]\?\)\@2<=\[" \ skip="\\]" \ end="]" \ contained - \ contains=p6RxRange,p6RxEscape,p6EscHex,p6EscOct,p6EscNull + \ contains=p6RxRange,p6RxEscape,p6EscHex,p6EscOct,p6EscCodePoint,p6EscNull syn region p6RxQuoteWords \ matchgroup=p6StringSpecial2 - \ start="< " - \ end=">" + \ start="<\s" + \ end="\s\?>" \ contained syn region p6RxAdverb - \ start="\ze\z(:!\?\K\%(\k\|[-']\K\@=\)*\)" + \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)" \ end="\z1\zs" - \ contained + \ contained keepend \ contains=TOP - \ keepend syn region p6RxAdverbArg - \ start="\%(:!\?\K\%(\k\|[-']\K\@=\)*\)\@<=(" - \ skip="([^)]*)" + \ start="\%(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\@<=(" + \ skip="([^)]\{-})" \ end=")" \ contained + \ keepend \ contains=TOP syn region p6RxStorage \ matchgroup=p6Operator @@ -854,8 +680,136 @@ syn region p6RxStorage \ end="$" \ contains=TOP \ contained + \ keepend + +" 'string' inside a regex +syn region p6RxStringSQ + \ matchgroup=p6Quote + \ start="'" + \ skip="\\\@1\)\)\@=" +syn match p6VarSlash display "\$/" +syn match p6VarExclam display "\$!" +syn match p6VarMatch display "\$¢" +syn match p6VarNum display "\$\d\+" +syn match p6Variable display "self" +syn match p6Variable display "[@$%&]\?[@&$%]\$*\%(::\|\%(\%([.^*?=!~]\|:\@1>\)" contained +syn match p6Twigil display "\%([.^*?=!~]\|:\@1\|\<\%(if\|unless\|while\|when\|where\|so\)\)\s*\)\@<=/[/=]\@!" + \ skip="\\/" + \ end="/" + \ contains=@p6Regexen,p6Variable,p6VarExclam,p6VarMatch,p6VarNum + +" m/foo/, m$foo$, m!foo!, etc +syn region p6Match + \ matchgroup=p6Quote + \ start=+\z([/!$,|`"]\)+ + \ skip="\\\z1" + \ end="\z1" + \ contained + \ contains=@p6Regexen,p6Variable,p6VarNum + +" m, m«foo», m{foo}, etc +for [name, start_delim, end_delim, end_group, skip] in s:bracketing_delims + exec "syn region p6Match matchgroup=p6Quote start=\"".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contained keepend contains=@p6Regexen,@p6Variables" +endfor + +" Substitutions + +" s/foo//, s$foo$$, s!foo!!, etc +syn region p6Substitution + \ matchgroup=p6Quote + \ start=+\z([/!$,|`"]\)+ + \ skip="\\\z1" + \ end="\z1"me=e-1 + \ contained + \ contains=@p6Regexen,p6Variable,p6VarNum + \ nextgroup=p6Replacement + +syn region p6Replacement + \ matchgroup=p6Quote + \ start="\z(.\)" + \ skip="\\\z1" + \ end="\z1" + \ contained + \ contains=@p6Interp_qq + +" s, s«foo»«bar», s{foo}{bar}, etc +for [name, start_delim, end_delim, end_group, skip] in s:bracketing_delims + exec "syn region p6Substitution matchgroup=p6Quote start=\"".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contained keepend contains=@p6Regexen,@p6Variables nextgroup=p6Repl".name + exec "syn region p6Repl".name." matchgroup=p6Quote start=\"".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contained keepend contains=@p6Interp_qq" +endfor + +" Transliteration + +" tr/foo/bar/, tr|foo|bar, etc +syn region p6Transliteration + \ matchgroup=p6Quote + \ start=+\z([/!$,|`"]\)+ + \ skip="\\\z1" + \ end="\z1"me=e-1 + \ contained + \ contains=p6RxRange + \ nextgroup=p6TransRepl + +syn region p6TransRepl + \ matchgroup=p6Quote + \ start="\z(.\)" + \ skip="\\\z1" + \ end="\z1" + \ contained + \ contains=@p6Interp_qq,p6RxRange -" Perl 5 regex bits +" tr, tr«foo»«bar», tr{foo}{bar}, etc +for [name, start_delim, end_delim, end_group, skip] in s:bracketing_delims + exec "syn region p6Transliteration matchgroup=p6Quote start=\"".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contained keepend contains=p6RxRange nextgroup=p6TransRepl".name + exec "syn region p6TransRepl".name." matchgroup=p6Quote start=\"".start_delim."\" skip=\"".skip."\" end=\"".end_delim."\" contained keepend contains=@p6Interp_qq,p6RxRange" +endfor +unlet s:bracketing_delims + +if exists("perl6_perl5_regexes") || exists("perl6_extended_all") + +" Perl 5 regex regions syn cluster p6RegexP5Base \ add=p6RxP5Escape @@ -901,12 +855,12 @@ syn region p6RxP5HexSeq \ contained syn region p6RxP5Named \ matchgroup=p6RxP5Escape - \ start="\%(\\N\)\@<={" + \ start="\%(\\N\)\@2<={" \ end="}" \ contained -syn match p6RxP5Quantifier display contained "\%([+*]\|(\@, mm, rx -syn region p6Match - \ matchgroup=p6Quote - \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@\@!>\@!" - \ skip="\\>" - \ end=">" - \ contains=@p6Regexen,@p6Variables - -" m«foo», mm«foo», rx«foo» -syn region p6Match - \ matchgroup=p6Quote - \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@ -syn region p6Match - \ matchgroup=p6Quote - \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@\@!" - \ skip="\\>" - \ end=">" - \ contains=@p6Regexen,@p6Variables - -" s«foo» -syn region p6Match - \ matchgroup=p6Quote - \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@ syn region p6Match \ matchgroup=p6Quote - \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@\@!" + \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2\@!" \ skip="\\>" \ end=">" \ contains=@p6RegexP5,p6Variables @@ -1258,180 +991,130 @@ syn region p6Match " m:P5«» syn region p6Match \ matchgroup=p6Quote - \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@]*>" \ end=">" - \ matchgroup=p6Error - \ start="^#<" \ contains=p6Attention,p6Comment syn region p6Comment - \ matchgroup=p6Comment - \ start="^\@]\|>>\@!\)*>>" - \ end=">>" - \ matchgroup=p6Error - \ start="^#<<" - \ contains=p6Attention,p6Comment - syn region p6Comment - \ matchgroup=p6Comment - \ start="^\@]\|>\%(>>\)\@!\)*>>>" - \ end=">>>" - \ matchgroup=p6Error - \ start="^#<<<" - \ contains=p6Attention,p6Comment - - syn region p6Comment - \ matchgroup=p6Comment - \ start="^\@]\|>>\@!\)*>>" + \ end=">>" + \ contains=p6Attention,p6Comment +syn region p6Comment + \ matchgroup=p6Comment + \ start="#`<<<" + \ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>" + \ end=">>>" + \ contains=p6Attention,p6Comment + +syn region p6Comment + \ matchgroup=p6Comment + \ start="#`««" + \ skip="««\%([^»]\|»»\@!\)*»»" + \ end="»»" + \ contains=p6Attention,p6Comment +syn region p6Comment + \ matchgroup=p6Comment + \ start="#`«««" + \ skip="«««\%([^»]\|»\%(»»\)\@!\)*»»»" + \ end="»»»" + \ contains=p6Attention,p6Comment + +syn match p6Shebang display "\%^#!.*" " Pod " Abbreviated blocks (implicit code forbidden) syn region p6PodAbbrRegion \ matchgroup=p6PodPrefix - \ start="^=\ze\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="^\s*\zs=\ze\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=p6PodAbbrNoCodeType \ keepend syn region p6PodAbbrNoCodeType \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=p6PodName,p6PodAbbrNoCode @@ -1440,42 +1123,42 @@ syn match p6PodComment contained ".\+" syn region p6PodAbbrNoCode \ start="^" - \ end="^\ze\%(\s*$\|=\K\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=@p6PodFormat " Abbreviated blocks (everything is code) syn region p6PodAbbrRegion \ matchgroup=p6PodPrefix - \ start="^=\zecode\>" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="^\s*\zs=\zecode\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=p6PodAbbrCodeType \ keepend syn region p6PodAbbrCodeType \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=p6PodName,p6PodAbbrCode syn region p6PodAbbrCode \ start="^" - \ end="^\ze\%(\s*$\|=\K\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained " Abbreviated blocks (everything is a comment) syn region p6PodAbbrRegion \ matchgroup=p6PodPrefix \ start="^=\zecomment\>" - \ end="^\ze\%(\s*$\|=\K\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=p6PodAbbrCommentType \ keepend syn region p6PodAbbrCommentType \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=p6PodComment,p6PodAbbrNoCode @@ -1483,20 +1166,20 @@ syn region p6PodAbbrCommentType syn region p6PodAbbrRegion \ matchgroup=p6PodPrefix \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>" - \ end="^\ze\%(\s*$\|=\K\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=p6PodAbbrType \ keepend syn region p6PodAbbrType \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=p6PodName,p6PodAbbr syn region p6PodAbbr \ start="^" - \ end="^\ze\%(\s*$\|=\K\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=@p6PodFormat,p6PodImplicitCode @@ -1510,7 +1193,7 @@ syn region p6PodAbbrRegion syn region p6PodAbbrEOFType \ matchgroup=p6PodType - \ start="\K\k*" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="\%$" \ contained \ contains=p6PodName,p6PodAbbrEOF @@ -1525,20 +1208,20 @@ syn region p6PodAbbrEOF syn region p6PodDirectRegion \ matchgroup=p6PodPrefix \ start="^=\%(config\|use\)\>" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contains=p6PodDirectArgRegion \ keepend syn region p6PodDirectArgRegion \ matchgroup=p6PodType \ start="\S\+" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contained \ contains=p6PodDirectConfigRegion syn region p6PodDirectConfigRegion \ start="" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contained \ contains=@p6PodConfig @@ -1546,84 +1229,81 @@ syn region p6PodDirectConfigRegion syn region p6PodDirectRegion \ matchgroup=p6PodPrefix \ start="^=encoding\>" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contains=p6PodEncodingArgRegion \ keepend syn region p6PodEncodingArgRegion \ matchgroup=p6PodName \ start="\S\+" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contained " Paragraph blocks (implicit code forbidden) syn region p6PodParaRegion \ matchgroup=p6PodPrefix - \ start="^=for\>" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="^\s*\zs=for\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=p6PodParaNoCodeTypeRegion - \ keepend - \ extend + \ keepend extend syn region p6PodParaNoCodeTypeRegion \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=p6PodParaNoCode,p6PodParaConfigRegion syn region p6PodParaConfigRegion \ start="" - \ end="^\ze\%([^=]\|=\k\@\ze\s*code\>" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="^\s*\zs=for\>\ze\s*code\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=p6PodParaCodeTypeRegion - \ keepend - \ extend + \ keepend extend syn region p6PodParaCodeTypeRegion \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=p6PodParaCode,p6PodParaConfigRegion syn region p6PodParaCode \ start="^[^=]" - \ end="^\ze\%(\s*$\|=\K\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained " Paragraph blocks (implicit code allowed) syn region p6PodParaRegion \ matchgroup=p6PodPrefix - \ start="^=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="^\s*\zs=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contains=p6PodParaTypeRegion - \ keepend - \ extend + \ keepend extend syn region p6PodParaTypeRegion \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=p6PodPara,p6PodParaConfigRegion syn region p6PodPara \ start="^[^=]" - \ end="^\ze\%(\s*$\|=\K\)" + \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" \ contained \ contains=@p6PodFormat,p6PodImplicitCode @@ -1633,12 +1313,11 @@ syn region p6PodParaRegion \ start="^=for\>\ze\s\+END\>" \ end="\%$" \ contains=p6PodParaEOFTypeRegion - \ keepend - \ extend + \ keepend extend syn region p6PodParaEOFTypeRegion \ matchgroup=p6PodType - \ start="\K\k*" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="\%$" \ contained \ contains=p6PodParaEOF,p6PodParaConfigRegion @@ -1652,72 +1331,72 @@ syn region p6PodParaEOF " Delimited blocks (implicit code forbidden) syn region p6PodDelimRegion \ matchgroup=p6PodPrefix - \ start="^=begin\>" - \ end="^=end\>" + \ start="^\z(\s*\)\zs=begin\>" + \ end="^\z1\zs=end\>" \ contains=p6PodDelimNoCodeTypeRegion - \ keepend - \ extend + \ keepend extend skipwhite + \ nextgroup=p6PodType syn region p6PodDelimNoCodeTypeRegion \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze=end\>" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze=end\>" \ contained \ contains=p6PodDelimNoCode,p6PodDelimConfigRegion syn region p6PodDelimConfigRegion \ start="" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" + \ end="^\s*\zs\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" \ contained \ contains=@p6PodConfig syn region p6PodDelimNoCode \ start="^" - \ end="^\ze=end\>" + \ end="^\s*\zs\ze=end\>" \ contained \ contains=@p6PodNestedBlocks,@p6PodFormat " Delimited blocks (everything is code) syn region p6PodDelimRegion \ matchgroup=p6PodPrefix - \ start="^=begin\>\ze\s*code\>" - \ end="^=end\>" + \ start="^\z(\s*\)\zs=begin\>\ze\s*code\>" + \ end="^\z1\zs=end\>" \ contains=p6PodDelimCodeTypeRegion - \ keepend - \ extend + \ keepend extend skipwhite + \ nextgroup=p6PodType syn region p6PodDelimCodeTypeRegion \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze=end\>" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze=end\>" \ contained \ contains=p6PodDelimCode,p6PodDelimConfigRegion syn region p6PodDelimCode \ start="^" - \ end="^\ze=end\>" + \ end="^\s*\zs\ze=end\>" \ contained \ contains=@p6PodNestedBlocks " Delimited blocks (implicit code allowed) syn region p6PodDelimRegion \ matchgroup=p6PodPrefix - \ start="^=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" - \ end="^=end\>" + \ start="^\z(\s*\)\zs=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" + \ end="^\z1\zs=end\>" \ contains=p6PodDelimTypeRegion - \ keepend - \ extend + \ keepend extend skipwhite + \ nextgroup=p6PodType syn region p6PodDelimTypeRegion \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze=end\>" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze=end\>" \ contained \ contains=p6PodDelim,p6PodDelimConfigRegion syn region p6PodDelim \ start="^" - \ end="^\ze=end\>" + \ end="^\s*\zs\ze=end\>" \ contained \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode @@ -1726,12 +1405,12 @@ syn region p6PodDelimRegion \ matchgroup=p6PodPrefix \ start="^=begin\>\ze\s\+END\>" \ end="\%$" - \ contains=p6PodDelimEOFTypeRegion \ extend + \ contains=p6PodDelimEOFTypeRegion syn region p6PodDelimEOFTypeRegion \ matchgroup=p6PodType - \ start="\K\k*" + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" \ end="\%$" \ contained \ contains=p6PodDelimEOF,p6PodDelimConfigRegion @@ -1764,11 +1443,7 @@ syn match p6PodColon display contained ":" syn match p6PodSemicolon display contained ";" syn match p6PodComma display contained "," syn match p6PodImplicitCode display contained "^\s.*" - -syn region p6PodDelimEndRegion - \ matchgroup=p6PodType - \ start="\%(^=end\>\)\@<=" - \ end="\K\k*" +syn match p6PodType display contained "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" " These may appear inside delimited blocks syn cluster p6PodNestedBlocks @@ -1776,7 +1451,6 @@ syn cluster p6PodNestedBlocks \ add=p6PodDirectRegion \ add=p6PodParaRegion \ add=p6PodDelimRegion - \ add=p6PodDelimEndRegion " Pod formatting codes @@ -1793,8 +1467,7 @@ syn region p6PodFormatAnglesOne \ start="<" \ skip="<[^>]*>" \ end=">" - \ transparent - \ contained + \ transparent contained \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne syn region p6PodFormatAnglesTwo @@ -1802,8 +1475,7 @@ syn region p6PodFormatAnglesTwo \ start="<<" \ skip="<<[^>]*>>" \ end=">>" - \ transparent - \ contained + \ transparent contained \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo syn region p6PodFormatAnglesThree @@ -1811,8 +1483,7 @@ syn region p6PodFormatAnglesThree \ start="<<<" \ skip="<<<[^>]*>>>" \ end=">>>" - \ transparent - \ contained + \ transparent contained \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo,p6PodFormatAnglesThree syn region p6PodFormatAnglesFrench @@ -1820,8 +1491,7 @@ syn region p6PodFormatAnglesFrench \ start="«" \ skip="«[^»]*»" \ end="»" - \ transparent - \ contained + \ transparent contained \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo,p6PodFormatAnglesThree " All formatting codes @@ -2073,116 +1743,155 @@ if version >= 508 || !exists("did_perl6_syntax_inits") command -nargs=+ HiLink hi def link endif - HiLink p6EscOctOld p6Error - HiLink p6PackageTwigil p6Twigil - HiLink p6StringAngle p6String - HiLink p6StringFrench p6String - HiLink p6StringAngles p6String - HiLink p6StringSQ p6String - HiLink p6StringDQ p6String - HiLink p6StringQ p6String - HiLink p6RxStringSQ p6String - HiLink p6RxStringDQ p6String - HiLink p6Substitution p6String - HiLink p6Transliteration p6String - HiLink p6StringAuto p6String - HiLink p6StringP5Auto p6String - HiLink p6Key p6String - HiLink p6Match p6String - HiLink p6RegexBlock p6String - HiLink p6RxP5CharClass p6String - HiLink p6RxP5QuoteMeta p6String - HiLink p6RxCharClass p6String - HiLink p6RxQuoteWords p6String - HiLink p6ReduceOp p6Operator - HiLink p6ReverseCrossOp p6Operator - HiLink p6HyperOp p6Operator - HiLink p6QuoteQ p6Operator - HiLink p6RxRange p6StringSpecial - HiLink p6RxAnchor p6StringSpecial - HiLink p6RxP5Anchor p6StringSpecial - HiLink p6CodePoint p6StringSpecial - HiLink p6RxMeta p6StringSpecial - HiLink p6RxP5Range p6StringSpecial - HiLink p6RxP5CPId p6StringSpecial - HiLink p6RxP5Posix p6StringSpecial - HiLink p6RxP5Mod p6StringSpecial - HiLink p6RxP5HexSeq p6StringSpecial - HiLink p6RxP5OctSeq p6StringSpecial - HiLink p6RxP5WriteRefId p6StringSpecial - HiLink p6HexSequence p6StringSpecial - HiLink p6OctSequence p6StringSpecial - HiLink p6RxP5Named p6StringSpecial - HiLink p6RxP5PropId p6StringSpecial - HiLink p6RxP5Quantifier p6StringSpecial - HiLink p6RxP5CountId p6StringSpecial - HiLink p6RxP5Verb p6StringSpecial - HiLink p6Escape p6StringSpecial2 - HiLink p6EscNull p6StringSpecial2 - HiLink p6EscHash p6StringSpecial2 - HiLink p6EscQQ p6StringSpecial2 - HiLink p6EscQuote p6StringSpecial2 - HiLink p6EscDoubleQuote p6StringSpecial2 - HiLink p6EscBackTick p6StringSpecial2 - HiLink p6EscForwardSlash p6StringSpecial2 - HiLink p6EscVerticalBar p6StringSpecial2 - HiLink p6EscExclamation p6StringSpecial2 - HiLink p6EscDollar p6StringSpecial2 - HiLink p6EscOpenCurly p6StringSpecial2 - HiLink p6EscCloseCurly p6StringSpecial2 - HiLink p6EscCloseBracket p6StringSpecial2 - HiLink p6EscCloseAngle p6StringSpecial2 - HiLink p6EscCloseFrench p6StringSpecial2 - HiLink p6EscBackSlash p6StringSpecial2 - HiLink p6RxEscape p6StringSpecial2 - HiLink p6RxCapture p6StringSpecial2 - HiLink p6RxAlternation p6StringSpecial2 - HiLink p6RxP5 p6StringSpecial2 - HiLink p6RxP5ReadRef p6StringSpecial2 - HiLink p6RxP5Oct p6StringSpecial2 - HiLink p6RxP5Hex p6StringSpecial2 - HiLink p6RxP5EscMeta p6StringSpecial2 - HiLink p6RxP5Meta p6StringSpecial2 - HiLink p6RxP5Escape p6StringSpecial2 - HiLink p6RxP5CodePoint p6StringSpecial2 - HiLink p6RxP5WriteRef p6StringSpecial2 - HiLink p6RxP5Prop p6StringSpecial2 + HiLink p6EscOctOld p6Error + HiLink p6PackageTwigil p6Twigil + HiLink p6StringAngle p6String + HiLink p6StringAngleFixed p6String + HiLink p6StringFrench p6String + HiLink p6StringAngles p6String + HiLink p6StringSQ p6String + HiLink p6StringDQ p6String + HiLink p6StringQ p6String + HiLink p6StringQ_q p6String + HiLink p6StringQ_qww p6String + HiLink p6StringQ_qq p6String + HiLink p6StringQ_qto p6String + HiLink p6StringQ_qqto p6String + HiLink p6RxStringSQ p6String + HiLink p6RxStringDQ p6String + HiLink p6Replacement p6String + HiLink p6ReplCurly p6String + HiLink p6ReplAngle p6String + HiLink p6ReplFrench p6String + HiLink p6ReplBracket p6String + HiLink p6ReplParen p6String + HiLink p6Transliteration p6String + HiLink p6TransRepl p6String + HiLink p6TransReplCurly p6String + HiLink p6TransReplAngle p6String + HiLink p6TransReplFrench p6String + HiLink p6TransReplBracket p6String + HiLink p6TransReplParen p6String + HiLink p6StringAuto p6String + HiLink p6StringP5Auto p6String + HiLink p6Key p6String + HiLink p6Match p6String + HiLink p6Substitution p6String + HiLink p6MatchBare p6String + HiLink p6RegexBlock p6String + HiLink p6RxP5CharClass p6String + HiLink p6RxP5QuoteMeta p6String + HiLink p6RxCharClass p6String + HiLink p6RxQuoteWords p6String + HiLink p6ReduceOp p6Operator + HiLink p6SetOp p6Operator + HiLink p6RSXZOp p6Operator + HiLink p6HyperOp p6Operator + HiLink p6PostHyperOp p6Operator + HiLink p6QuoteQ p6Quote + HiLink p6QuoteQ_q p6Quote + HiLink p6QuoteQ_qww p6Quote + HiLink p6QuoteQ_qq p6Quote + HiLink p6QuoteQ_qto p6Quote + HiLink p6QuoteQ_qqto p6Quote + HiLink p6QuoteQ_PIR p6Quote + HiLink p6MatchStart_m p6Quote + HiLink p6MatchStart_s p6Quote + HiLink p6MatchStart_tr p6Quote + HiLink p6BareSigil p6Variable + HiLink p6RxRange p6StringSpecial + HiLink p6RxAnchor p6StringSpecial + HiLink p6RxBoundary p6StringSpecial + HiLink p6RxP5Anchor p6StringSpecial + HiLink p6CodePoint p6StringSpecial + HiLink p6RxMeta p6StringSpecial + HiLink p6RxP5Range p6StringSpecial + HiLink p6RxP5CPId p6StringSpecial + HiLink p6RxP5Posix p6StringSpecial + HiLink p6RxP5Mod p6StringSpecial + HiLink p6RxP5HexSeq p6StringSpecial + HiLink p6RxP5OctSeq p6StringSpecial + HiLink p6RxP5WriteRefId p6StringSpecial + HiLink p6HexSequence p6StringSpecial + HiLink p6OctSequence p6StringSpecial + HiLink p6RxP5Named p6StringSpecial + HiLink p6RxP5PropId p6StringSpecial + HiLink p6RxP5Quantifier p6StringSpecial + HiLink p6RxP5CountId p6StringSpecial + HiLink p6RxP5Verb p6StringSpecial + HiLink p6RxAssertGroup p6StringSpecial2 + HiLink p6Escape p6StringSpecial2 + HiLink p6EscNull p6StringSpecial2 + HiLink p6EscHash p6StringSpecial2 + HiLink p6EscQQ p6StringSpecial2 + HiLink p6EscQuote p6StringSpecial2 + HiLink p6EscDoubleQuote p6StringSpecial2 + HiLink p6EscBackTick p6StringSpecial2 + HiLink p6EscForwardSlash p6StringSpecial2 + HiLink p6EscVerticalBar p6StringSpecial2 + HiLink p6EscExclamation p6StringSpecial2 + HiLink p6EscDollar p6StringSpecial2 + HiLink p6EscOpenCurly p6StringSpecial2 + HiLink p6EscCloseCurly p6StringSpecial2 + HiLink p6EscCloseBracket p6StringSpecial2 + HiLink p6EscCloseAngle p6StringSpecial2 + HiLink p6EscCloseFrench p6StringSpecial2 + HiLink p6EscBackSlash p6StringSpecial2 + HiLink p6EscCodePoint p6StringSpecial2 + HiLink p6EscOct p6StringSpecial2 + HiLink p6EscHex p6StringSpecial2 + HiLink p6RxEscape p6StringSpecial2 + HiLink p6RxCapture p6StringSpecial2 + HiLink p6RxAlternation p6StringSpecial2 + HiLink p6RxP5 p6StringSpecial2 + HiLink p6RxP5ReadRef p6StringSpecial2 + HiLink p6RxP5Oct p6StringSpecial2 + HiLink p6RxP5Hex p6StringSpecial2 + HiLink p6RxP5EscMeta p6StringSpecial2 + HiLink p6RxP5Meta p6StringSpecial2 + HiLink p6RxP5Escape p6StringSpecial2 + HiLink p6RxP5CodePoint p6StringSpecial2 + HiLink p6RxP5WriteRef p6StringSpecial2 + HiLink p6RxP5Prop p6StringSpecial2 HiLink p6Property Tag HiLink p6Attention Todo HiLink p6Type Type HiLink p6Error Error HiLink p6BlockLabel Label - HiLink p6Float Float HiLink p6Normal Normal + HiLink p6Identifier Normal HiLink p6Package Normal HiLink p6PackageScope Normal HiLink p6Number Number - HiLink p6VersionNum Number + HiLink p6OctNumber Number + HiLink p6BinNumber Number + HiLink p6HexNumber Number + HiLink p6DecNumber Number HiLink p6String String HiLink p6Repeat Repeat - HiLink p6Keyword Keyword HiLink p6Pragma Keyword HiLink p6Module Keyword HiLink p6DeclareRoutine Keyword + HiLink p6DeclareRegex Keyword HiLink p6VarStorage Special HiLink p6FlowControl Special - HiLink p6NumberBase Special + HiLink p6OctBase Special + HiLink p6BinBase Special + HiLink p6HexBase Special + HiLink p6DecBase Special HiLink p6Twigil Special HiLink p6StringSpecial2 Special - HiLink p6VersionDot Special + HiLink p6Version Special HiLink p6Comment Comment HiLink p6Include Include HiLink p6Shebang PreProc HiLink p6ClosureTrait PreProc - HiLink p6Routine Function HiLink p6Operator Operator - HiLink p6Version Operator HiLink p6Context Operator HiLink p6Quote Delimiter HiLink p6TypeConstraint PreCondit HiLink p6Exception Exception - HiLink p6Placeholder Identifier HiLink p6Variable Identifier HiLink p6VarSlash Identifier HiLink p6VarNum Identifier @@ -2234,16 +1943,13 @@ if version >= 508 || !exists("did_perl6_syntax_inits") delcommand HiLink endif -" Syncing to speed up processing -"syn sync match p6SyncPod groupthere p6PodAbbrRegion "^=\K\k*\>" -"syn sync match p6SyncPod groupthere p6PodDirectRegion "^=\%(config\|use\|encoding\)\>" -"syn sync match p6SyncPod groupthere p6PodParaRegion "^=for\>" -"syn sync match p6SyncPod groupthere p6PodDelimRegion "^=begin\>" -"syn sync match p6SyncPod groupthere p6PodDelimEndRegion "^=end\>" - -" Let's just sync whole file, the other methods aren't reliable (or I don't -" know how to use them reliably) -syn sync fromstart +if exists("perl6_fold") || exists("perl6_extended_all") + setl foldmethod=syntax + syn region p6BlockFold + \ start="^\z(\s*\)\%(my\|our\|augment\|multi\|proto\|only\)\?\s*\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\s\+\)\?\<\%(CATCH\|try\|ENTER\|LEAVE\|CHECK\|INIT\|BEGIN\|END\|KEEP\|UNDO\|PRE\|POST\|module\|package\|enum\|subset\|class\|sub\%(method\)\?\|multi\|method\|slang\|grammar\|regex\|token\|rule\)\>[^{]\+{\%(\s+\|#.*\)\?$" + \ end="^\z1}" + \ transparent fold keepend extend +endif let b:current_syntax = "perl6" -- cgit v1.2.3