From 3bc852cabf5326079c710c772d5e925f3b151c3a Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 2 May 2021 12:45:09 -0400 Subject: vim-patch:11e3c5ba8203 Update runtime files https://github.com/vim/vim/commit/11e3c5ba820325b69cb56f70e13c21d7b8808d33 --- runtime/syntax/perl6.vim | 2242 --------------------------------------------- runtime/syntax/r.vim | 38 +- runtime/syntax/raku.vim | 1971 +++++++++++++++++++++++++++++++++++++++ runtime/syntax/rmd.vim | 44 +- runtime/syntax/rnoweb.vim | 4 +- 5 files changed, 2032 insertions(+), 2267 deletions(-) delete mode 100644 runtime/syntax/perl6.vim create mode 100644 runtime/syntax/raku.vim (limited to 'runtime/syntax') diff --git a/runtime/syntax/perl6.vim b/runtime/syntax/perl6.vim deleted file mode 100644 index 62ddc456e2..0000000000 --- a/runtime/syntax/perl6.vim +++ /dev/null @@ -1,2242 +0,0 @@ -" Vim syntax file -" Language: Perl 6 -" Maintainer: vim-perl -" Homepage: https://github.com/vim-perl/vim-perl/tree/master -" Bugs/requests: https://github.com/vim-perl/vim-perl/issues -" Last Change: 2020 Apr 15 - -" Contributors: Luke Palmer -" Moritz Lenz -" Hinrik Örn Sigurðsson -" -" 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 - -" 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 -" * 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 -" -" 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. -" -" The defaults are: -" -" unlet perl6_extended_comments -" unlet perl6_extended_q -" unlet perl6_extended_all - -" quit when a syntax file was already loaded -if exists("b:current_syntax") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -" identifiers -syn match p6Normal display "\K\%(\k\|[-']\K\@=\)*" - -" This is used in the for loops below -" Don't use the "syn keyword" construct because that always has higher -" priority than matches/regions, so the words can't be autoquoted with -" the "=>" 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\\@<=[-']\\)\\@.;\\]" -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\\@" - -" does is a type constraint sometimes -syn match p6TypeConstraint display "does\%(\s*\%(\k\|[-']\K\@=\)\)\@=" - -" int is a type sometimes -syn match p6Type display "\\%(\s*(\|\s\+\d\)\@!" - -" these Routine names are also Properties, if preceded by "is" -syn match p6Property display "\%(is\s\+\)\@<=\%(signature\|context\|also\|shape\)" - -" The sigil in ::*Package -syn match p6PackageTwigil display "\%(::\)\@<=\*" - -" $ -syn region p6MatchVarSigil - \ matchgroup=p6Variable - \ start="\$\%(<<\@!\)\@=" - \ end=">\@<=" - \ contains=p6MatchVar - -syn region p6MatchVar - \ matchgroup=p6Twigil - \ start="<" - \ end=">" - \ contained - -" Contextualizers -syn match p6Context display "\<\%(item\|list\|slice\|hash\)\>" -syn match p6Context display "\%(\$\|@\|%\|&\|@@\)(\@=" - -" the "$" placeholder in "$var1, $, var2 = @list" -syn match p6Placeholder display "\%(,\s*\)\@<=\$\%(\K\|\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" - \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" - \ end="\z1\zs" - \ contained - \ contains=TOP - \ keepend - -syn region p6InterpArray - \ matchgroup=p6Context - \ start="@\ze()\@!" - \ start="@@\ze()\@!" - \ skip="([^)]*)" - \ end=")\zs" - \ contained - \ contains=TOP - -syn region p6InterpHash - \ start="\ze\z(%\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" - \ end="\z1\zs" - \ contained - \ contains=TOP - \ keepend - -syn region p6InterpHash - \ matchgroup=p6Context - \ start="%\ze()\@!" - \ skip="([^)]*)" - \ end=")\zs" - \ contained - \ contains=TOP - -syn region p6InterpFunction - \ start="\ze\z(&\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" - \ end="\z1\zs" - \ contained - \ contains=TOP - \ keepend - -syn region p6InterpFunction - \ matchgroup=p6Context - \ start="&\ze()\@!" - \ skip="([^)]*)" - \ end=")\zs" - \ contained - \ contains=TOP - -syn region p6InterpClosure - \ start="\\\@" contained -syn match p6EscCloseFrench display "\\»" contained -syn match p6EscBackTick display "\\`" contained -syn match p6EscForwardSlash display "\\/" contained -syn match p6EscVerticalBar display "\\|" contained -syn match p6EscExclamation display "\\!" contained -syn match p6EscComma display "\\," contained -syn match p6EscDollar display "\\\$" contained -syn match p6EscCloseCurly display "\\}" contained -syn match p6EscCloseBracket display "\\\]" contained - -" misc escapes -syn match p6EscOctOld display "\\\d\{1,3}" contained -syn match p6EscNull display "\\0\d\@!" contained -syn match p6EscCodePoint display "\%(\\c\)\@<=\%(\d\|\S\|\[\)\@=" contained nextgroup=p6CodePoint -syn match p6EscHex display "\%(\\x\)\@<=\%(\x\|\[\)\@=" contained nextgroup=p6HexSequence -syn match p6EscOct display "\%(\\o\)\@<=\%(\o\|\[\)\@=" contained nextgroup=p6OctSequence -syn match p6EscQQ display "\\qq" contained nextgroup=p6QQSequence -syn match p6EscOpenCurly display "\\{" contained -syn match p6EscHash display "\\#" contained -syn match p6EscBackSlash display "\\\\" contained - -syn region p6QQSequence - \ matchgroup=p6Escape - \ start="\[" - \ skip="\[[^\]]*]" - \ end="]" - \ contained - \ transparent - \ contains=@p6Interp_qq - -syn match p6CodePoint display "\%(\d\+\|\S\)" contained -syn region p6CodePoint - \ matchgroup=p6Escape - \ start="\[" - \ end="]" - \ contained - -syn match p6HexSequence display "\x\+" contained -syn region p6HexSequence - \ matchgroup=p6Escape - \ start="\[" - \ end="]" - \ contained - -syn match p6OctSequence display "\o\+" contained -syn region p6OctSequence - \ matchgroup=p6Escape - \ start="\[" - \ end="]" - \ contained - -" matches :key, :!key, :$var, :key, 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\+\|!\|/\|¢\)\|\%(\%([.^*?=!~]\|:\@ -" 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: -" -" * There is whitespace missing on either side of the "<", since -" people tend to put spaces around "less than" -" * 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 never matches when: -" -" * Preceded by [<+~=] (e.g. <>, =<$foo>) -" * 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,2}>\@!\)\@!" - \ skip="\\\@" - \ end=">" - \ contains=p6InnerAnglesOne,p6EscBackSlash,p6EscCloseAngle - -syn region p6InnerAnglesOne - \ matchgroup=p6StringAngle - \ start="<" - \ skip="\\\@" - \ end=">" - \ transparent - \ contained - \ contains=p6InnerAnglesOne - -" <> -syn region p6StringAngles - \ matchgroup=p6Quote - \ start="<<=\@!" - \ skip="\\\@" - \ end=">>" - \ contains=p6InnerAnglesTwo,@p6Interp_qq,p6Comment,p6EscHash,p6EscCloseAngle,p6Adverb,p6StringSQ,p6StringDQ - -syn region p6InnerAnglesTwo - \ matchgroup=p6StringAngles - \ start="<<" - \ skip="\\\@" - \ end=">>" - \ transparent - \ contained - \ contains=p6InnerAnglesTwo - -" «words» -syn region p6StringFrench - \ 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") - syn include @p6PIR syntax/pir.vim -endif - -" hardcoded set of delimiters -let s:delims = [ - \ ["\\\"", "\\\"", "p6EscDoubleQuote", "\\\\\\@", "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 - endif -else - let s:before = "syn region p6StringQ matchgroup=p6Quote start=\"\\%(" - let s:after = "\\%(\\_s*:!\\?\\K\\%(\\k\\|[-']\\K\\@=\\)*\\%(([^)]*)\\|\\[[^\\]]*]\\|<[^>]*>\\|«[^»]*»\\|{[^}]*}\\)\\?\\)*\\_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\@=\)*" - -" :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 - -" Regexes and grammars - -syn match p6RegexName display "\%(\<\%(regex\|rule\|token\)\s\+\)\@<=\K\%(\k\|[-']\K\@=\)*" nextgroup=p6RegexBlockCrap skipwhite skipempty -syn match p6RegexBlockCrap "[^{]*" nextgroup=p6RegexBlock skipwhite skipempty transparent contained - -syn region p6RegexBlock - \ matchgroup=p6Normal - \ start="{" - \ end="}" - \ contained - \ contains=@p6Regexen,@p6Variables - -" Perl 6 regex bits - -syn cluster p6Regexen - \ add=p6RxMeta - \ add=p6RxEscape - \ add=p6EscHex - \ add=p6EscOct - \ add=p6EscNull - \ add=p6RxAnchor - \ add=p6RxCapture - \ add=p6RxGroup - \ add=p6RxAlternation - \ add=p6RxAdverb - \ add=p6RxAdverbArg - \ add=p6RxStorage - \ add=p6RxAssertion - \ add=p6RxQuoteWords - \ add=p6RxClosure - \ add=p6RxStringSQ - \ add=p6RxStringDQ - \ add=p6Comment - -syn match p6RxMeta display contained ".\%(\k\|\s\)\@" - \ contained - \ contains=@p6Regexen,@p6Variables,p6RxCharClass,p6RxAssertCall -syn region p6RxAssertCall - \ matchgroup=p6Normal - \ start="\%(::\|\%(\K\%(\k\|[-']\K\@=\)*\)\)\@<=(\@=" - \ end=")\@<=" - \ contained - \ contains=TOP -syn region p6RxCharClass - \ matchgroup=p6StringSpecial2 - \ start="\%(<[-!+?]\?\)\@<=\[" - \ skip="\\]" - \ end="]" - \ contained - \ contains=p6RxRange,p6RxEscape,p6EscHex,p6EscOct,p6EscNull -syn region p6RxQuoteWords - \ matchgroup=p6StringSpecial2 - \ start="< " - \ end=">" - \ contained -syn region p6RxAdverb - \ start="\ze\z(:!\?\K\%(\k\|[-']\K\@=\)*\)" - \ end="\z1\zs" - \ contained - \ contains=TOP - \ keepend -syn region p6RxAdverbArg - \ start="\%(:!\?\K\%(\k\|[-']\K\@=\)*\)\@<=(" - \ skip="([^)]*)" - \ end=")" - \ contained - \ contains=TOP -syn region p6RxStorage - \ matchgroup=p6Operator - \ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@=" - \ end="$" - \ contains=TOP - \ contained - -" Perl 5 regex bits - -syn cluster p6RegexP5Base - \ add=p6RxP5Escape - \ add=p6RxP5Oct - \ add=p6RxP5Hex - \ add=p6RxP5EscMeta - \ add=p6RxP5CodePoint - \ add=p6RxP5Prop - -" normal regex stuff -syn cluster p6RegexP5 - \ add=@p6RegexP5Base - \ add=p6RxP5Quantifier - \ add=p6RxP5Meta - \ add=p6RxP5QuoteMeta - \ add=p6RxP5ParenMod - \ add=p6RxP5Verb - \ add=p6RxP5Count - \ add=p6RxP5Named - \ add=p6RxP5ReadRef - \ add=p6RxP5WriteRef - \ add=p6RxP5CharClass - \ add=p6RxP5Anchor - -" inside character classes -syn cluster p6RegexP5Class - \ add=@p6RegexP5Base - \ add=p6RxP5Posix - \ add=p6RxP5Range - -syn match p6RxP5Escape display contained "\\\S" -syn match p6RxP5CodePoint display contained "\\c\S\@=" nextgroup=p6RxP5CPId -syn match p6RxP5CPId display contained "\S" -syn match p6RxP5Oct display contained "\\\%(\o\{1,3}\)\@=" nextgroup=p6RxP5OctSeq -syn match p6RxP5OctSeq display contained "\o\{1,3}" -syn match p6RxP5Anchor display contained "[\^$]" -syn match p6RxP5Hex display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=p6RxP5HexSeq -syn match p6RxP5HexSeq display contained "\x\{1,2}" -syn region p6RxP5HexSeq - \ matchgroup=p6RxP5Escape - \ start="{" - \ end="}" - \ contained -syn region p6RxP5Named - \ matchgroup=p6RxP5Escape - \ start="\%(\\N\)\@<={" - \ end="}" - \ contained -syn match p6RxP5Quantifier display contained "\%([+*]\|(\@" - \ contained -syn match p6RxP5WriteRef display contained "\\g\%(\d\|{\)\@=" nextgroup=p6RxP5WriteRefId -syn match p6RxP5WriteRefId display contained "\d\+" -syn region p6RxP5WriteRefId - \ matchgroup=p6RxP5Escape - \ start="{" - \ end="}" - \ contained -syn match p6RxP5Prop display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=p6RxP5PropId -syn match p6RxP5PropId display contained "\a" -syn region p6RxP5PropId - \ matchgroup=p6RxP5Escape - \ start="{" - \ end="}" - \ contained -syn match p6RxP5Meta display contained "[(|).]" -syn match p6RxP5ParenMod display contained "(\@<=?\@=" nextgroup=p6RxP5Mod,p6RxP5ModName,p6RxP5Code -syn match p6RxP5Mod display contained "?\%(<\?=\|<\?!\|[#:|]\)" -syn match p6RxP5Mod display contained "?-\?[impsx]\+" -syn match p6RxP5Mod display contained "?\%([-+]\?\d\+\|R\)" -syn match p6RxP5Mod display contained "?(DEFINE)" -syn match p6RxP5Mod display contained "?\%(&\|P[>=]\)" nextgroup=p6RxP5ModDef -syn match p6RxP5ModDef display contained "\h\w*" -syn region p6RxP5ModName - \ matchgroup=p6StringSpecial - \ start="?'" - \ end="'" - \ contained -syn region p6RxP5ModName - \ matchgroup=p6StringSpecial - \ start="?P\?<" - \ end=">" - \ contained -syn region p6RxP5Code - \ matchgroup=p6StringSpecial - \ start="??\?{" - \ end="})\@=" - \ contained - \ contains=TOP -syn match p6RxP5EscMeta display contained "\\[?*.{}()[\]|\^$]" -syn match p6RxP5Count display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=p6RxP5CountId -syn region p6RxP5CountId - \ matchgroup=p6RxP5Escape - \ start="{" - \ end="}" - \ contained -syn match p6RxP5Verb display contained "(\@<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)" -syn region p6RxP5QuoteMeta - \ matchgroup=p6RxP5Escape - \ start="\\Q" - \ end="\\E" - \ contained - \ contains=@p6Variables,p6EscBackSlash -syn region p6RxP5CharClass - \ matchgroup=p6StringSpecial - \ start="\[\^\?" - \ skip="\\]" - \ end="]" - \ contained - \ contains=@p6RegexP5Class -syn region p6RxP5Posix - \ matchgroup=p6RxP5Escape - \ start="\[:" - \ end=":]" - \ contained -syn match p6RxP5Range display contained "-" - -" 'string' inside a regex -syn region p6RxStringSQ - \ matchgroup=p6Quote - \ start="'" - \ skip="\\\@, 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="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@\@!" - \ skip="\\>" - \ end=">" - \ contains=@p6RegexP5,p6Variables - -" 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="^\ze\%(\s*$\|=\K\)" - \ contains=p6PodAbbrCodeType - \ keepend - -syn region p6PodAbbrCodeType - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - \ contains=p6PodName,p6PodAbbrCode - -syn region p6PodAbbrCode - \ start="^" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - -" Abbreviated blocks (everything is a comment) -syn region p6PodAbbrRegion - \ matchgroup=p6PodPrefix - \ start="^=\zecomment\>" - \ end="^\ze\%(\s*$\|=\K\)" - \ contains=p6PodAbbrCommentType - \ keepend - -syn region p6PodAbbrCommentType - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - \ contains=p6PodComment,p6PodAbbrNoCode - -" Abbreviated blocks (implicit code allowed) -syn region p6PodAbbrRegion - \ matchgroup=p6PodPrefix - \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>" - \ end="^\ze\%(\s*$\|=\K\)" - \ contains=p6PodAbbrType - \ keepend - -syn region p6PodAbbrType - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - \ contains=p6PodName,p6PodAbbr - -syn region p6PodAbbr - \ start="^" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - \ contains=@p6PodFormat,p6PodImplicitCode - -" Abbreviated block to end-of-file -syn region p6PodAbbrRegion - \ matchgroup=p6PodPrefix - \ start="^=\zeEND\>" - \ end="\%$" - \ contains=p6PodAbbrEOFType - \ keepend - -syn region p6PodAbbrEOFType - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="\%$" - \ contained - \ contains=p6PodName,p6PodAbbrEOF - -syn region p6PodAbbrEOF - \ start="^" - \ end="\%$" - \ contained - \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode - -" Directives -syn region p6PodDirectRegion - \ matchgroup=p6PodPrefix - \ start="^=\%(config\|use\)\>" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" - \ contains=p6PodDirectArgRegion - \ keepend - -syn region p6PodDirectArgRegion - \ matchgroup=p6PodType - \ start="\S\+" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" - \ contained - \ contains=p6PodDirectConfigRegion - -syn region p6PodDirectConfigRegion - \ start="" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" - \ contained - \ contains=@p6PodConfig - -" =encoding is a special directive -syn region p6PodDirectRegion - \ matchgroup=p6PodPrefix - \ start="^=encoding\>" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" - \ contains=p6PodEncodingArgRegion - \ keepend - -syn region p6PodEncodingArgRegion - \ matchgroup=p6PodName - \ start="\S\+" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" - \ contained - -" Paragraph blocks (implicit code forbidden) -syn region p6PodParaRegion - \ matchgroup=p6PodPrefix - \ start="^=for\>" - \ end="^\ze\%(\s*$\|=\K\)" - \ contains=p6PodParaNoCodeTypeRegion - \ keepend - \ extend - -syn region p6PodParaNoCodeTypeRegion - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - \ contains=p6PodParaNoCode,p6PodParaConfigRegion - -syn region p6PodParaConfigRegion - \ start="" - \ end="^\ze\%([^=]\|=\k\@\ze\s*code\>" - \ end="^\ze\%(\s*$\|=\K\)" - \ contains=p6PodParaCodeTypeRegion - \ keepend - \ extend - -syn region p6PodParaCodeTypeRegion - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - \ contains=p6PodParaCode,p6PodParaConfigRegion - -syn region p6PodParaCode - \ start="^[^=]" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - -" Paragraph blocks (implicit code allowed) -syn region p6PodParaRegion - \ matchgroup=p6PodPrefix - \ start="^=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" - \ end="^\ze\%(\s*$\|=\K\)" - \ contains=p6PodParaTypeRegion - \ keepend - \ extend - -syn region p6PodParaTypeRegion - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - \ contains=p6PodPara,p6PodParaConfigRegion - -syn region p6PodPara - \ start="^[^=]" - \ end="^\ze\%(\s*$\|=\K\)" - \ contained - \ contains=@p6PodFormat,p6PodImplicitCode - -" Paragraph block to end-of-file -syn region p6PodParaRegion - \ matchgroup=p6PodPrefix - \ start="^=for\>\ze\s\+END\>" - \ end="\%$" - \ contains=p6PodParaEOFTypeRegion - \ keepend - \ extend - -syn region p6PodParaEOFTypeRegion - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="\%$" - \ contained - \ contains=p6PodParaEOF,p6PodParaConfigRegion - -syn region p6PodParaEOF - \ start="^[^=]" - \ end="\%$" - \ contained - \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode - -" Delimited blocks (implicit code forbidden) -syn region p6PodDelimRegion - \ matchgroup=p6PodPrefix - \ start="^=begin\>" - \ end="^=end\>" - \ contains=p6PodDelimNoCodeTypeRegion - \ keepend - \ extend - -syn region p6PodDelimNoCodeTypeRegion - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze=end\>" - \ contained - \ contains=p6PodDelimNoCode,p6PodDelimConfigRegion - -syn region p6PodDelimConfigRegion - \ start="" - \ end="^\ze\%([^=]\|=\K\|\s*$\)" - \ contained - \ contains=@p6PodConfig - -syn region p6PodDelimNoCode - \ start="^" - \ end="^\ze=end\>" - \ contained - \ contains=@p6PodNestedBlocks,@p6PodFormat - -" Delimited blocks (everything is code) -syn region p6PodDelimRegion - \ matchgroup=p6PodPrefix - \ start="^=begin\>\ze\s*code\>" - \ end="^=end\>" - \ contains=p6PodDelimCodeTypeRegion - \ keepend - \ extend - -syn region p6PodDelimCodeTypeRegion - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze=end\>" - \ contained - \ contains=p6PodDelimCode,p6PodDelimConfigRegion - -syn region p6PodDelimCode - \ start="^" - \ end="^\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\>" - \ contains=p6PodDelimTypeRegion - \ keepend - \ extend - -syn region p6PodDelimTypeRegion - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="^\ze=end\>" - \ contained - \ contains=p6PodDelim,p6PodDelimConfigRegion - -syn region p6PodDelim - \ start="^" - \ end="^\ze=end\>" - \ contained - \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode - -" Delimited block to end-of-file -syn region p6PodDelimRegion - \ matchgroup=p6PodPrefix - \ start="^=begin\>\ze\s\+END\>" - \ end="\%$" - \ contains=p6PodDelimEOFTypeRegion - \ extend - -syn region p6PodDelimEOFTypeRegion - \ matchgroup=p6PodType - \ start="\K\k*" - \ end="\%$" - \ contained - \ contains=p6PodDelimEOF,p6PodDelimConfigRegion - -syn region p6PodDelimEOF - \ start="^" - \ end="\%$" - \ contained - \ contains=@p6PodNestedBlocks,@p6PodFormat,p6PodImplicitCode - -syn cluster p6PodConfig - \ add=p6PodConfigOperator - \ add=p6PodExtraConfig - \ add=p6StringAuto - \ add=p6PodAutoQuote - \ add=p6StringSQ - -syn region p6PodParens - \ start="(" - \ end=")" - \ contained - \ contains=p6Number,p6StringSQ - -syn match p6PodAutoQuote display contained "=>" -syn match p6PodConfigOperator display contained ":!\?" nextgroup=p6PodConfigOption -syn match p6PodConfigOption display contained "[^[:space:](<]\+" nextgroup=p6PodParens,p6StringAngle -syn match p6PodExtraConfig display contained "^=" -syn match p6PodVerticalBar display contained "|" -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*" - -" These may appear inside delimited blocks -syn cluster p6PodNestedBlocks - \ add=p6PodAbbrRegion - \ add=p6PodDirectRegion - \ add=p6PodParaRegion - \ add=p6PodDelimRegion - \ add=p6PodDelimEndRegion - -" Pod formatting codes - -syn cluster p6PodFormat - \ add=p6PodFormatOne - \ add=p6PodFormatTwo - \ add=p6PodFormatThree - \ add=p6PodFormatFrench - -" Balanced angles found inside formatting codes. Ensures proper nesting. - -syn region p6PodFormatAnglesOne - \ matchgroup=p6PodFormat - \ start="<" - \ skip="<[^>]*>" - \ end=">" - \ transparent - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne - -syn region p6PodFormatAnglesTwo - \ matchgroup=p6PodFormat - \ start="<<" - \ skip="<<[^>]*>>" - \ end=">>" - \ transparent - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo - -syn region p6PodFormatAnglesThree - \ matchgroup=p6PodFormat - \ start="<<<" - \ skip="<<<[^>]*>>>" - \ end=">>>" - \ transparent - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo,p6PodFormatAnglesThree - -syn region p6PodFormatAnglesFrench - \ matchgroup=p6PodFormat - \ start="«" - \ skip="«[^»]*»" - \ end="»" - \ transparent - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatAnglesOne,p6PodFormatAnglesTwo,p6PodFormatAnglesThree - -" All formatting codes - -syn region p6PodFormatOne - \ matchgroup=p6PodFormatCode - \ start="\u<" - \ skip="<[^>]*>" - \ end=">" - \ contained - \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne - -syn region p6PodFormatTwo - \ matchgroup=p6PodFormatCode - \ start="\u<<" - \ skip="<<[^>]*>>" - \ end=">>" - \ contained - \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo - -syn region p6PodFormatThree - \ matchgroup=p6PodFormatCode - \ start="\u<<<" - \ skip="<<<[^>]*>>>" - \ end=">>>" - \ contained - \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree - -syn region p6PodFormatFrench - \ matchgroup=p6PodFormatCode - \ start="\u«" - \ skip="«[^»]*»" - \ end="»" - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree - -" C<> and V<> don't allow nested formatting formatting codes - -syn region p6PodFormatOne - \ matchgroup=p6PodFormatCode - \ start="[CV]<" - \ skip="<[^>]*>" - \ end=">" - \ contained - \ contains=p6PodFormatAnglesOne - -syn region p6PodFormatTwo - \ matchgroup=p6PodFormatCode - \ start="[CV]<<" - \ skip="<<[^>]*>>" - \ end=">>" - \ contained - \ contains=p6PodFormatAnglesTwo - -syn region p6PodFormatThree - \ matchgroup=p6PodFormatCode - \ start="[CV]<<<" - \ skip="<<<[^>]*>>>" - \ end=">>>" - \ contained - \ contains=p6PodFormatAnglesThree - -syn region p6PodFormatFrench - \ matchgroup=p6PodFormatCode - \ start="[CV]«" - \ skip="«[^»]*»" - \ end="»" - \ contained - \ contains=p6PodFormatAnglesFrench - -" L<> can have a "|" separator - -syn region p6PodFormatOne - \ matchgroup=p6PodFormatCode - \ start="L<" - \ skip="<[^>]*>" - \ end=">" - \ contained - \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar - -syn region p6PodFormatTwo - \ matchgroup=p6PodFormatCode - \ start="L<<" - \ skip="<<[^>]*>>" - \ end=">>" - \ contained - \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar - -syn region p6PodFormatThree - \ matchgroup=p6PodFormatCode - \ start="L<<<" - \ skip="<<<[^>]*>>>" - \ end=">>>" - \ contained - \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar - -syn region p6PodFormatFrench - \ matchgroup=p6PodFormatCode - \ start="L«" - \ skip="«[^»]*»" - \ end="»" - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar - -" E<> can have a ";" separator - -syn region p6PodFormatOne - \ matchgroup=p6PodFormatCode - \ start="E<" - \ skip="<[^>]*>" - \ end=">" - \ contained - \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodSemiColon - -syn region p6PodFormatTwo - \ matchgroup=p6PodFormatCode - \ start="E<<" - \ skip="<<[^>]*>>" - \ end=">>" - \ contained - \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodSemiColon - -syn region p6PodFormatThree - \ matchgroup=p6PodFormatCode - \ start="E<<<" - \ skip="<<<[^>]*>>>" - \ end=">>>" - \ contained - \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodSemiColon - -syn region p6PodFormatFrench - \ matchgroup=p6PodFormatCode - \ start="E«" - \ skip="«[^»]*»" - \ end="»" - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodSemiColon - -" M<> can have a ":" separator - -syn region p6PodFormatOne - \ matchgroup=p6PodFormatCode - \ start="M<" - \ skip="<[^>]*>" - \ end=">" - \ contained - \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodColon - -syn region p6PodFormatTwo - \ matchgroup=p6PodFormatCode - \ start="M<<" - \ skip="<<[^>]*>>" - \ end=">>" - \ contained - \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodColon - -syn region p6PodFormatThree - \ matchgroup=p6PodFormatCode - \ start="M<<<" - \ skip="<<<[^>]*>>>" - \ end=">>>" - \ contained - \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodColon - -syn region p6PodFormatFrench - \ matchgroup=p6PodFormatCode - \ start="M«" - \ skip="«[^»]*»" - \ end="»" - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodColon - -" D<> can have "|" and ";" separators - -syn region p6PodFormatOne - \ matchgroup=p6PodFormatCode - \ start="D<" - \ skip="<[^>]*>" - \ end=">" - \ contained - \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar,p6PodSemiColon - -syn region p6PodFormatTwo - \ matchgroup=p6PodFormatCode - \ start="D<<" - \ skip="<<[^>]*>>" - \ end=">>" - \ contained - \ contains=p6PodFormatAngleTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar,p6PodSemiColon - -syn region p6PodFormatThree - \ matchgroup=p6PodFormatCode - \ start="D<<<" - \ skip="<<<[^>]*>>>" - \ end=">>>" - \ contained - \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon - -syn region p6PodFormatFrench - \ matchgroup=p6PodFormatCode - \ start="D«" - \ skip="«[^»]*»" - \ end="»" - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon - -" X<> can have "|", "," and ";" separators - -syn region p6PodFormatOne - \ matchgroup=p6PodFormatCode - \ start="X<" - \ skip="<[^>]*>" - \ end=">" - \ contained - \ contains=p6PodFormatAnglesOne,p6PodFormatFrench,p6PodFormatOne,p6PodVerticalBar,p6PodSemiColon,p6PodComma - -syn region p6PodFormatTwo - \ matchgroup=p6PodFormatCode - \ start="X<<" - \ skip="<<[^>]*>>" - \ end=">>" - \ contained - \ contains=p6PodFormatAnglesTwo,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodVerticalBar,p6PodSemiColon,p6PodComma - -syn region p6PodFormatThree - \ matchgroup=p6PodFormatCode - \ start="X<<<" - \ skip="<<<[^>]*>>>" - \ end=">>>" - \ contained - \ contains=p6PodFormatAnglesThree,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon,p6PodComma - -syn region p6PodFormatFrench - \ matchgroup=p6PodFormatCode - \ start="X«" - \ skip="«[^»]*»" - \ end="»" - \ contained - \ contains=p6PodFormatAnglesFrench,p6PodFormatFrench,p6PodFormatOne,p6PodFormatTwo,p6PodFormatThree,p6PodVerticalBar,p6PodSemiColon,p6PodComma - -" Define the default highlighting. -" Only when an item doesn't have highlighting yet - -hi def link p6EscOctOld p6Error -hi def link p6PackageTwigil p6Twigil -hi def link p6StringAngle p6String -hi def link p6StringFrench p6String -hi def link p6StringAngles p6String -hi def link p6StringSQ p6String -hi def link p6StringDQ p6String -hi def link p6StringQ p6String -hi def link p6RxStringSQ p6String -hi def link p6RxStringDQ p6String -hi def link p6Substitution p6String -hi def link p6Transliteration p6String -hi def link p6StringAuto p6String -hi def link p6StringP5Auto p6String -hi def link p6Key p6String -hi def link p6Match p6String -hi def link p6RegexBlock p6String -hi def link p6RxP5CharClass p6String -hi def link p6RxP5QuoteMeta p6String -hi def link p6RxCharClass p6String -hi def link p6RxQuoteWords p6String -hi def link p6ReduceOp p6Operator -hi def link p6ReverseCrossOp p6Operator -hi def link p6HyperOp p6Operator -hi def link p6QuoteQ p6Operator -hi def link p6RxRange p6StringSpecial -hi def link p6RxAnchor p6StringSpecial -hi def link p6RxP5Anchor p6StringSpecial -hi def link p6CodePoint p6StringSpecial -hi def link p6RxMeta p6StringSpecial -hi def link p6RxP5Range p6StringSpecial -hi def link p6RxP5CPId p6StringSpecial -hi def link p6RxP5Posix p6StringSpecial -hi def link p6RxP5Mod p6StringSpecial -hi def link p6RxP5HexSeq p6StringSpecial -hi def link p6RxP5OctSeq p6StringSpecial -hi def link p6RxP5WriteRefId p6StringSpecial -hi def link p6HexSequence p6StringSpecial -hi def link p6OctSequence p6StringSpecial -hi def link p6RxP5Named p6StringSpecial -hi def link p6RxP5PropId p6StringSpecial -hi def link p6RxP5Quantifier p6StringSpecial -hi def link p6RxP5CountId p6StringSpecial -hi def link p6RxP5Verb p6StringSpecial -hi def link p6Escape p6StringSpecial2 -hi def link p6EscNull p6StringSpecial2 -hi def link p6EscHash p6StringSpecial2 -hi def link p6EscQQ p6StringSpecial2 -hi def link p6EscQuote p6StringSpecial2 -hi def link p6EscDoubleQuote p6StringSpecial2 -hi def link p6EscBackTick p6StringSpecial2 -hi def link p6EscForwardSlash p6StringSpecial2 -hi def link p6EscVerticalBar p6StringSpecial2 -hi def link p6EscExclamation p6StringSpecial2 -hi def link p6EscDollar p6StringSpecial2 -hi def link p6EscOpenCurly p6StringSpecial2 -hi def link p6EscCloseCurly p6StringSpecial2 -hi def link p6EscCloseBracket p6StringSpecial2 -hi def link p6EscCloseAngle p6StringSpecial2 -hi def link p6EscCloseFrench p6StringSpecial2 -hi def link p6EscBackSlash p6StringSpecial2 -hi def link p6RxEscape p6StringSpecial2 -hi def link p6RxCapture p6StringSpecial2 -hi def link p6RxAlternation p6StringSpecial2 -hi def link p6RxP5 p6StringSpecial2 -hi def link p6RxP5ReadRef p6StringSpecial2 -hi def link p6RxP5Oct p6StringSpecial2 -hi def link p6RxP5Hex p6StringSpecial2 -hi def link p6RxP5EscMeta p6StringSpecial2 -hi def link p6RxP5Meta p6StringSpecial2 -hi def link p6RxP5Escape p6StringSpecial2 -hi def link p6RxP5CodePoint p6StringSpecial2 -hi def link p6RxP5WriteRef p6StringSpecial2 -hi def link p6RxP5Prop p6StringSpecial2 - -hi def link p6Property Tag -hi def link p6Attention Todo -hi def link p6Type Type -hi def link p6Error Error -hi def link p6BlockLabel Label -hi def link p6Float Float -hi def link p6Normal Normal -hi def link p6Package Normal -hi def link p6PackageScope Normal -hi def link p6Number Number -hi def link p6VersionNum Number -hi def link p6String String -hi def link p6Repeat Repeat -hi def link p6Keyword Keyword -hi def link p6Pragma Keyword -hi def link p6Module Keyword -hi def link p6DeclareRoutine Keyword -hi def link p6VarStorage Special -hi def link p6FlowControl Special -hi def link p6NumberBase Special -hi def link p6Twigil Special -hi def link p6StringSpecial2 Special -hi def link p6VersionDot Special -hi def link p6Comment Comment -hi def link p6Include Include -hi def link p6Shebang PreProc -hi def link p6ClosureTrait PreProc -hi def link p6Routine Function -hi def link p6Operator Operator -hi def link p6Version Operator -hi def link p6Context Operator -hi def link p6Quote Delimiter -hi def link p6TypeConstraint PreCondit -hi def link p6Exception Exception -hi def link p6Placeholder Identifier -hi def link p6Variable Identifier -hi def link p6VarSlash Identifier -hi def link p6VarNum Identifier -hi def link p6VarExclam Identifier -hi def link p6VarMatch Identifier -hi def link p6VarName Identifier -hi def link p6MatchVar Identifier -hi def link p6RxP5ReadRefId Identifier -hi def link p6RxP5ModDef Identifier -hi def link p6RxP5ModName Identifier -hi def link p6Conditional Conditional -hi def link p6StringSpecial SpecialChar - -hi def link p6PodAbbr p6Pod -hi def link p6PodAbbrEOF p6Pod -hi def link p6PodAbbrNoCode p6Pod -hi def link p6PodAbbrCode p6PodCode -hi def link p6PodPara p6Pod -hi def link p6PodParaEOF p6Pod -hi def link p6PodParaNoCode p6Pod -hi def link p6PodParaCode p6PodCode -hi def link p6PodDelim p6Pod -hi def link p6PodDelimEOF p6Pod -hi def link p6PodDelimNoCode p6Pod -hi def link p6PodDelimCode p6PodCode -hi def link p6PodImplicitCode p6PodCode -hi def link p6PodExtraConfig p6PodPrefix -hi def link p6PodVerticalBar p6PodFormatCode -hi def link p6PodColon p6PodFormatCode -hi def link p6PodSemicolon p6PodFormatCode -hi def link p6PodComma p6PodFormatCode -hi def link p6PodFormatOne p6PodFormat -hi def link p6PodFormatTwo p6PodFormat -hi def link p6PodFormatThree p6PodFormat -hi def link p6PodFormatFrench p6PodFormat - -hi def link p6PodType Type -hi def link p6PodConfigOption String -hi def link p6PodCode PreProc -hi def link p6Pod Comment -hi def link p6PodComment Comment -hi def link p6PodAutoQuote Operator -hi def link p6PodConfigOperator Operator -hi def link p6PodPrefix Statement -hi def link p6PodName Identifier -hi def link p6PodFormatCode SpecialChar -hi def link p6PodFormat SpecialComment - - -" 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 - -setlocal foldmethod=syntax - -let b:current_syntax = "perl6" - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:ts=8:sts=4:sw=4:expandtab:ft=vim diff --git a/runtime/syntax/r.vim b/runtime/syntax/r.vim index 9e25dae363..a8100cfded 100644 --- a/runtime/syntax/r.vim +++ b/runtime/syntax/r.vim @@ -5,7 +5,7 @@ " Tom Payne " Contributor: Johannes Ranke " Homepage: https://github.com/jalvesaq/R-Vim-runtime -" Last Change: Wed Aug 01, 2018 10:10PM +" Last Change: Sun Mar 28, 2021 01:47PM " Filenames: *.R *.r *.Rhistory *.Rt " " NOTE: The highlighting of R functions might be defined in @@ -53,12 +53,12 @@ syn match rCommentTodo contained "\(BUG\|FIXME\|NOTE\|TODO\):" syn match rTodoParen contained "\(BUG\|FIXME\|NOTE\|TODO\)\s*(.\{-})\s*:" contains=rTodoKeyw,rTodoInfo transparent syn keyword rTodoKeyw BUG FIXME NOTE TODO contained syn match rTodoInfo "(\zs.\{-}\ze)" contained -syn match rComment contains=@Spell,rCommentTodo,rTodoParen,rOBlock "#.*" +syn match rComment contains=@Spell,rCommentTodo,rTodoParen "#.*" " Roxygen if g:r_syntax_hl_roxygen " A roxygen block can start at the beginning of a file (first version) and - " after a blank line (second version). It ends when a line that does not + " after a blank line (second version). It ends when a line appears that does not " contain a roxygen comment. In the following comments, any line containing " a roxygen comment marker (one or two hash signs # followed by a single " quote ' and preceded only by whitespace) is called a roxygen line. A @@ -71,6 +71,12 @@ if g:r_syntax_hl_roxygen syn match rOTitleBlock "\%^\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag syn match rOTitleBlock "^\s*\n\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag + " A title as part of a block is always at the beginning of the block, i.e. + " either at the start of a file or after a completely empty line. + syn match rOTitle "\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag + syn match rOTitle "^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag + syn match rOTitleTag contained "@title" + " When a roxygen block has a title and additional content, the title " consists of one or more roxygen lines (as little as possible are matched), " followed either by an empty roxygen line @@ -87,16 +93,15 @@ if g:r_syntax_hl_roxygen syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold - " A title as part of a block is always at the beginning of the block, i.e. - " either at the start of a file or after a completely empty line. - syn match rOTitle "\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag - syn match rOTitle "^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag - syn match rOTitleTag contained "@title" - syn match rOCommentKey "^\s*#\{1,2}'" contained - syn region rOExamples start="^#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold + syn region rOExamples start="^\s*#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold + + " R6 classes may contain roxygen lines independent of roxygen blocks + syn region rOR6Class start=/R6Class(/ end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError fold + syn match rOR6Block "#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained + syn match rOR6Block "^\s*#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained - " rOTag list generated from the lists in + " rOTag list originally generated from the lists that were available in " https://github.com/klutometis/roxygen/R/rd.R and " https://github.com/klutometis/roxygen/R/namespace.R " using s/^ \([A-Za-z0-9]*\) = .*/ syn match rOTag contained "@\1"/ @@ -155,7 +160,10 @@ if g:r_syntax_hl_roxygen syn match rOTag contained "@S3method" syn match rOTag contained "@useDynLib" " other + syn match rOTag contained "@eval" syn match rOTag contained "@include" + syn match rOTag contained "@includeRmd" + syn match rOTag contained "@order" endif @@ -186,6 +194,11 @@ syn match rSpecial display contained "\\U\x\{1,8}" syn match rSpecial display contained "\\u{\x\{1,4}}" syn match rSpecial display contained "\\U{\x\{1,8}}" +" Raw string +syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\)(/ end=/)\z2\z1/ keepend +syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\){/ end=/}\z2\z1/ keepend +syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\)\[/ end=/\]\z2\z1/ keepend + " Statement syn keyword rStatement break next return syn keyword rConditional if else @@ -354,6 +367,8 @@ hi def link rOperator Operator hi def link rOpError Error hi def link rParenError Error hi def link rPreProc PreProc +hi def link rRawString String +hi def link rRawStrDelim Delimiter hi def link rRepeat Repeat hi def link rSpecial SpecialChar hi def link rStatement Statement @@ -366,6 +381,7 @@ if g:r_syntax_hl_roxygen hi def link rOTitleBlock Title hi def link rOBlock Comment hi def link rOBlockNoTitle Comment + hi def link rOR6Block Comment hi def link rOTitle Title hi def link rOCommentKey Comment hi def link rOExamples SpecialComment diff --git a/runtime/syntax/raku.vim b/runtime/syntax/raku.vim new file mode 100644 index 0000000000..1bf9b4994c --- /dev/null +++ b/runtime/syntax/raku.vim @@ -0,0 +1,1971 @@ +" Vim syntax file +" Language: Raku +" Maintainer: vim-perl +" Homepage: https://github.com/Raku/vim-raku +" Bugs/requests: https://github.com/Raku/vim-raku/issues +" Last Change: 2021-04-16 + +" Contributors: Luke Palmer +" Moritz Lenz +" Hinrik Örn Sigurðsson +" +" This is a big undertaking. +" +" The ftdetect/raku.vim file in this repository takes care of setting the +" right filetype for Raku files. To set it explicitly you can also add this +" line near the bottom of your source file: +" # vim: filetype=raku + +" TODO: +" * Go over the list of keywords/types to see what's deprecated/missing +" * Add more support for folding (:help syn-fold) +" +" If you want to have Pir code inside Q:PIR// strings highlighted, do: +" let raku_embedded_pir=1 +" +" The above requires pir.vim, which you can find in Parrot's repository: +" https://github.com/parrot/parrot/tree/master/editor +" +" To highlight Perl 5 regexes (m:P5//): +" let raku_perl5_regexes=1 +" +" To enable folding: +" let raku_fold=1 + +if version < 704 | throw "raku.vim uses regex syntax which Vim <7.4 doesn't support. Try 'make fix_old_vim' in the vim-perl repository." | endif + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif +let s:keepcpo= &cpo +set cpo&vim + +" Patterns which will be interpolated by the preprocessor (tools/preproc.pl): +" +" @@IDENT_NONDIGIT@@ "[A-Za-z_\xC0-\xFF]" +" @@IDENT_CHAR@@ "[A-Za-z_\xC0-\xFF0-9]" +" @@IDENTIFIER@@ "\%(@@IDENT_NONDIGIT@@\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\@=\)*\)" +" @@IDENTIFIER_START@@ "@@IDENT_CHAR@@\@1". +syn match rakuKeywordStart display "\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!\)\@=[A-Za-z_\xC0-\xFF0-9]\@1" nextgroup=rakuDeclare,rakuIdentifier skipwhite skipempty +syn match rakuDeclare display "[.^]\@1" nextgroup=rakuIdentifier skipwhite skipempty +syn match rakuDeclareRegex display "[.^]\@1" nextgroup=rakuRegexName skipwhite skipempty + +syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@" +syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@».;\\∈∉∋∌∩∪≼≽⊂⊃⊄⊅⊆⊇⊈⊉⊍⊎⊖∅∘]" +syn match rakuOperator display "\%(:\@1][=+]\?\|cont\|elem\))" + +" Reverse, cross, and zip metaoperators +exec "syn match rakuRSXZOp display \"[RSXZ]:\\@!\\%(\\a\\@=\\%(". s:alpha_metaops_or . "\\)\\>\\|[[:alnum:]]\\@!\\%([.,]\\|[^[,.[:alnum:][:space:]]\\)\\+\\|\\s\\@=\\|$\\)\"" + +syn match rakuBlockLabel display "^\s*\zs\h\w*\s*::\@!\_s\@=" + +syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1" +syn match rakuContext display "\%(\$\|@\|%\|&\)(\@=" + +" Quoting + +" one cluster for every quote adverb +syn cluster rakuInterp_scalar + \ add=rakuInterpScalar + +syn cluster rakuInterp_array + \ add=rakuInterpArray + +syn cluster rakuInterp_hash + \ add=rakuInterpHash + +syn cluster rakuInterp_function + \ add=rakuInterpFunction + +syn cluster rakuInterp_closure + \ add=rakuInterpClosure + +syn cluster rakuInterp_q + \ add=rakuEscQQ + \ add=rakuEscBackSlash + +syn cluster rakuInterp_backslash + \ add=@rakuInterp_q + \ add=rakuEscape + \ add=rakuEscOpenCurly + \ add=rakuEscCodePoint + \ add=rakuEscHex + \ add=rakuEscOct + \ add=rakuEscOctOld + \ add=rakuEscNull + +syn cluster rakuInterp_qq + \ add=@rakuInterp_scalar + \ add=@rakuInterp_array + \ add=@rakuInterp_hash + \ add=@rakuInterp_function + \ add=@rakuInterp_closure + \ add=@rakuInterp_backslash + \ add=rakuMatchVarSigil + +syn region rakuInterpScalar + \ start="\ze\z(\$\%(\%(\%(\d\+\|!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" + \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" + \ end="\z1\zs" + \ contained keepend + \ contains=TOP + +syn region rakuInterpArray + \ matchgroup=rakuContext + \ start="@\ze()\@!" + \ skip="([^)]*)" + \ end=")\zs" + \ contained + \ contains=TOP + +syn region rakuInterpHash + \ start="\ze\z(%\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" + \ end="\z1\zs" + \ contained keepend + \ contains=TOP + +syn region rakuInterpHash + \ matchgroup=rakuContext + \ start="%\ze()\@!" + \ skip="([^)]*)" + \ end=")\zs" + \ contained + \ contains=TOP + +syn region rakuInterpFunction + \ start="\ze\z(&\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)" + \ end="\z1\zs" + \ contained keepend + \ contains=TOP + +syn region rakuInterpFunction + \ matchgroup=rakuContext + \ start="&\ze()\@!" + \ skip="([^)]*)" + \ end=")\zs" + \ contained + \ contains=TOP + +syn region rakuInterpClosure + \ start="\\\@1" contained +syn match rakuEscCloseFrench display "\\»" contained +syn match rakuEscBackTick display "\\`" contained +syn match rakuEscForwardSlash display "\\/" contained +syn match rakuEscVerticalBar display "\\|" contained +syn match rakuEscExclamation display "\\!" contained +syn match rakuEscComma display "\\," contained +syn match rakuEscDollar display "\\\$" contained +syn match rakuEscCloseCurly display "\\}" contained +syn match rakuEscCloseBracket display "\\\]" contained + +" matches :key, :!key, :$var, :key, etc +" Since we don't know in advance how the adverb ends, we use a trick. +" Consume nothing with the start pattern (\ze at the beginning), +" while capturing the whole adverb into \z1 and then putting it before +" the match start (\zs) of the end pattern. +syn region rakuAdverb + \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)" + \ start="\ze\z(:!\?[@$%]\$*\%(::\|\%(\$\@1<=\d\+\|!\|/\|¢\)\|\%(\%([.^*?=!~]\|:\@1 +" Distinguishing this from the "less than" operator is tricky. For now, +" it matches if any of the following is true: +" +" * There is whitespace missing on either side of the "<", since +" people tend to put spaces around "less than". We make an exception +" for " = < ... >" assignments though. +" * It comes after "enum", "for", "any", "all", or "none" +" * It's the first or last thing on a line (ignoring whitespace) +" * It's preceded by "(\s*" or "=\s\+" +" * It's empty and terminated on the same line (e.g. <> and < >) +" +" It never matches when: +" +" * Preceded by [<+~=!] (e.g. <>, =<$foo>, * !< 3) +" * Followed by [-=] (e.g. <--, <=, <==, <->) +syn region rakuStringAngle + \ matchgroup=rakuQuote + \ start="\%(\<\%(enum\|for\|any\|all\|none\)\>\s*(\?\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" + \ start="\%(\s\|[<+~=!]\)\@\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" + \ start="[<+~=!]\@1\|\%([=-]\{1,2}>\|[=-]\{1,2}\)\)\@!" + \ start="\%(^\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" + \ start="[<+~=!]\@1\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!" + \ start="<\%(\s*>\)\@=" + \ skip="\\\@1" + \ end=">" + \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle + +syn region rakuStringAngleFixed + \ matchgroup=rakuQuote + \ start="<" + \ skip="\\\@1" + \ end=">" + \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle + \ contained + +syn region rakuInnerAnglesOne + \ matchgroup=rakuStringAngle + \ start="\\\@1" + \ end=">" + \ transparent contained + \ contains=rakuInnerAnglesOne + +" <> +syn region rakuStringAngles + \ matchgroup=rakuQuote + \ start="<<=\@!" + \ skip="\\\@1" + \ end=">>" + \ contains=rakuInnerAnglesTwo,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseAngle,rakuAdverb,rakuStringSQ,rakuStringDQ + +syn region rakuInnerAnglesTwo + \ matchgroup=rakuStringAngles + \ start="<<" + \ skip="\\\@1" + \ end=">>" + \ transparent contained + \ contains=rakuInnerAnglesTwo + +" «words» +syn region rakuStringFrench + \ matchgroup=rakuQuote + \ start="«" + \ skip="\\\@1" and "«»" strings in order to override +" them, but before other types of strings, to avoid matching those delimiters +" as parts of hyperops. +syn match rakuHyperOp display #[^[:digit:][{('",:[:space:]][^[{('",:[:space:]]*\%(«\|<<\)# +syn match rakuHyperOp display "«\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+[«»]" +syn match rakuHyperOp display "»\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(«\|»\?\)" +syn match rakuHyperOp display "<<\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|>>\)" +syn match rakuHyperOp display ">>\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|\%(>>\)\?\)" + +" 'string' +syn region rakuStringSQ + \ matchgroup=rakuQuote + \ start="'" + \ skip="\\\@1", "rakuEscCloseAngle", "\\%(\\\\\\@1\\|<[^>]*>\\)"], + \ ["French", "«", "»", "rakuEscCloseFrench", "\\%(\\\\\\@1, @ +syn region rakuMatchVarSigil + \ matchgroup=rakuVariable + \ start="[$@]\%(<<\@!\)\@=" + \ end=">\@1<=" + \ contains=rakuMatchVar + +syn region rakuMatchVar + \ matchgroup=rakuTwigil + \ start="<" + \ end=">" + \ contained + +syn region rakuRxClosure + \ matchgroup=rakuNormal + \ start="{" + \ end="}" + \ contained + \ containedin=rakuRxClosure + \ contains=TOP +syn region rakuRxGroup + \ matchgroup=rakuStringSpecial2 + \ start="\[" + \ end="]" + \ contained + \ contains=@rakuRegexen,@rakuVariables,rakuMatchVarSigil +syn region rakuRxAssertion + \ matchgroup=rakuStringSpecial2 + \ start="<\%(?\?\%(before\|after\)\|\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\)\|[+?*]\)\?" + \ end=">" + \ contained + \ contains=@rakuRegexen,rakuIdentifier,@rakuVariables,rakuRxCharClass,rakuRxAssertCall +syn region rakuRxAssertGroup + \ matchgroup=rakuStringSpecial2 + \ start="<\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\[" + \ skip="\\\@1" + \ contained keepend + \ contains=TOP +syn match rakuRxBoundary display contained "\%([«»]\|<<\|>>\)" +syn region rakuRxCharClass + \ matchgroup=rakuStringSpecial2 + \ start="\%(<[-!+?]\?\)\@2<=\[" + \ skip="\\]" + \ end="]" + \ contained + \ contains=rakuRxRange,rakuRxEscape,rakuEscHex,rakuEscOct,rakuEscCodePoint,rakuEscNull +syn region rakuRxQuoteWords + \ matchgroup=rakuStringSpecial2 + \ start="<\s" + \ end="\s\?>" + \ contained +syn region rakuRxAdverb + \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)" + \ end="\z1\zs" + \ contained keepend + \ contains=TOP +syn region rakuRxAdverbArg + \ start="\%(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\@<=(" + \ skip="([^)]\{-})" + \ end=")" + \ contained + \ keepend + \ contains=TOP +syn region rakuRxStorage + \ matchgroup=rakuOperator + \ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@=" + \ end="$" + \ contains=TOP + \ contained + \ keepend + +" 'string' inside a regex +syn region rakuRxStringSQ + \ matchgroup=rakuQuote + \ start="'" + \ skip="\\\@1\)\)\@=" +syn match rakuVarSlash display "\$/" +syn match rakuVarExclam display "\$!" +syn match rakuVarMatch display "\$¢" +syn match rakuVarNum display "\$\d\+" +syn match rakuVariable display "self" +syn match rakuVariable display "[@$%&]\?[@&$%]\$*\%(::\|\%(\%([.^*?=!~]\|:\@1>\)" contained +syn match rakuTwigil display "\%([.^*?=!~]\|:\@1\|\<\%(if\|unless\|while\|when\|where\|so\)\)\s*\)\@<=/[/=]\@!" + \ skip="\\/" + \ end="/" + \ contains=@rakuRegexen,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum + +" m/foo/, m$foo$, m!foo!, etc +syn region rakuMatch + \ matchgroup=rakuQuote + \ start=+\z([/!$,|`"]\)+ + \ skip="\\\z1" + \ end="\z1" + \ contained + \ contains=@rakuRegexen,rakuVariable,rakuVarNum + +" m, m«foo», m{foo}, etc +for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims + exec "syn region rakuMatch matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables" +endfor +unlet s:name s:start_delim s:end_delim s:end_group s:skip + +" Substitutions + +" s/foo//, s$foo$$, s!foo!!, etc +syn region rakuSubstitution + \ matchgroup=rakuQuote + \ start=+\z([/!$,|`"]\)+ + \ skip="\\\z1" + \ end="\z1"me=e-1 + \ contained + \ contains=@rakuRegexen,rakuVariable,rakuVarNum + \ nextgroup=rakuReplacement + +syn region rakuReplacement + \ matchgroup=rakuQuote + \ start="\z(.\)" + \ skip="\\\z1" + \ end="\z1" + \ contained + \ contains=@rakuInterp_qq + +" s, s«foo»«bar», s{foo}{bar}, etc +for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims + exec "syn region rakuSubstitution matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables nextgroup=rakuRepl".s:name + exec "syn region rakuRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq" +endfor +unlet s:name s:start_delim s:end_delim s:end_group s:skip + +" Transliteration + +" tr/foo/bar/, tr|foo|bar, etc +syn region rakuTransliteration + \ matchgroup=rakuQuote + \ start=+\z([/!$,|`"]\)+ + \ skip="\\\z1" + \ end="\z1"me=e-1 + \ contained + \ contains=rakuRxRange + \ nextgroup=rakuTransRepl + +syn region rakuTransRepl + \ matchgroup=rakuQuote + \ start="\z(.\)" + \ skip="\\\z1" + \ end="\z1" + \ contained + \ contains=@rakuInterp_qq,rakuRxRange + +" tr, tr«foo»«bar», tr{foo}{bar}, etc +for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims + exec "syn region rakuTransliteration matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=rakuRxRange nextgroup=rakuTransRepl".s:name + exec "syn region rakuTransRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq,rakuRxRange" +endfor +unlet s:name s:start_delim s:end_delim s:end_group s:skip s:bracketing_delims + +if exists("raku_perl5_regexes") || exists("raku_extended_all") + +" Perl 5 regex regions + +syn cluster rakuRegexP5Base + \ add=rakuRxP5Escape + \ add=rakuRxP5Oct + \ add=rakuRxP5Hex + \ add=rakuRxP5EscMeta + \ add=rakuRxP5CodePoint + \ add=rakuRxP5Prop + +" normal regex stuff +syn cluster rakuRegexP5 + \ add=@rakuRegexP5Base + \ add=rakuRxP5Quantifier + \ add=rakuRxP5Meta + \ add=rakuRxP5QuoteMeta + \ add=rakuRxP5ParenMod + \ add=rakuRxP5Verb + \ add=rakuRxP5Count + \ add=rakuRxP5Named + \ add=rakuRxP5ReadRef + \ add=rakuRxP5WriteRef + \ add=rakuRxP5CharClass + \ add=rakuRxP5Anchor + +" inside character classes +syn cluster rakuRegexP5Class + \ add=@rakuRegexP5Base + \ add=rakuRxP5Posix + \ add=rakuRxP5Range + +syn match rakuRxP5Escape display contained "\\\S" +syn match rakuRxP5CodePoint display contained "\\c\S\@=" nextgroup=rakuRxP5CPId +syn match rakuRxP5CPId display contained "\S" +syn match rakuRxP5Oct display contained "\\\%(\o\{1,3}\)\@=" nextgroup=rakuRxP5OctSeq +syn match rakuRxP5OctSeq display contained "\o\{1,3}" +syn match rakuRxP5Anchor display contained "[\^$]" +syn match rakuRxP5Hex display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=rakuRxP5HexSeq +syn match rakuRxP5HexSeq display contained "\x\{1,2}" +syn region rakuRxP5HexSeq + \ matchgroup=rakuRxP5Escape + \ start="{" + \ end="}" + \ contained +syn region rakuRxP5Named + \ matchgroup=rakuRxP5Escape + \ start="\%(\\N\)\@2<={" + \ end="}" + \ contained +syn match rakuRxP5Quantifier display contained "\%([+*]\|(\@1" + \ contained +syn match rakuRxP5WriteRef display contained "\\g\%(\d\|{\)\@=" nextgroup=rakuRxP5WriteRefId +syn match rakuRxP5WriteRefId display contained "\d\+" +syn region rakuRxP5WriteRefId + \ matchgroup=rakuRxP5Escape + \ start="{" + \ end="}" + \ contained +syn match rakuRxP5Prop display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=rakuRxP5PropId +syn match rakuRxP5PropId display contained "\a" +syn region rakuRxP5PropId + \ matchgroup=rakuRxP5Escape + \ start="{" + \ end="}" + \ contained +syn match rakuRxP5Meta display contained "[(|).]" +syn match rakuRxP5ParenMod display contained "(\@1<=?\@=" nextgroup=rakuRxP5Mod,rakuRxP5ModName,rakuRxP5Code +syn match rakuRxP5Mod display contained "?\%(<\?=\|<\?!\|[#:|]\)" +syn match rakuRxP5Mod display contained "?-\?[impsx]\+" +syn match rakuRxP5Mod display contained "?\%([-+]\?\d\+\|R\)" +syn match rakuRxP5Mod display contained "?(DEFINE)" +syn match rakuRxP5Mod display contained "?\%(&\|P[>=]\)" nextgroup=rakuRxP5ModDef +syn match rakuRxP5ModDef display contained "\h\w*" +syn region rakuRxP5ModName + \ matchgroup=rakuStringSpecial + \ start="?'" + \ end="'" + \ contained +syn region rakuRxP5ModName + \ matchgroup=rakuStringSpecial + \ start="?P\?<" + \ end=">" + \ contained +syn region rakuRxP5Code + \ matchgroup=rakuStringSpecial + \ start="??\?{" + \ end="})\@=" + \ contained + \ contains=TOP +syn match rakuRxP5EscMeta display contained "\\[?*.{}()[\]|\^$]" +syn match rakuRxP5Count display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=rakuRxP5CountId +syn region rakuRxP5CountId + \ matchgroup=rakuRxP5Escape + \ start="{" + \ end="}" + \ contained +syn match rakuRxP5Verb display contained "(\@1<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)" +syn region rakuRxP5QuoteMeta + \ matchgroup=rakuRxP5Escape + \ start="\\Q" + \ end="\\E" + \ contained + \ contains=@rakuVariables,rakuEscBackSlash +syn region rakuRxP5CharClass + \ matchgroup=rakuStringSpecial + \ start="\[\^\?" + \ skip="\\]" + \ end="]" + \ contained + \ contains=@rakuRegexP5Class +syn region rakuRxP5Posix + \ matchgroup=rakuRxP5Escape + \ start="\[:" + \ end=":]" + \ contained +syn match rakuRxP5Range display contained "-" + +" m:P5// +syn region rakuMatch + \ matchgroup=rakuQuote + \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2 +syn region rakuMatch + \ matchgroup=rakuQuote + \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2\@!" + \ skip="\\>" + \ end=">" + \ contains=@rakuRegexP5,rakuVariables + +" m:P5«» +syn region rakuMatch + \ matchgroup=rakuQuote + \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2]*>" + \ end=">" + \ contains=rakuAttention,rakuBracketComment +syn region rakuBracketComment + \ start="#[`|=]«" + \ skip="«[^»]*»" + \ end="»" + \ contains=rakuAttention,rakuBracketComment + +" Comments with double and triple delimiters +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]((" + \ skip="((\%([^)\|))\@!]\)*))" + \ end="))" + \ contains=rakuAttention,rakuBracketComment +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=](((" + \ skip="(((\%([^)]\|)\%())\)\@!\)*)))" + \ end=")))" + \ contains=rakuAttention,rakuBracketComment + +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]\[\[" + \ skip="\[\[\%([^\]]\|]]\@!\)*]]" + \ end="]]" + \ contains=rakuAttention,rakuBracketComment +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]\[\[\[" + \ skip="\[\[\[\%([^\]]\|]\%(]]\)\@!\)*]]]" + \ end="]]]" + \ contains=rakuAttention,rakuBracketComment + +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]{{" + \ skip="{{\%([^}]\|}}\@!\)*}}" + \ end="}}" + \ contains=rakuAttention,rakuBracketComment +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]{{{" + \ skip="{{{\%([^}]\|}\%(}}\)\@!\)*}}}" + \ end="}}}" + \ contains=rakuAttention,rakuBracketComment + +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]<<" + \ skip="<<\%([^>]\|>>\@!\)*>>" + \ end=">>" + \ contains=rakuAttention,rakuBracketComment +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]<<<" + \ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>" + \ end=">>>" + \ contains=rakuAttention,rakuBracketComment + +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]««" + \ skip="««\%([^»]\|»»\@!\)*»»" + \ end="»»" + \ contains=rakuAttention,rakuBracketComment +syn region rakuBracketComment + \ matchgroup=rakuBracketComment + \ start="#[`|=]«««" + \ skip="«««\%([^»]\|»\%(»»\)\@!\)*»»»" + \ end="»»»" + \ contains=rakuAttention,rakuBracketComment + +syn match rakuShebang display "\%^#!.*" + +" => autoquoting +syn match rakuStringAuto display "\.\@1" +syn match rakuStringAuto display "\.\@1" +syn match rakuStringAuto display "\.\@1" + +" Pod + +" Abbreviated blocks (implicit code forbidden) +syn region rakuPodAbbrRegion + \ matchgroup=rakuPodPrefix + \ start="^\s*\zs=\ze\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contains=rakuPodAbbrNoCodeType + \ keepend + +syn region rakuPodAbbrNoCodeType + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=rakuPodName,rakuPodAbbrNoCode + +syn match rakuPodName contained ".\+" contains=@rakuPodFormat +syn match rakuPodComment contained ".\+" + +syn region rakuPodAbbrNoCode + \ start="^" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=@rakuPodFormat + +" Abbreviated blocks (everything is code) +syn region rakuPodAbbrRegion + \ matchgroup=rakuPodPrefix + \ start="^\s*\zs=\zecode\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contains=rakuPodAbbrCodeType + \ keepend + +syn region rakuPodAbbrCodeType + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=rakuPodName,rakuPodAbbrCode + +syn region rakuPodAbbrCode + \ start="^" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + +" Abbreviated blocks (everything is a comment) +syn region rakuPodAbbrRegion + \ matchgroup=rakuPodPrefix + \ start="^=\zecomment\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contains=rakuPodAbbrCommentType + \ keepend + +syn region rakuPodAbbrCommentType + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=rakuPodComment,rakuPodAbbrNoCode + +" Abbreviated blocks (implicit code allowed) +syn region rakuPodAbbrRegion + \ matchgroup=rakuPodPrefix + \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contains=rakuPodAbbrType + \ keepend + +syn region rakuPodAbbrType + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=rakuPodName,rakuPodAbbr + +syn region rakuPodAbbr + \ start="^" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=@rakuPodFormat,rakuPodImplicitCode + +" Abbreviated block to end-of-file +syn region rakuPodAbbrRegion + \ matchgroup=rakuPodPrefix + \ start="^=\zeEND\>" + \ end="\%$" + \ contains=rakuPodAbbrEOFType + \ keepend + +syn region rakuPodAbbrEOFType + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="\%$" + \ contained + \ contains=rakuPodName,rakuPodAbbrEOF + +syn region rakuPodAbbrEOF + \ start="^" + \ end="\%$" + \ contained + \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode + +" Directives +syn region rakuPodDirectRegion + \ matchgroup=rakuPodPrefix + \ start="^=\%(config\|use\)\>" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" + \ contains=rakuPodDirectArgRegion + \ keepend + +syn region rakuPodDirectArgRegion + \ matchgroup=rakuPodType + \ start="\S\+" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" + \ contained + \ contains=rakuPodDirectConfigRegion + +syn region rakuPodDirectConfigRegion + \ start="" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" + \ contained + \ contains=@rakuPodConfig + +" =encoding is a special directive +syn region rakuPodDirectRegion + \ matchgroup=rakuPodPrefix + \ start="^=encoding\>" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" + \ contains=rakuPodEncodingArgRegion + \ keepend + +syn region rakuPodEncodingArgRegion + \ matchgroup=rakuPodName + \ start="\S\+" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" + \ contained + +" Paragraph blocks (implicit code forbidden) +syn region rakuPodParaRegion + \ matchgroup=rakuPodPrefix + \ start="^\s*\zs=for\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contains=rakuPodParaNoCodeTypeRegion + \ keepend extend + +syn region rakuPodParaNoCodeTypeRegion + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=rakuPodParaNoCode,rakuPodParaConfigRegion + +syn region rakuPodParaConfigRegion + \ start="" + \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\@1\ze\s*code\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contains=rakuPodParaCodeTypeRegion + \ keepend extend + +syn region rakuPodParaCodeTypeRegion + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=rakuPodParaCode,rakuPodParaConfigRegion + +syn region rakuPodParaCode + \ start="^[^=]" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + +" Paragraph blocks (implicit code allowed) +syn region rakuPodParaRegion + \ matchgroup=rakuPodPrefix + \ start="^\s*\zs=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" + \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contains=rakuPodParaTypeRegion + \ keepend extend + +syn region rakuPodParaTypeRegion + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=rakuPodPara,rakuPodParaConfigRegion + +syn region rakuPodPara + \ start="^[^=]" + \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)" + \ contained + \ contains=@rakuPodFormat,rakuPodImplicitCode + +" Paragraph block to end-of-file +syn region rakuPodParaRegion + \ matchgroup=rakuPodPrefix + \ start="^=for\>\ze\s\+END\>" + \ end="\%$" + \ contains=rakuPodParaEOFTypeRegion + \ keepend extend + +syn region rakuPodParaEOFTypeRegion + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="\%$" + \ contained + \ contains=rakuPodParaEOF,rakuPodParaConfigRegion + +syn region rakuPodParaEOF + \ start="^[^=]" + \ end="\%$" + \ contained + \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode + +" Delimited blocks (implicit code forbidden) +syn region rakuPodDelimRegion + \ matchgroup=rakuPodPrefix + \ start="^\z(\s*\)\zs=begin\>" + \ end="^\z1\zs=end\>" + \ contains=rakuPodDelimNoCodeTypeRegion + \ keepend extend skipwhite + \ nextgroup=rakuPodType + +syn region rakuPodDelimNoCodeTypeRegion + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze=end\>" + \ contained + \ contains=rakuPodDelimNoCode,rakuPodDelimConfigRegion + +syn region rakuPodDelimConfigRegion + \ start="" + \ end="^\s*\zs\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)" + \ contained + \ contains=@rakuPodConfig + +syn region rakuPodDelimNoCode + \ start="^" + \ end="^\s*\zs\ze=end\>" + \ contained + \ contains=@rakuPodNestedBlocks,@rakuPodFormat + +" Delimited blocks (everything is code) +syn region rakuPodDelimRegion + \ matchgroup=rakuPodPrefix + \ start="^\z(\s*\)\zs=begin\>\ze\s*code\>" + \ end="^\z1\zs=end\>" + \ contains=rakuPodDelimCodeTypeRegion + \ keepend extend skipwhite + \ nextgroup=rakuPodType + +syn region rakuPodDelimCodeTypeRegion + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze=end\>" + \ contained + \ contains=rakuPodDelimCode,rakuPodDelimConfigRegion + +syn region rakuPodDelimCode + \ start="^" + \ end="^\s*\zs\ze=end\>" + \ contained + \ contains=@rakuPodNestedBlocks + +" Delimited blocks (implicit code allowed) +syn region rakuPodDelimRegion + \ matchgroup=rakuPodPrefix + \ start="^\z(\s*\)\zs=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>" + \ end="^\z1\zs=end\>" + \ contains=rakuPodDelimTypeRegion + \ keepend extend skipwhite + \ nextgroup=rakuPodType + +syn region rakuPodDelimTypeRegion + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="^\s*\zs\ze=end\>" + \ contained + \ contains=rakuPodDelim,rakuPodDelimConfigRegion + +syn region rakuPodDelim + \ start="^" + \ end="^\s*\zs\ze=end\>" + \ contained + \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode + +" Delimited block to end-of-file +syn region rakuPodDelimRegion + \ matchgroup=rakuPodPrefix + \ start="^=begin\>\ze\s\+END\>" + \ end="\%$" + \ extend + \ contains=rakuPodDelimEOFTypeRegion + +syn region rakuPodDelimEOFTypeRegion + \ matchgroup=rakuPodType + \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + \ end="\%$" + \ contained + \ contains=rakuPodDelimEOF,rakuPodDelimConfigRegion + +syn region rakuPodDelimEOF + \ start="^" + \ end="\%$" + \ contained + \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode + +syn cluster rakuPodConfig + \ add=rakuPodConfigOperator + \ add=rakuPodExtraConfig + \ add=rakuStringAuto + \ add=rakuPodAutoQuote + \ add=rakuStringSQ + +syn region rakuPodParens + \ start="(" + \ end=")" + \ contained + \ contains=rakuNumber,rakuStringSQ + +syn match rakuPodAutoQuote display contained "=>" +syn match rakuPodConfigOperator display contained ":!\?" nextgroup=rakuPodConfigOption +syn match rakuPodConfigOption display contained "[^[:space:](<]\+" nextgroup=rakuPodParens,rakuStringAngle +syn match rakuPodExtraConfig display contained "^=" +syn match rakuPodVerticalBar display contained "|" +syn match rakuPodColon display contained ":" +syn match rakuPodSemicolon display contained ";" +syn match rakuPodComma display contained "," +syn match rakuPodImplicitCode display contained "^\s.*" +syn match rakuPodType display contained "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" + +" These may appear inside delimited blocks +syn cluster rakuPodNestedBlocks + \ add=rakuPodAbbrRegion + \ add=rakuPodDirectRegion + \ add=rakuPodParaRegion + \ add=rakuPodDelimRegion + +" Pod formatting codes + +syn cluster rakuPodFormat + \ add=rakuPodFormatOne + \ add=rakuPodFormatTwo + \ add=rakuPodFormatThree + \ add=rakuPodFormatFrench + +" Balanced angles found inside formatting codes. Ensures proper nesting. + +syn region rakuPodFormatAnglesOne + \ matchgroup=rakuPodFormat + \ start="<" + \ skip="<[^>]*>" + \ end=">" + \ transparent contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne + +syn region rakuPodFormatAnglesTwo + \ matchgroup=rakuPodFormat + \ start="<<" + \ skip="<<[^>]*>>" + \ end=">>" + \ transparent contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo + +syn region rakuPodFormatAnglesThree + \ matchgroup=rakuPodFormat + \ start="<<<" + \ skip="<<<[^>]*>>>" + \ end=">>>" + \ transparent contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree + +syn region rakuPodFormatAnglesFrench + \ matchgroup=rakuPodFormat + \ start="«" + \ skip="«[^»]*»" + \ end="»" + \ transparent contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree + +" All formatting codes + +syn region rakuPodFormatOne + \ matchgroup=rakuPodFormatCode + \ start="\u<" + \ skip="<[^>]*>" + \ end=">" + \ contained + \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne + +syn region rakuPodFormatTwo + \ matchgroup=rakuPodFormatCode + \ start="\u<<" + \ skip="<<[^>]*>>" + \ end=">>" + \ contained + \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo + +syn region rakuPodFormatThree + \ matchgroup=rakuPodFormatCode + \ start="\u<<<" + \ skip="<<<[^>]*>>>" + \ end=">>>" + \ contained + \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree + +syn region rakuPodFormatFrench + \ matchgroup=rakuPodFormatCode + \ start="\u«" + \ skip="«[^»]*»" + \ end="»" + \ contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree + +" C<> and V<> don't allow nested formatting formatting codes + +syn region rakuPodFormatOne + \ matchgroup=rakuPodFormatCode + \ start="[CV]<" + \ skip="<[^>]*>" + \ end=">" + \ contained + \ contains=rakuPodFormatAnglesOne + +syn region rakuPodFormatTwo + \ matchgroup=rakuPodFormatCode + \ start="[CV]<<" + \ skip="<<[^>]*>>" + \ end=">>" + \ contained + \ contains=rakuPodFormatAnglesTwo + +syn region rakuPodFormatThree + \ matchgroup=rakuPodFormatCode + \ start="[CV]<<<" + \ skip="<<<[^>]*>>>" + \ end=">>>" + \ contained + \ contains=rakuPodFormatAnglesThree + +syn region rakuPodFormatFrench + \ matchgroup=rakuPodFormatCode + \ start="[CV]«" + \ skip="«[^»]*»" + \ end="»" + \ contained + \ contains=rakuPodFormatAnglesFrench + +" L<> can have a "|" separator + +syn region rakuPodFormatOne + \ matchgroup=rakuPodFormatCode + \ start="L<" + \ skip="<[^>]*>" + \ end=">" + \ contained + \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar + +syn region rakuPodFormatTwo + \ matchgroup=rakuPodFormatCode + \ start="L<<" + \ skip="<<[^>]*>>" + \ end=">>" + \ contained + \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar + +syn region rakuPodFormatThree + \ matchgroup=rakuPodFormatCode + \ start="L<<<" + \ skip="<<<[^>]*>>>" + \ end=">>>" + \ contained + \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar + +syn region rakuPodFormatFrench + \ matchgroup=rakuPodFormatCode + \ start="L«" + \ skip="«[^»]*»" + \ end="»" + \ contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar + +" E<> can have a ";" separator + +syn region rakuPodFormatOne + \ matchgroup=rakuPodFormatCode + \ start="E<" + \ skip="<[^>]*>" + \ end=">" + \ contained + \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodSemiColon + +syn region rakuPodFormatTwo + \ matchgroup=rakuPodFormatCode + \ start="E<<" + \ skip="<<[^>]*>>" + \ end=">>" + \ contained + \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodSemiColon + +syn region rakuPodFormatThree + \ matchgroup=rakuPodFormatCode + \ start="E<<<" + \ skip="<<<[^>]*>>>" + \ end=">>>" + \ contained + \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon + +syn region rakuPodFormatFrench + \ matchgroup=rakuPodFormatCode + \ start="E«" + \ skip="«[^»]*»" + \ end="»" + \ contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon + +" M<> can have a ":" separator + +syn region rakuPodFormatOne + \ matchgroup=rakuPodFormatCode + \ start="M<" + \ skip="<[^>]*>" + \ end=">" + \ contained + \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodColon + +syn region rakuPodFormatTwo + \ matchgroup=rakuPodFormatCode + \ start="M<<" + \ skip="<<[^>]*>>" + \ end=">>" + \ contained + \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodColon + +syn region rakuPodFormatThree + \ matchgroup=rakuPodFormatCode + \ start="M<<<" + \ skip="<<<[^>]*>>>" + \ end=">>>" + \ contained + \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon + +syn region rakuPodFormatFrench + \ matchgroup=rakuPodFormatCode + \ start="M«" + \ skip="«[^»]*»" + \ end="»" + \ contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon + +" D<> can have "|" and ";" separators + +syn region rakuPodFormatOne + \ matchgroup=rakuPodFormatCode + \ start="D<" + \ skip="<[^>]*>" + \ end=">" + \ contained + \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon + +syn region rakuPodFormatTwo + \ matchgroup=rakuPodFormatCode + \ start="D<<" + \ skip="<<[^>]*>>" + \ end=">>" + \ contained + \ contains=rakuPodFormatAngleTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon + +syn region rakuPodFormatThree + \ matchgroup=rakuPodFormatCode + \ start="D<<<" + \ skip="<<<[^>]*>>>" + \ end=">>>" + \ contained + \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon + +syn region rakuPodFormatFrench + \ matchgroup=rakuPodFormatCode + \ start="D«" + \ skip="«[^»]*»" + \ end="»" + \ contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon + +" X<> can have "|", "," and ";" separators + +syn region rakuPodFormatOne + \ matchgroup=rakuPodFormatCode + \ start="X<" + \ skip="<[^>]*>" + \ end=">" + \ contained + \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma + +syn region rakuPodFormatTwo + \ matchgroup=rakuPodFormatCode + \ start="X<<" + \ skip="<<[^>]*>>" + \ end=">>" + \ contained + \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma + +syn region rakuPodFormatThree + \ matchgroup=rakuPodFormatCode + \ start="X<<<" + \ skip="<<<[^>]*>>>" + \ end=">>>" + \ contained + \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma + +syn region rakuPodFormatFrench + \ matchgroup=rakuPodFormatCode + \ start="X«" + \ skip="«[^»]*»" + \ end="»" + \ contained + \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet +if version >= 508 || !exists("did_raku_syntax_inits") + if version < 508 + let did_raku_syntax_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink rakuEscOctOld rakuError + HiLink rakuPackageTwigil rakuTwigil + HiLink rakuStringAngle rakuString + HiLink rakuStringAngleFixed rakuString + HiLink rakuStringFrench rakuString + HiLink rakuStringAngles rakuString + HiLink rakuStringSQ rakuString + HiLink rakuStringDQ rakuString + HiLink rakuStringQ rakuString + HiLink rakuStringQ_q rakuString + HiLink rakuStringQ_qww rakuString + HiLink rakuStringQ_qq rakuString + HiLink rakuStringQ_to rakuString + HiLink rakuStringQ_qto rakuString + HiLink rakuStringQ_qqto rakuString + HiLink rakuRxStringSQ rakuString + HiLink rakuRxStringDQ rakuString + HiLink rakuReplacement rakuString + HiLink rakuReplCurly rakuString + HiLink rakuReplAngle rakuString + HiLink rakuReplFrench rakuString + HiLink rakuReplBracket rakuString + HiLink rakuReplParen rakuString + HiLink rakuTransliteration rakuString + HiLink rakuTransRepl rakuString + HiLink rakuTransReplCurly rakuString + HiLink rakuTransReplAngle rakuString + HiLink rakuTransReplFrench rakuString + HiLink rakuTransReplBracket rakuString + HiLink rakuTransReplParen rakuString + HiLink rakuStringAuto rakuString + HiLink rakuKey rakuString + HiLink rakuMatch rakuString + HiLink rakuSubstitution rakuString + HiLink rakuMatchBare rakuString + HiLink rakuRegexBlock rakuString + HiLink rakuRxP5CharClass rakuString + HiLink rakuRxP5QuoteMeta rakuString + HiLink rakuRxCharClass rakuString + HiLink rakuRxQuoteWords rakuString + HiLink rakuReduceOp rakuOperator + HiLink rakuSetOp rakuOperator + HiLink rakuRSXZOp rakuOperator + HiLink rakuHyperOp rakuOperator + HiLink rakuPostHyperOp rakuOperator + HiLink rakuQuoteQ rakuQuote + HiLink rakuQuoteQ_q rakuQuote + HiLink rakuQuoteQ_qww rakuQuote + HiLink rakuQuoteQ_qq rakuQuote + HiLink rakuQuoteQ_to rakuQuote + HiLink rakuQuoteQ_qto rakuQuote + HiLink rakuQuoteQ_qqto rakuQuote + HiLink rakuQuoteQ_PIR rakuQuote + HiLink rakuMatchStart_m rakuQuote + HiLink rakuMatchStart_s rakuQuote + HiLink rakuMatchStart_tr rakuQuote + HiLink rakuBareSigil rakuVariable + HiLink rakuRxRange rakuStringSpecial + HiLink rakuRxAnchor rakuStringSpecial + HiLink rakuRxBoundary rakuStringSpecial + HiLink rakuRxP5Anchor rakuStringSpecial + HiLink rakuCodePoint rakuStringSpecial + HiLink rakuRxMeta rakuStringSpecial + HiLink rakuRxP5Range rakuStringSpecial + HiLink rakuRxP5CPId rakuStringSpecial + HiLink rakuRxP5Posix rakuStringSpecial + HiLink rakuRxP5Mod rakuStringSpecial + HiLink rakuRxP5HexSeq rakuStringSpecial + HiLink rakuRxP5OctSeq rakuStringSpecial + HiLink rakuRxP5WriteRefId rakuStringSpecial + HiLink rakuHexSequence rakuStringSpecial + HiLink rakuOctSequence rakuStringSpecial + HiLink rakuRxP5Named rakuStringSpecial + HiLink rakuRxP5PropId rakuStringSpecial + HiLink rakuRxP5Quantifier rakuStringSpecial + HiLink rakuRxP5CountId rakuStringSpecial + HiLink rakuRxP5Verb rakuStringSpecial + HiLink rakuRxAssertGroup rakuStringSpecial2 + HiLink rakuEscape rakuStringSpecial2 + HiLink rakuEscNull rakuStringSpecial2 + HiLink rakuEscHash rakuStringSpecial2 + HiLink rakuEscQQ rakuStringSpecial2 + HiLink rakuEscQuote rakuStringSpecial2 + HiLink rakuEscDoubleQuote rakuStringSpecial2 + HiLink rakuEscBackTick rakuStringSpecial2 + HiLink rakuEscForwardSlash rakuStringSpecial2 + HiLink rakuEscVerticalBar rakuStringSpecial2 + HiLink rakuEscExclamation rakuStringSpecial2 + HiLink rakuEscDollar rakuStringSpecial2 + HiLink rakuEscOpenCurly rakuStringSpecial2 + HiLink rakuEscCloseCurly rakuStringSpecial2 + HiLink rakuEscCloseBracket rakuStringSpecial2 + HiLink rakuEscCloseAngle rakuStringSpecial2 + HiLink rakuEscCloseFrench rakuStringSpecial2 + HiLink rakuEscBackSlash rakuStringSpecial2 + HiLink rakuEscCodePoint rakuStringSpecial2 + HiLink rakuEscOct rakuStringSpecial2 + HiLink rakuEscHex rakuStringSpecial2 + HiLink rakuRxEscape rakuStringSpecial2 + HiLink rakuRxCapture rakuStringSpecial2 + HiLink rakuRxAlternation rakuStringSpecial2 + HiLink rakuRxP5 rakuStringSpecial2 + HiLink rakuRxP5ReadRef rakuStringSpecial2 + HiLink rakuRxP5Oct rakuStringSpecial2 + HiLink rakuRxP5Hex rakuStringSpecial2 + HiLink rakuRxP5EscMeta rakuStringSpecial2 + HiLink rakuRxP5Meta rakuStringSpecial2 + HiLink rakuRxP5Escape rakuStringSpecial2 + HiLink rakuRxP5CodePoint rakuStringSpecial2 + HiLink rakuRxP5WriteRef rakuStringSpecial2 + HiLink rakuRxP5Prop rakuStringSpecial2 + + HiLink rakuProperty Tag + HiLink rakuAttention Todo + HiLink rakuType Type + HiLink rakuError Error + HiLink rakuBlockLabel Label + HiLink rakuNormal Normal + HiLink rakuIdentifier Normal + HiLink rakuPackage Normal + HiLink rakuPackageScope Normal + HiLink rakuNumber Number + HiLink rakuOctNumber Number + HiLink rakuBinNumber Number + HiLink rakuHexNumber Number + HiLink rakuDecNumber Number + HiLink rakuString String + HiLink rakuRepeat Repeat + HiLink rakuPragma Keyword + HiLink rakuPreDeclare Keyword + HiLink rakuDeclare Keyword + HiLink rakuDeclareRegex Keyword + HiLink rakuVarStorage Special + HiLink rakuFlowControl Special + HiLink rakuOctBase Special + HiLink rakuBinBase Special + HiLink rakuHexBase Special + HiLink rakuDecBase Special + HiLink rakuTwigil Special + HiLink rakuStringSpecial2 Special + HiLink rakuVersion Special + HiLink rakuComment Comment + HiLink rakuBracketComment Comment + HiLink rakuInclude Include + HiLink rakuShebang PreProc + HiLink rakuClosureTrait PreProc + HiLink rakuOperator Operator + HiLink rakuContext Operator + HiLink rakuQuote Delimiter + HiLink rakuTypeConstraint PreCondit + HiLink rakuException Exception + HiLink rakuVariable Identifier + HiLink rakuVarSlash Identifier + HiLink rakuVarNum Identifier + HiLink rakuVarExclam Identifier + HiLink rakuVarMatch Identifier + HiLink rakuVarName Identifier + HiLink rakuMatchVar Identifier + HiLink rakuRxP5ReadRefId Identifier + HiLink rakuRxP5ModDef Identifier + HiLink rakuRxP5ModName Identifier + HiLink rakuConditional Conditional + HiLink rakuStringSpecial SpecialChar + + HiLink rakuPodAbbr rakuPod + HiLink rakuPodAbbrEOF rakuPod + HiLink rakuPodAbbrNoCode rakuPod + HiLink rakuPodAbbrCode rakuPodCode + HiLink rakuPodPara rakuPod + HiLink rakuPodParaEOF rakuPod + HiLink rakuPodParaNoCode rakuPod + HiLink rakuPodParaCode rakuPodCode + HiLink rakuPodDelim rakuPod + HiLink rakuPodDelimEOF rakuPod + HiLink rakuPodDelimNoCode rakuPod + HiLink rakuPodDelimCode rakuPodCode + HiLink rakuPodImplicitCode rakuPodCode + HiLink rakuPodExtraConfig rakuPodPrefix + HiLink rakuPodVerticalBar rakuPodFormatCode + HiLink rakuPodColon rakuPodFormatCode + HiLink rakuPodSemicolon rakuPodFormatCode + HiLink rakuPodComma rakuPodFormatCode + HiLink rakuPodFormatOne rakuPodFormat + HiLink rakuPodFormatTwo rakuPodFormat + HiLink rakuPodFormatThree rakuPodFormat + HiLink rakuPodFormatFrench rakuPodFormat + + HiLink rakuPodType Type + HiLink rakuPodConfigOption String + HiLink rakuPodCode PreProc + HiLink rakuPod Comment + HiLink rakuPodComment Comment + HiLink rakuPodAutoQuote Operator + HiLink rakuPodConfigOperator Operator + HiLink rakuPodPrefix Statement + HiLink rakuPodName Identifier + HiLink rakuPodFormatCode SpecialChar + HiLink rakuPodFormat SpecialComment + + delcommand HiLink +endif + +if exists("raku_fold") || exists("raku_extended_all") + setl foldmethod=syntax + syn region rakuBlockFold + \ start="^\z(\s*\)\%(my\|our\|augment\|multi\|proto\|only\)\?\s*\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\s\+\)\?\<\%(CATCH\|try\|ENTER\|LEAVE\|CHECK\|INIT\|BEGIN\|END\|KEEP\|UNDO\|PRE\|POST\|module\|package\|enum\|subset\|class\|sub\%(method\)\?\|multi\|method\|slang\|grammar\|regex\|token\|rule\)\>[^{]\+\%({\s*\%(#.*\)\?\)\?$" + \ end="^\z1}" + \ transparent fold keepend extend +endif + +let b:current_syntax = "raku" + +let &cpo = s:keepcpo +unlet s:keepcpo + +" vim:ts=8:sts=4:sw=4:expandtab:ft=vim diff --git a/runtime/syntax/rmd.vim b/runtime/syntax/rmd.vim index d852d225bc..cccd4110f5 100644 --- a/runtime/syntax/rmd.vim +++ b/runtime/syntax/rmd.vim @@ -1,7 +1,7 @@ " markdown Text with R statements " Language: markdown with R code chunks " Homepage: https://github.com/jalvesaq/R-Vim-runtime -" Last Change: Thu Apr 18, 2019 09:17PM +" Last Change: Wed Apr 21, 2021 09:55AM " " For highlighting pandoc extensions to markdown like citations and TeX and " many other advanced features like folding of markdown sections, it is @@ -13,27 +13,45 @@ if exists("b:current_syntax") finish endif -" Configuration if not using pandoc syntax: -" Add syntax highlighting of YAML header -let g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1) -" Add syntax highlighting of citation keys -let g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1) -" Highlight the header of the chunk of R code -let g:rmd_syn_hl_chunk = get(g:, 'g:rmd_syn_hl_chunk', 0) +" Highlight the header of the chunks as R code +let g:rmd_syn_hl_chunk = get(g:, 'rmd_syn_hl_chunk', 0) " Pandoc-syntax has more features, but it is slower. " https://github.com/vim-pandoc/vim-pandoc-syntax let g:pandoc#syntax#codeblocks#embeds#langs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', ['r']) runtime syntax/pandoc.vim if exists("b:current_syntax") - " Fix recognition of R code - syn region pandocDelimitedCodeBlock_r start=/^```{r\>.*}$/ end=/^```$/ contained containedin=pandocDelimitedCodeBlock contains=@R + " Recognize inline R code syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@R containedin=pandocLaTeXRegion,yamlFlowString keepend hi def link rmdInlineDelim Delimiter + + " Fix recognition of language chunks (code adapted from pandoc, 2021-03-28) + " Knitr requires braces in the block's header + for s:lng in g:pandoc#syntax#codeblocks#embeds#langs + let s:nm = matchstr(s:lng, '^[^=]*') + exe 'syn clear pandocDelimitedCodeBlock_'.s:nm + exe 'syn clear pandocDelimitedCodeBlockinBlockQuote_'.s:nm + if g:rmd_syn_hl_chunk + exe 'syn region rmd'.s:nm.'ChunkDelim matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>" matchgroup=rmdCodeDelim end="}$" keepend containedin=rmd'.s:nm.'Chunk contains=@R' + exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=rmd'.s:nm.'ChunkDelim,@'.toupper(s:nm) + else + exe 'syn region rmd'.s:nm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@'.toupper(s:nm) + endif + endfor + unlet s:lng + unlet s:nm + hi def link rmdInlineDelim Delimiter + hi def link rmdCodeDelim Delimiter let b:current_syntax = "rmd" finish endif +" Configuration if not using pandoc syntax: +" Add syntax highlighting of YAML header +let g:rmd_syn_hl_yaml = get(g:, 'rmd_syn_hl_yaml', 1) +" Add syntax highlighting of citation keys +let g:rmd_syn_hl_citations = get(g:, 'rmd_syn_hl_citations', 1) + let s:cpo_save = &cpo set cpo&vim @@ -63,15 +81,17 @@ for s:type in g:rmd_fenced_languages unlet! b:current_syntax exe 'syn include @Rmd'.s:nm.' syntax/'.s:ft.'.vim' if g:rmd_syn_hl_chunk - exe 'syn region rmd'.s:nm.'ChunkDelim matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>" matchgroup=rmdCodeDelim end="}$" keepend containedin=rmd'.s:nm.'Chunk contains=@Rmd'.s:nm + exe 'syn region rmd'.s:nm.'ChunkDelim matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>" matchgroup=rmdCodeDelim end="}$" keepend containedin=rmd'.s:nm.'Chunk contains=@Rmdr' exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=rmd'.s:nm.'ChunkDelim,@Rmd'.s:nm else exe 'syn region rmd'.s:nm.'Chunk matchgroup=rmdCodeDelim start="^\s*```\s*{\s*'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=@Rmd'.s:nm endif - exe 'syn region rmd'.s:nm.'Inline matchgroup=rmdInlineDelim start="`'.s:nm.' " end="`" contains=@Rmd'.s:nm.' keepend' endfor unlet! s:type +" Recognize inline R code +syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr keepend + hi def link rmdInlineDelim Delimiter hi def link rmdCodeDelim Delimiter diff --git a/runtime/syntax/rnoweb.vim b/runtime/syntax/rnoweb.vim index b2ba17d68d..749860a3fe 100644 --- a/runtime/syntax/rnoweb.vim +++ b/runtime/syntax/rnoweb.vim @@ -33,8 +33,8 @@ syn cluster texParaGroup add=@rnoweb " Highlighting of R code using an existing r.vim syntax file if available {{{1 syn include @rnowebR syntax/r.vim -syn region rnowebChunk matchgroup=rnowebDelimiter start="^<<.*>>=" matchgroup=rnowebDelimiter end="^@" contains=@rnowebR,rnowebChunkReference,rnowebChunk fold keepend -syn match rnowebChunkReference "^<<.*>>$" contained +syn region rnowebChunk matchgroup=rnowebDelimiter start="^\s*<<.*>>=" matchgroup=rnowebDelimiter end="^@" contains=@rnowebR,rnowebChunkReference,rnowebChunk fold keepend +syn match rnowebChunkReference "^\s*<<.*>>$" contained syn region rnowebSexpr matchgroup=Delimiter start="\\Sexpr{" matchgroup=Delimiter end="}" contains=@rnowebR contained " Sweave options command {{{1 -- cgit