mirror of
https://github.com/neovim/neovim.git
synced 2024-12-24 05:05:00 -07:00
3bc852cabf
Update runtime files
11e3c5ba82
1972 lines
74 KiB
VimL
1972 lines
74 KiB
VimL
" Vim syntax file
|
|
" Language: Raku
|
|
" Maintainer: vim-perl <vim-perl@googlegroups.com>
|
|
" Homepage: https://github.com/Raku/vim-raku
|
|
" Bugs/requests: https://github.com/Raku/vim-raku/issues
|
|
" Last Change: 2021-04-16
|
|
|
|
" Contributors: Luke Palmer <fibonaci@babylonia.flatirons.org>
|
|
" Moritz Lenz <moritz@faui2k3.org>
|
|
" Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
|
|
"
|
|
" This is a big undertaking.
|
|
"
|
|
" The ftdetect/raku.vim file in this repository takes care of setting the
|
|
" right filetype for Raku files. To set it explicitly you can also add this
|
|
" line near the bottom of your source file:
|
|
" # vim: filetype=raku
|
|
|
|
" TODO:
|
|
" * Go over the list of keywords/types to see what's deprecated/missing
|
|
" * Add more support for folding (:help syn-fold)
|
|
"
|
|
" If you want to have Pir code inside Q:PIR// strings highlighted, do:
|
|
" let raku_embedded_pir=1
|
|
"
|
|
" The above requires pir.vim, which you can find in Parrot's repository:
|
|
" https://github.com/parrot/parrot/tree/master/editor
|
|
"
|
|
" To highlight Perl 5 regexes (m:P5//):
|
|
" let raku_perl5_regexes=1
|
|
"
|
|
" To enable folding:
|
|
" let raku_fold=1
|
|
|
|
if version < 704 | throw "raku.vim uses regex syntax which Vim <7.4 doesn't support. Try 'make fix_old_vim' in the vim-perl repository." | endif
|
|
|
|
" For version 5.x: Clear all syntax items
|
|
" For version 6.x: Quit when a syntax file was already loaded
|
|
if version < 600
|
|
syntax clear
|
|
elseif exists("b:current_syntax")
|
|
finish
|
|
endif
|
|
let s:keepcpo= &cpo
|
|
set cpo&vim
|
|
|
|
" Patterns which will be interpolated by the preprocessor (tools/preproc.pl):
|
|
"
|
|
" @@IDENT_NONDIGIT@@ "[A-Za-z_\xC0-\xFF]"
|
|
" @@IDENT_CHAR@@ "[A-Za-z_\xC0-\xFF0-9]"
|
|
" @@IDENTIFIER@@ "\%(@@IDENT_NONDIGIT@@\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\@=\)*\)"
|
|
" @@IDENTIFIER_START@@ "@@IDENT_CHAR@@\@1<!\%(@@IDENT_NONDIGIT@@[-']\)\@2<!"
|
|
" @@IDENTIFIER_END@@ "\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\)\@!"
|
|
" @@METAOP@@ #\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+#
|
|
" @@ADVERBS@@ "\%(\_s*:!\?@@IDENTIFIER@@\%(([^)]*)\)\?\)*"
|
|
"
|
|
" Same but escaped, for use in string eval
|
|
" @@IDENT_NONDIGIT_Q@@ "[A-Za-z_\\xC0-\\xFF]"
|
|
" @@IDENT_CHAR_Q@@ "[A-Za-z_\\xC0-\\xFF0-9]"
|
|
" @@IDENTIFIER_Q@@ "\\%(@@IDENT_NONDIGIT_Q@@\\%(@@IDENT_CHAR_Q@@\\|[-']@@IDENT_NONDIGIT_Q@@\\@=\\)*\\)"
|
|
" @@IDENTIFIER_START_Q@@ "@@IDENT_CHAR_Q@@\\@1<!\\%(@@IDENT_NONDIGIT_Q@@[-']\\)\\@2<!"
|
|
" @@IDENTIFIER_END_Q@@ "\\%(@@IDENT_CHAR_Q@@\\|[-']@@IDENT_NONDIGIT_Q@@\\)\\@!"
|
|
|
|
" Identifiers (subroutines, methods, constants, classes, roles, etc)
|
|
syn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
|
|
let s:keywords = {
|
|
\ "rakuInclude": [
|
|
\ "use require import unit",
|
|
\ ],
|
|
\ "rakuConditional": [
|
|
\ "if else elsif unless with orwith without once",
|
|
\ ],
|
|
\ "rakuVarStorage": [
|
|
\ "let my our state temp has constant",
|
|
\ ],
|
|
\ "rakuRepeat": [
|
|
\ "for loop repeat while until gather given",
|
|
\ "supply react race hyper lazy quietly",
|
|
\ ],
|
|
\ "rakuFlowControl": [
|
|
\ "take take-rw do when next last redo return return-rw",
|
|
\ "start default exit make continue break goto leave",
|
|
\ "proceed succeed whenever emit done",
|
|
\ ],
|
|
\ "rakuClosureTrait": [
|
|
\ "BEGIN CHECK INIT FIRST ENTER LEAVE KEEP",
|
|
\ "UNDO NEXT LAST PRE POST END CATCH CONTROL",
|
|
\ "DOC QUIT CLOSE COMPOSE",
|
|
\ ],
|
|
\ "rakuException": [
|
|
\ "die fail try warn",
|
|
\ ],
|
|
\ "rakuPragma": [
|
|
\ "MONKEY-GUTS MONKEY-SEE-NO-EVAL MONKEY-TYPING MONKEY",
|
|
\ "experimental fatal isms lib newline nqp precompilation",
|
|
\ "soft strict trace variables worries",
|
|
\ ],
|
|
\ "rakuOperator": [
|
|
\ "div xx x mod also leg cmp before after eq ne le lt not",
|
|
\ "gt ge eqv ff fff and andthen or xor orelse lcm gcd o",
|
|
\ "unicmp notandthen minmax",
|
|
\ ],
|
|
\ "rakuType": [
|
|
\ "int int1 int2 int4 int8 int16 int32 int64",
|
|
\ "rat rat1 rat2 rat4 rat8 rat16 rat32 rat64",
|
|
\ "buf buf1 buf2 buf4 buf8 buf16 buf32 buf64",
|
|
\ "blob blob1 blob2 blob4 blob8 blob16 blob32 blob64",
|
|
\ "uint uint1 uint2 uint4 uint8 uint16 uint32 bit bool",
|
|
\ "uint64 utf8 utf16 utf32 bag set mix complex",
|
|
\ "num num32 num64 long longlong Pointer size_t str void",
|
|
\ "ulong ulonglong ssize_t atomicint",
|
|
\ ],
|
|
\ }
|
|
|
|
" These can be immediately followed by parentheses
|
|
let s:types = [
|
|
\ "Object Any Cool Junction Whatever Capture Match",
|
|
\ "Signature Proxy Matcher Package Module Class",
|
|
\ "Grammar Scalar Array Hash KeyHash KeySet KeyBag",
|
|
\ "Pair List Seq Range Set Bag Map Mapping Void Undef",
|
|
\ "Failure Exception Code Block Routine Sub Macro",
|
|
\ "Method Submethod Regex Str Blob Char Byte Parcel",
|
|
\ "Codepoint Grapheme StrPos StrLen Version Num",
|
|
\ "Complex Bit True False Order Same Less More",
|
|
\ "Increasing Decreasing Ordered Callable AnyChar",
|
|
\ "Positional Associative Ordering KeyExtractor",
|
|
\ "Comparator OrderingPair IO KitchenSink Role",
|
|
\ "Int Rat Buf UInt Abstraction Numeric Real",
|
|
\ "Nil Mu SeekFromBeginning SeekFromEnd SeekFromCurrent",
|
|
\ ]
|
|
|
|
" We explicitly enumerate the alphanumeric infix operators allowed after [RSXZ]
|
|
" to avoid matching package names that start with those letters.
|
|
let s:alpha_metaops = [
|
|
\ "div mod gcd lcm xx x does but cmp leg eq ne gt ge lt le before after eqv",
|
|
\ "min max not so andthen and or orelse unicmp coll minmax",
|
|
\ ]
|
|
let s:words_space = join(s:alpha_metaops, " ")
|
|
let s:temp = split(s:words_space)
|
|
let s:alpha_metaops_or = join(s:temp, "\\|")
|
|
|
|
" We don't use "syn keyword" here because that always has higher priority
|
|
" than matches/regions, which would prevent these words from matching as
|
|
" autoquoted strings before "=>".
|
|
syn match rakuKeywordStart display "\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!\)\@=[A-Za-z_\xC0-\xFF0-9]\@1<!\%([A-Za-z_\xC0-\xFF][-']\)\@2<!"
|
|
\ nextgroup=rakuAttention,rakuVariable,rakuInclude,rakuConditional,rakuVarStorage,rakuRepeat,rakuFlowControl,rakuClosureTrait,rakuException,rakuNumber,rakuPragma,rakuType,rakuOperator,rakuIdentifier
|
|
|
|
for [s:group, s:words_list] in items(s:keywords)
|
|
let s:words_space = join(s:words_list, " ")
|
|
let s:temp = split(s:words_space)
|
|
let s:words = join(s:temp, "\\|")
|
|
exec "syn match ". s:group ." display \"[.^]\\@1<!\\%(". s:words . "\\)(\\@!\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained"
|
|
endfor
|
|
|
|
let s:words_space = join(s:types, " ")
|
|
let s:temp = split(s:words_space)
|
|
let s:words = join(s:temp, "\\|")
|
|
exec "syn match rakuType display \"\\%(". s:words . "\\)\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained"
|
|
unlet s:group s:words_list s:keywords s:types s:words_space s:temp s:words
|
|
|
|
syn match rakuPreDeclare display "[.^]\@1<!\<\%(multi\|proto\|only\)\>" nextgroup=rakuDeclare,rakuIdentifier skipwhite skipempty
|
|
syn match rakuDeclare display "[.^]\@1<!\<\%(macro\|sub\|submethod\|method\|module\|class\|role\|package\|enum\|grammar\|slang\|subset\)\>" nextgroup=rakuIdentifier skipwhite skipempty
|
|
syn match rakuDeclareRegex display "[.^]\@1<!\<\%(regex\|rule\|token\)\>" nextgroup=rakuRegexName skipwhite skipempty
|
|
|
|
syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@<!\a\@=\%(does\|as\|but\|trusts\|of\|returns\|handles\|where\|augment\|supersede\)\>"
|
|
syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@<![A-Za-z_\xC0-\xFF0-9]\@1<!\%([A-Za-z_\xC0-\xFF][-']\)\@2<!is\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuProperty
|
|
syn match rakuProperty display "\a\@=\%(signature\|context\|also\|shape\|prec\|irs\|ofs\|ors\|export\|deep\|binary\|unary\|reparsed\|rw\|parsed\|cached\|readonly\|defequiv\|will\|ref\|copy\|inline\|tighter\|looser\|equiv\|assoc\|required\|DEPRECATED\|raw\|repr\|dynamic\|hidden-from-backtrace\|nodal\|pure\)" contained
|
|
|
|
" packages, must come after all the keywords
|
|
syn match rakuIdentifier display "\%(::\)\@2<=\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)*"
|
|
syn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(::\)\@="
|
|
|
|
" The sigil in ::*Package
|
|
syn match rakuPackageTwigil display "\%(::\)\@2<=\*"
|
|
|
|
" some standard packages
|
|
syn match rakuType display "\%(::\)\@2<!\%(SeekType\%(::SeekFromBeginning\|::SeekFromCurrent\|::SeekFromEnd\)\|Order\%(::Same\|::More\|::Less\)\?\|Bool\%(::True\|::False\)\?\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!"
|
|
|
|
" Don't put a "\+" at the end of the character class. That makes it so
|
|
" greedy that the "%" " in "+%foo" won't be allowed to match as a sigil,
|
|
" among other things
|
|
syn match rakuOperator display "[-+/*~?|=^!%&,<>».;\\∈∉∋∌∩∪≼≽⊂⊃⊄⊅⊆⊇⊈⊉⊍⊎⊖∅∘]"
|
|
syn match rakuOperator display "\%(:\@1<!::\@2!\|::=\|\.::\)"
|
|
" these require whitespace on the left side
|
|
syn match rakuOperator display "\%(\s\|^\)\@1<=\%(xx=\)"
|
|
" index overloading
|
|
syn match rakuOperator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)"
|
|
|
|
" Reduce metaoperators like [+]
|
|
syn match rakuReduceOp display "\%(^\|\s\|(\)\@1<=!*\%([RSXZ\[]\)*[&RSXZ]\?\[\+(\?\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+)\?]\+"
|
|
syn match rakuSetOp display "R\?(\%([-^.+|&]\|[<>][=+]\?\|cont\|elem\))"
|
|
|
|
" Reverse, cross, and zip metaoperators
|
|
exec "syn match rakuRSXZOp display \"[RSXZ]:\\@!\\%(\\a\\@=\\%(". s:alpha_metaops_or . "\\)\\>\\|[[:alnum:]]\\@!\\%([.,]\\|[^[,.[:alnum:][:space:]]\\)\\+\\|\\s\\@=\\|$\\)\""
|
|
|
|
syn match rakuBlockLabel display "^\s*\zs\h\w*\s*::\@!\_s\@="
|
|
|
|
syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?Inf\|NaN\)"
|
|
syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?\%(\%(\d\|__\@!\)*[._]\@1<!\.\)\?_\@!\%(\d\|_\)\+_\@1<!\%([eE]-\?_\@!\%(\d\|_\)\+\)\?i\?"
|
|
syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?0[obxd]\@=" nextgroup=rakuOctBase,rakuBinBase,rakuHexBase,rakuDecBase
|
|
syn match rakuOctBase display "o" contained nextgroup=rakuOctNumber
|
|
syn match rakuBinBase display "b" contained nextgroup=rakuBinNumber
|
|
syn match rakuHexBase display "x" contained nextgroup=rakuHexNumber
|
|
syn match rakuDecBase display "d" contained nextgroup=rakuDecNumber
|
|
syn match rakuOctNumber display "[0-7][0-7_]*" contained
|
|
syn match rakuBinNumber display "[01][01_]*" contained
|
|
syn match rakuHexNumber display "\x[[:xdigit:]_]*" contained
|
|
syn match rakuDecNumber display "\d[[:digit:]_]*" contained
|
|
|
|
syn match rakuVersion display "\<v\d\+\%(\.\%(\*\|\d\+\)\)*+\?"
|
|
|
|
" Contextualizers
|
|
syn match rakuContext display "\<\%(item\|list\|slice\|hash\)\>"
|
|
syn match rakuContext display "\%(\$\|@\|%\|&\)(\@="
|
|
|
|
" Quoting
|
|
|
|
" one cluster for every quote adverb
|
|
syn cluster rakuInterp_scalar
|
|
\ add=rakuInterpScalar
|
|
|
|
syn cluster rakuInterp_array
|
|
\ add=rakuInterpArray
|
|
|
|
syn cluster rakuInterp_hash
|
|
\ add=rakuInterpHash
|
|
|
|
syn cluster rakuInterp_function
|
|
\ add=rakuInterpFunction
|
|
|
|
syn cluster rakuInterp_closure
|
|
\ add=rakuInterpClosure
|
|
|
|
syn cluster rakuInterp_q
|
|
\ add=rakuEscQQ
|
|
\ add=rakuEscBackSlash
|
|
|
|
syn cluster rakuInterp_backslash
|
|
\ add=@rakuInterp_q
|
|
\ add=rakuEscape
|
|
\ add=rakuEscOpenCurly
|
|
\ add=rakuEscCodePoint
|
|
\ add=rakuEscHex
|
|
\ add=rakuEscOct
|
|
\ add=rakuEscOctOld
|
|
\ add=rakuEscNull
|
|
|
|
syn cluster rakuInterp_qq
|
|
\ add=@rakuInterp_scalar
|
|
\ add=@rakuInterp_array
|
|
\ add=@rakuInterp_hash
|
|
\ add=@rakuInterp_function
|
|
\ add=@rakuInterp_closure
|
|
\ add=@rakuInterp_backslash
|
|
\ add=rakuMatchVarSigil
|
|
|
|
syn region rakuInterpScalar
|
|
\ start="\ze\z(\$\%(\%(\%(\d\+\|!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
|
|
\ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\|\%(\d\+\|!\|/\|¢\)\)\)"
|
|
\ end="\z1\zs"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
|
|
syn region rakuInterpScalar
|
|
\ matchgroup=rakuContext
|
|
\ start="\$\ze()\@!"
|
|
\ skip="([^)]*)"
|
|
\ end=")\zs"
|
|
\ contained
|
|
\ contains=TOP
|
|
|
|
syn region rakuInterpArray
|
|
\ start="\ze\z(@\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
|
|
\ end="\z1\zs"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
|
|
syn region rakuInterpArray
|
|
\ matchgroup=rakuContext
|
|
\ start="@\ze()\@!"
|
|
\ skip="([^)]*)"
|
|
\ end=")\zs"
|
|
\ contained
|
|
\ contains=TOP
|
|
|
|
syn region rakuInterpHash
|
|
\ start="\ze\z(%\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
|
|
\ end="\z1\zs"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
|
|
syn region rakuInterpHash
|
|
\ matchgroup=rakuContext
|
|
\ start="%\ze()\@!"
|
|
\ skip="([^)]*)"
|
|
\ end=")\zs"
|
|
\ contained
|
|
\ contains=TOP
|
|
|
|
syn region rakuInterpFunction
|
|
\ start="\ze\z(&\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
|
|
\ end="\z1\zs"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
|
|
syn region rakuInterpFunction
|
|
\ matchgroup=rakuContext
|
|
\ start="&\ze()\@!"
|
|
\ skip="([^)]*)"
|
|
\ end=")\zs"
|
|
\ contained
|
|
\ contains=TOP
|
|
|
|
syn region rakuInterpClosure
|
|
\ start="\\\@1<!{}\@!"
|
|
\ skip="{[^}]*}"
|
|
\ end="}"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
|
|
" generic escape
|
|
syn match rakuEscape display "\\\S" contained
|
|
|
|
" escaped closing delimiters
|
|
syn match rakuEscQuote display "\\'" contained
|
|
syn match rakuEscDoubleQuote display "\\\"" contained
|
|
syn match rakuEscCloseAngle display "\\>" contained
|
|
syn match rakuEscCloseFrench display "\\»" contained
|
|
syn match rakuEscBackTick display "\\`" contained
|
|
syn match rakuEscForwardSlash display "\\/" contained
|
|
syn match rakuEscVerticalBar display "\\|" contained
|
|
syn match rakuEscExclamation display "\\!" contained
|
|
syn match rakuEscComma display "\\," contained
|
|
syn match rakuEscDollar display "\\\$" contained
|
|
syn match rakuEscCloseCurly display "\\}" contained
|
|
syn match rakuEscCloseBracket display "\\\]" contained
|
|
|
|
" matches :key, :!key, :$var, :key<var>, etc
|
|
" Since we don't know in advance how the adverb ends, we use a trick.
|
|
" Consume nothing with the start pattern (\ze at the beginning),
|
|
" while capturing the whole adverb into \z1 and then putting it before
|
|
" the match start (\zs) of the end pattern.
|
|
syn region rakuAdverb
|
|
\ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)"
|
|
\ start="\ze\z(:!\?[@$%]\$*\%(::\|\%(\$\@1<=\d\+\|!\|/\|¢\)\|\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\)\|\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\)"
|
|
\ end="\z1\zs"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
|
|
" <words>
|
|
" Distinguishing this from the "less than" operator is tricky. For now,
|
|
" it matches if any of the following is true:
|
|
"
|
|
" * There is whitespace missing on either side of the "<", since
|
|
" people tend to put spaces around "less than". We make an exception
|
|
" for " = < ... >" assignments though.
|
|
" * It comes after "enum", "for", "any", "all", or "none"
|
|
" * It's the first or last thing on a line (ignoring whitespace)
|
|
" * It's preceded by "(\s*" or "=\s\+"
|
|
" * It's empty and terminated on the same line (e.g. <> and < >)
|
|
"
|
|
" It never matches when:
|
|
"
|
|
" * Preceded by [<+~=!] (e.g. <<foo>>, =<$foo>, * !< 3)
|
|
" * Followed by [-=] (e.g. <--, <=, <==, <->)
|
|
syn region rakuStringAngle
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\<\%(enum\|for\|any\|all\|none\)\>\s*(\?\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
|
|
\ start="\%(\s\|[<+~=!]\)\@<!<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
|
|
\ start="[<+~=!]\@1<!<\%(\s\|<\|=>\|\%([=-]\{1,2}>\|[=-]\{1,2}\)\)\@!"
|
|
\ start="\%(^\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
|
|
\ start="[<+~=!]\@1<!<\%(\s*$\)\@="
|
|
\ start="\%((\s*\|=\s\+\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
|
|
\ start="<\%(\s*>\)\@="
|
|
\ skip="\\\@1<!\\>"
|
|
\ end=">"
|
|
\ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle
|
|
|
|
syn region rakuStringAngleFixed
|
|
\ matchgroup=rakuQuote
|
|
\ start="<"
|
|
\ skip="\\\@1<!\\>"
|
|
\ end=">"
|
|
\ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle
|
|
\ contained
|
|
|
|
syn region rakuInnerAnglesOne
|
|
\ matchgroup=rakuStringAngle
|
|
\ start="\\\@1<!<"
|
|
\ skip="\\\@1<!\\>"
|
|
\ end=">"
|
|
\ transparent contained
|
|
\ contains=rakuInnerAnglesOne
|
|
|
|
" <<words>>
|
|
syn region rakuStringAngles
|
|
\ matchgroup=rakuQuote
|
|
\ start="<<=\@!"
|
|
\ skip="\\\@1<!\\>"
|
|
\ end=">>"
|
|
\ contains=rakuInnerAnglesTwo,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseAngle,rakuAdverb,rakuStringSQ,rakuStringDQ
|
|
|
|
syn region rakuInnerAnglesTwo
|
|
\ matchgroup=rakuStringAngles
|
|
\ start="<<"
|
|
\ skip="\\\@1<!\\>"
|
|
\ end=">>"
|
|
\ transparent contained
|
|
\ contains=rakuInnerAnglesTwo
|
|
|
|
" «words»
|
|
syn region rakuStringFrench
|
|
\ matchgroup=rakuQuote
|
|
\ start="«"
|
|
\ skip="\\\@1<!\\»"
|
|
\ end="»"
|
|
\ contains=rakuInnerFrench,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseFrench,rakuAdverb,rakuStringSQ,rakuStringDQ
|
|
|
|
syn region rakuInnerFrench
|
|
\ matchgroup=rakuStringFrench
|
|
\ start="\\\@1<!«"
|
|
\ skip="\\\@1<!\\»"
|
|
\ end="»"
|
|
\ transparent contained
|
|
\ contains=rakuInnerFrench
|
|
|
|
" Hyperops. They need to come after "<>" and "«»" strings in order to override
|
|
" them, but before other types of strings, to avoid matching those delimiters
|
|
" as parts of hyperops.
|
|
syn match rakuHyperOp display #[^[:digit:][{('",:[:space:]][^[{('",:[:space:]]*\%(«\|<<\)#
|
|
syn match rakuHyperOp display "«\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+[«»]"
|
|
syn match rakuHyperOp display "»\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(«\|»\?\)"
|
|
syn match rakuHyperOp display "<<\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|>>\)"
|
|
syn match rakuHyperOp display ">>\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|\%(>>\)\?\)"
|
|
|
|
" 'string'
|
|
syn region rakuStringSQ
|
|
\ matchgroup=rakuQuote
|
|
\ start="'"
|
|
\ skip="\\\@1<!\\'"
|
|
\ end="'"
|
|
\ contains=@rakuInterp_q,rakuEscQuote
|
|
\ keepend extend
|
|
|
|
" "string"
|
|
syn region rakuStringDQ
|
|
\ matchgroup=rakuQuote
|
|
\ start=+"+
|
|
\ skip=+\\\@1<!\\"+
|
|
\ end=+"+
|
|
\ contains=@rakuInterp_qq,rakuEscDoubleQuote
|
|
\ keepend extend
|
|
|
|
" Q// and friends
|
|
|
|
syn match rakuQuoteQStart display "\%(:\|\%(sub\|role\)\s\)\@5<![Qq]\@=" nextgroup=rakuQuoteQ,rakuQuoteQ_q,rakuQuoteQ_qww,rakuQuoteQ_qq,rakuQuoteQ_to,rakuQuoteQ_qto,rakuQuoteQ_qqto,rakuIdentifier
|
|
syn match rakuQuoteQ display "Q\%(qq\|ww\|[abcfhpsqvwx]\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ skipwhite skipempty contained
|
|
syn match rakuQuoteQ_q display "q[abcfhpsvwx]\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_q skipwhite skipempty contained
|
|
syn match rakuQuoteQ_qww display "qww[A-Za-z(]\@!" nextgroup=rakuPairsQ_qww skipwhite skipempty contained
|
|
syn match rakuQuoteQ_qq display "qq\%([pwx]\|ww\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_qq skipwhite skipempty contained
|
|
syn match rakuQuoteQ_to display "Qto[A-Za-z(]\@!" nextgroup=rakuStringQ_to skipwhite skipempty contained
|
|
syn match rakuQuoteQ_qto display "qto[A-Za-z(]\@!" nextgroup=rakuStringQ_qto skipwhite skipempty contained
|
|
syn match rakuQuoteQ_qqto display "qqto[A-Za-z(]\@!" nextgroup=rakuStringQ_qqto skipwhite skipempty contained
|
|
syn match rakuQuoteQ_qto display "q\_s*\%(\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*:\%(to\|heredoc\)\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*(\@!\)\@=" nextgroup=rakuPairsQ_qto skipwhite skipempty contained
|
|
syn match rakuQuoteQ_qqto display "qq\_s*\%(\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*:\%(to\|heredoc\)\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*(\@!\)\@=" nextgroup=rakuPairsQ_qqto skipwhite skipempty contained
|
|
syn match rakuPairsQ "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ
|
|
syn match rakuPairsQ_q "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_q
|
|
syn match rakuPairsQ_qww "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qww
|
|
syn match rakuPairsQ_qq "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qq
|
|
syn match rakuPairsQ_qto "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qto
|
|
syn match rakuPairsQ_qqto "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qqto
|
|
|
|
|
|
if exists("raku_embedded_pir") || exists("raku_extended_all")
|
|
syn include @rakuPIR syntax/pir.vim
|
|
syn match rakuQuote_QPIR display "Q[A-Za-z(]\@!\%(\_s*:PIR\)\@=" nextgroup=rakuPairsQ_PIR skipwhite skipempty
|
|
syn match rakuPairs_QPIR contained "\_s*:PIR" transparent skipwhite skipempty nextgroup=rakuStringQ_PIR
|
|
endif
|
|
|
|
" hardcoded set of delimiters
|
|
let s:plain_delims = [
|
|
\ ["DQ", "\\\"", "\\\"", "rakuEscDoubleQuote", "\\\\\\@1<!\\\\\\\""],
|
|
\ ["SQ", "'", "'", "rakuEscQuote", "\\\\\\@1<!\\\\'"],
|
|
\ ["Slash", "/", "/", "rakuEscForwardSlash", "\\\\\\@1<!\\\\/"],
|
|
\ ["BackTick", "`", "`", "rakuEscBackTick", "\\\\\\@1<!\\\\`"],
|
|
\ ["Bar", "|", "|", "rakuEscVerticalBar", "\\\\\\@1<!\\\\|"],
|
|
\ ["Exclamation", "!", "!", "rakuEscExclamation", "\\\\\\@1<!\\\\!"],
|
|
\ ["Comma", ",", ",", "rakuEscComma", "\\\\\\@1<!\\\\,"],
|
|
\ ["Dollar", "\\$", "\\$", "rakuEscDollar", "\\\\\\@1<!\\\\\\$"],
|
|
\ ]
|
|
let s:bracketing_delims = [
|
|
\ ["Curly", "{", "}", "rakuEscCloseCurly", "\\%(\\\\\\@1<!\\\\}\\|{[^}]*}\\)"],
|
|
\ ["Angle", "<", ">", "rakuEscCloseAngle", "\\%(\\\\\\@1<!\\\\>\\|<[^>]*>\\)"],
|
|
\ ["French", "«", "»", "rakuEscCloseFrench", "\\%(\\\\\\@1<!\\\\»\\|«[^»]*»\\)"],
|
|
\ ["Bracket", "\\\[", "]", "rakuEscCloseBracket", "\\%(\\\\\\@1<!\\\\]\\|\\[^\\]]*]\\)"],
|
|
\ ["Paren", "\\s\\@1<=(", ")", "rakuEscCloseParen", "\\%(\\\\\\@1<!\\\\)\\|([^)]*)\\)"],
|
|
\ ]
|
|
let s:all_delims = s:plain_delims + s:bracketing_delims
|
|
|
|
for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:all_delims
|
|
exec "syn region rakuStringQ matchgroup=rakuQuote start=\"".s:start_delim."\" end=\"".s:end_delim."\" contained"
|
|
exec "syn region rakuStringQ_q matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_q,".s:end_group." contained"
|
|
exec "syn region rakuStringQ_qww matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_q,rakuStringSQ,rakuStringDQ".s:end_group." contained"
|
|
exec "syn region rakuStringQ_qq matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_qq,".s:end_group." contained"
|
|
exec "syn region rakuStringQ_to matchgroup=rakuQuote start=\"".s:start_delim."\\z([^".s:end_delim."]\\+\\)".s:end_delim."\" end=\"^\\s*\\z1$\" contained"
|
|
exec "syn region rakuStringQ_qto matchgroup=rakuQuote start=\"".s:start_delim."\\z([^".s:end_delim."]\\+\\)".s:end_delim."\" skip=\"".s:skip."\" end=\"^\\s*\\z1$\" contains=@rakuInterp_q,".s:end_group." contained"
|
|
exec "syn region rakuStringQ_qqto matchgroup=rakuQuote start=\"".s:start_delim."\\z(\[^".s:end_delim."]\\+\\)".s:end_delim."\" skip=\"".s:skip."\" end=\"^\\s*\\z1$\" contains=@rakuInterp_qq,".s:end_group." contained"
|
|
|
|
if exists("raku_embedded_pir") || exists("raku_extended_all")
|
|
exec "syn region rakuStringQ_PIR matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuPIR,".s:end_group." contained"
|
|
endif
|
|
endfor
|
|
unlet s:name s:start_delim s:end_delim s:end_group s:skip s:plain_delims s:all_delims
|
|
|
|
" :key
|
|
syn match rakuOperator display ":\@1<!::\@!!\?" nextgroup=rakuKey,rakuStringAngleFixed,rakuStringAngles,rakuStringFrench
|
|
syn match rakuKey display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" contained nextgroup=rakuStringAngleFixed,rakuStringAngles,rakuStringFrench
|
|
|
|
" Regexes and grammars
|
|
|
|
syn match rakuRegexName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?" nextgroup=rakuRegexBlockCrap skipwhite skipempty contained
|
|
syn match rakuRegexBlockCrap "[^{]*" nextgroup=rakuRegexBlock skipwhite skipempty transparent contained
|
|
|
|
syn region rakuRegexBlock
|
|
\ matchgroup=rakuNormal
|
|
\ start="{"
|
|
\ end="}"
|
|
\ contained
|
|
\ contains=@rakuRegexen,@rakuVariables
|
|
|
|
" Perl 6 regex bits
|
|
|
|
syn cluster rakuRegexen
|
|
\ add=rakuRxMeta
|
|
\ add=rakuRxEscape
|
|
\ add=rakuEscCodePoint
|
|
\ add=rakuEscHex
|
|
\ add=rakuEscOct
|
|
\ add=rakuEscNull
|
|
\ add=rakuRxAnchor
|
|
\ add=rakuRxCapture
|
|
\ add=rakuRxGroup
|
|
\ add=rakuRxAlternation
|
|
\ add=rakuRxBoundary
|
|
\ add=rakuRxAdverb
|
|
\ add=rakuRxAdverbArg
|
|
\ add=rakuRxStorage
|
|
\ add=rakuRxAssertion
|
|
\ add=rakuRxAssertGroup
|
|
\ add=rakuRxQuoteWords
|
|
\ add=rakuRxClosure
|
|
\ add=rakuRxStringSQ
|
|
\ add=rakuRxStringDQ
|
|
\ add=rakuComment
|
|
\ add=rakuBracketComment
|
|
\ add=rakuMatchVarSigil
|
|
|
|
syn match rakuRxMeta display contained ".\%([A-Za-z_\xC0-\xFF0-9]\|\s\)\@1<!"
|
|
syn match rakuRxAnchor display contained "[$^]"
|
|
syn match rakuRxEscape display contained "\\\S"
|
|
syn match rakuRxCapture display contained "[()]"
|
|
syn match rakuRxAlternation display contained "|"
|
|
syn match rakuRxRange display contained "\.\."
|
|
|
|
" misc escapes
|
|
syn match rakuEscOctOld display "\\[1-9]\d\{1,2}" contained
|
|
syn match rakuEscNull display "\\0\d\@!" contained
|
|
syn match rakuEscCodePoint display "\\[cC]" contained nextgroup=rakuCodePoint
|
|
syn match rakuEscHex display "\\[xX]" contained nextgroup=rakuHexSequence
|
|
syn match rakuEscOct display "\\o" contained nextgroup=rakuOctSequence
|
|
syn match rakuEscQQ display "\\qq" contained nextgroup=rakuQQSequence
|
|
syn match rakuEscOpenCurly display "\\{" contained
|
|
syn match rakuEscHash display "\\#" contained
|
|
syn match rakuEscBackSlash display "\\\\" contained
|
|
|
|
syn region rakuQQSequence
|
|
\ matchgroup=rakuEscape
|
|
\ start="\["
|
|
\ skip="\[[^\]]*]"
|
|
\ end="]"
|
|
\ contained transparent
|
|
\ contains=@rakuInterp_qq
|
|
|
|
syn match rakuCodePoint display "\%(\d\+\|\S\)" contained
|
|
syn region rakuCodePoint
|
|
\ matchgroup=rakuEscape
|
|
\ start="\["
|
|
\ end="]"
|
|
\ contained
|
|
|
|
syn match rakuHexSequence display "\x\+" contained
|
|
syn region rakuHexSequence
|
|
\ matchgroup=rakuEscape
|
|
\ start="\["
|
|
\ end="]"
|
|
\ contained
|
|
|
|
syn match rakuOctSequence display "\o\+" contained
|
|
syn region rakuOctSequence
|
|
\ matchgroup=rakuEscape
|
|
\ start="\["
|
|
\ end="]"
|
|
\ contained
|
|
|
|
" $<match>, @<match>
|
|
syn region rakuMatchVarSigil
|
|
\ matchgroup=rakuVariable
|
|
\ start="[$@]\%(<<\@!\)\@="
|
|
\ end=">\@1<="
|
|
\ contains=rakuMatchVar
|
|
|
|
syn region rakuMatchVar
|
|
\ matchgroup=rakuTwigil
|
|
\ start="<"
|
|
\ end=">"
|
|
\ contained
|
|
|
|
syn region rakuRxClosure
|
|
\ matchgroup=rakuNormal
|
|
\ start="{"
|
|
\ end="}"
|
|
\ contained
|
|
\ containedin=rakuRxClosure
|
|
\ contains=TOP
|
|
syn region rakuRxGroup
|
|
\ matchgroup=rakuStringSpecial2
|
|
\ start="\["
|
|
\ end="]"
|
|
\ contained
|
|
\ contains=@rakuRegexen,@rakuVariables,rakuMatchVarSigil
|
|
syn region rakuRxAssertion
|
|
\ matchgroup=rakuStringSpecial2
|
|
\ start="<\%(?\?\%(before\|after\)\|\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\)\|[+?*]\)\?"
|
|
\ end=">"
|
|
\ contained
|
|
\ contains=@rakuRegexen,rakuIdentifier,@rakuVariables,rakuRxCharClass,rakuRxAssertCall
|
|
syn region rakuRxAssertGroup
|
|
\ matchgroup=rakuStringSpecial2
|
|
\ start="<\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\["
|
|
\ skip="\\\@1<!\\]"
|
|
\ end="]"
|
|
\ contained
|
|
syn match rakuRxAssertCall display "\%(::\|\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)" contained nextgroup=rakuRxAssertArgs
|
|
syn region rakuRxAssertArgs
|
|
\ start="("
|
|
\ end=")"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
syn region rakuRxAssertArgs
|
|
\ start=":"
|
|
\ end="\ze>"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
syn match rakuRxBoundary display contained "\%([«»]\|<<\|>>\)"
|
|
syn region rakuRxCharClass
|
|
\ matchgroup=rakuStringSpecial2
|
|
\ start="\%(<[-!+?]\?\)\@2<=\["
|
|
\ skip="\\]"
|
|
\ end="]"
|
|
\ contained
|
|
\ contains=rakuRxRange,rakuRxEscape,rakuEscHex,rakuEscOct,rakuEscCodePoint,rakuEscNull
|
|
syn region rakuRxQuoteWords
|
|
\ matchgroup=rakuStringSpecial2
|
|
\ start="<\s"
|
|
\ end="\s\?>"
|
|
\ contained
|
|
syn region rakuRxAdverb
|
|
\ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)"
|
|
\ end="\z1\zs"
|
|
\ contained keepend
|
|
\ contains=TOP
|
|
syn region rakuRxAdverbArg
|
|
\ start="\%(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\@<=("
|
|
\ skip="([^)]\{-})"
|
|
\ end=")"
|
|
\ contained
|
|
\ keepend
|
|
\ contains=TOP
|
|
syn region rakuRxStorage
|
|
\ matchgroup=rakuOperator
|
|
\ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@="
|
|
\ end="$"
|
|
\ contains=TOP
|
|
\ contained
|
|
\ keepend
|
|
|
|
" 'string' inside a regex
|
|
syn region rakuRxStringSQ
|
|
\ matchgroup=rakuQuote
|
|
\ start="'"
|
|
\ skip="\\\@1<!\\'"
|
|
\ end="'"
|
|
\ contained
|
|
\ contains=rakuEscQuote,rakuEscBackSlash
|
|
|
|
" "string" inside a regex
|
|
syn region rakuRxStringDQ
|
|
\ matchgroup=rakuQuote
|
|
\ start=+"+
|
|
\ skip=+\\\@1<!\\"+
|
|
\ end=+"+
|
|
\ contained
|
|
\ contains=rakuEscDoubleQuote,rakuEscBackSlash,@rakuInterp_qq
|
|
|
|
" $!, $var, $!var, $::var, $package::var $*::package::var, etc
|
|
" Thus must come after the matches for the "$" regex anchor, but before
|
|
" the match for the $ regex delimiter
|
|
syn cluster rakuVariables
|
|
\ add=rakuVarSlash
|
|
\ add=rakuVarExclam
|
|
\ add=rakuVarMatch
|
|
\ add=rakuVarNum
|
|
\ add=rakuVariable
|
|
|
|
syn match rakuBareSigil display "[@$%&]\%(\s*\%([,)}=]\|where\>\)\)\@="
|
|
syn match rakuVarSlash display "\$/"
|
|
syn match rakuVarExclam display "\$!"
|
|
syn match rakuVarMatch display "\$¢"
|
|
syn match rakuVarNum display "\$\d\+"
|
|
syn match rakuVariable display "self"
|
|
syn match rakuVariable display "[@$%&]\?[@&$%]\$*\%(::\|\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\)\|[A-Za-z_\xC0-\xFF]\)\@=" nextgroup=rakuTwigil,rakuVarName,rakuPackageScope
|
|
syn match rakuVarName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" nextgroup=rakuPostHyperOp contained
|
|
syn match rakuClose display "[\])]" transparent nextgroup=rakuPostHyperOp
|
|
syn match rakuPostHyperOp display "\%(»\|>>\)" contained
|
|
syn match rakuTwigil display "\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=" nextgroup=rakuPackageScope,rakuVarName contained
|
|
syn match rakuPackageScope display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?::" nextgroup=rakuPackageScope,rakuVarName contained
|
|
|
|
" Perl 6 regex regions
|
|
|
|
syn match rakuMatchStart_m display "\.\@1<!\<\%(mm\?\|rx\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_m
|
|
syn match rakuMatchStart_s display "\.\@1<!\<[sS]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_s
|
|
syn match rakuMatchStart_tr display "\.\@1<!\<tr\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_tr
|
|
syn match rakuMatchAdverbs_m "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuMatch
|
|
syn match rakuMatchAdverbs_s "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuSubstitution
|
|
syn match rakuMatchAdverbs_tr "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuTransliteration
|
|
|
|
" /foo/
|
|
syn region rakuMatchBare
|
|
\ matchgroup=rakuQuote
|
|
\ start="/\@1<!\%(\%(\_^\|[!\[,=~|&/:({]\|\^\?fff\?\^\?\|=>\|\<\%(if\|unless\|while\|when\|where\|so\)\)\s*\)\@<=/[/=]\@!"
|
|
\ skip="\\/"
|
|
\ end="/"
|
|
\ contains=@rakuRegexen,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum
|
|
|
|
" m/foo/, m$foo$, m!foo!, etc
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start=+\z([/!$,|`"]\)+
|
|
\ skip="\\\z1"
|
|
\ end="\z1"
|
|
\ contained
|
|
\ contains=@rakuRegexen,rakuVariable,rakuVarNum
|
|
|
|
" m<foo>, m«foo», m{foo}, etc
|
|
for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
|
|
exec "syn region rakuMatch matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables"
|
|
endfor
|
|
unlet s:name s:start_delim s:end_delim s:end_group s:skip
|
|
|
|
" Substitutions
|
|
|
|
" s/foo//, s$foo$$, s!foo!!, etc
|
|
syn region rakuSubstitution
|
|
\ matchgroup=rakuQuote
|
|
\ start=+\z([/!$,|`"]\)+
|
|
\ skip="\\\z1"
|
|
\ end="\z1"me=e-1
|
|
\ contained
|
|
\ contains=@rakuRegexen,rakuVariable,rakuVarNum
|
|
\ nextgroup=rakuReplacement
|
|
|
|
syn region rakuReplacement
|
|
\ matchgroup=rakuQuote
|
|
\ start="\z(.\)"
|
|
\ skip="\\\z1"
|
|
\ end="\z1"
|
|
\ contained
|
|
\ contains=@rakuInterp_qq
|
|
|
|
" s<foo><bar>, s«foo»«bar», s{foo}{bar}, etc
|
|
for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
|
|
exec "syn region rakuSubstitution matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables nextgroup=rakuRepl".s:name
|
|
exec "syn region rakuRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq"
|
|
endfor
|
|
unlet s:name s:start_delim s:end_delim s:end_group s:skip
|
|
|
|
" Transliteration
|
|
|
|
" tr/foo/bar/, tr|foo|bar, etc
|
|
syn region rakuTransliteration
|
|
\ matchgroup=rakuQuote
|
|
\ start=+\z([/!$,|`"]\)+
|
|
\ skip="\\\z1"
|
|
\ end="\z1"me=e-1
|
|
\ contained
|
|
\ contains=rakuRxRange
|
|
\ nextgroup=rakuTransRepl
|
|
|
|
syn region rakuTransRepl
|
|
\ matchgroup=rakuQuote
|
|
\ start="\z(.\)"
|
|
\ skip="\\\z1"
|
|
\ end="\z1"
|
|
\ contained
|
|
\ contains=@rakuInterp_qq,rakuRxRange
|
|
|
|
" tr<foo><bar>, tr«foo»«bar», tr{foo}{bar}, etc
|
|
for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
|
|
exec "syn region rakuTransliteration matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=rakuRxRange nextgroup=rakuTransRepl".s:name
|
|
exec "syn region rakuTransRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq,rakuRxRange"
|
|
endfor
|
|
unlet s:name s:start_delim s:end_delim s:end_group s:skip s:bracketing_delims
|
|
|
|
if exists("raku_perl5_regexes") || exists("raku_extended_all")
|
|
|
|
" Perl 5 regex regions
|
|
|
|
syn cluster rakuRegexP5Base
|
|
\ add=rakuRxP5Escape
|
|
\ add=rakuRxP5Oct
|
|
\ add=rakuRxP5Hex
|
|
\ add=rakuRxP5EscMeta
|
|
\ add=rakuRxP5CodePoint
|
|
\ add=rakuRxP5Prop
|
|
|
|
" normal regex stuff
|
|
syn cluster rakuRegexP5
|
|
\ add=@rakuRegexP5Base
|
|
\ add=rakuRxP5Quantifier
|
|
\ add=rakuRxP5Meta
|
|
\ add=rakuRxP5QuoteMeta
|
|
\ add=rakuRxP5ParenMod
|
|
\ add=rakuRxP5Verb
|
|
\ add=rakuRxP5Count
|
|
\ add=rakuRxP5Named
|
|
\ add=rakuRxP5ReadRef
|
|
\ add=rakuRxP5WriteRef
|
|
\ add=rakuRxP5CharClass
|
|
\ add=rakuRxP5Anchor
|
|
|
|
" inside character classes
|
|
syn cluster rakuRegexP5Class
|
|
\ add=@rakuRegexP5Base
|
|
\ add=rakuRxP5Posix
|
|
\ add=rakuRxP5Range
|
|
|
|
syn match rakuRxP5Escape display contained "\\\S"
|
|
syn match rakuRxP5CodePoint display contained "\\c\S\@=" nextgroup=rakuRxP5CPId
|
|
syn match rakuRxP5CPId display contained "\S"
|
|
syn match rakuRxP5Oct display contained "\\\%(\o\{1,3}\)\@=" nextgroup=rakuRxP5OctSeq
|
|
syn match rakuRxP5OctSeq display contained "\o\{1,3}"
|
|
syn match rakuRxP5Anchor display contained "[\^$]"
|
|
syn match rakuRxP5Hex display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=rakuRxP5HexSeq
|
|
syn match rakuRxP5HexSeq display contained "\x\{1,2}"
|
|
syn region rakuRxP5HexSeq
|
|
\ matchgroup=rakuRxP5Escape
|
|
\ start="{"
|
|
\ end="}"
|
|
\ contained
|
|
syn region rakuRxP5Named
|
|
\ matchgroup=rakuRxP5Escape
|
|
\ start="\%(\\N\)\@2<={"
|
|
\ end="}"
|
|
\ contained
|
|
syn match rakuRxP5Quantifier display contained "\%([+*]\|(\@1<!?\)"
|
|
syn match rakuRxP5ReadRef display contained "\\[1-9]\d\@!"
|
|
syn match rakuRxP5ReadRef display contained "\[A-Za-z_\xC0-\xFF0-9]<\@=" nextgroup=rakuRxP5ReadRefId
|
|
syn region rakuRxP5ReadRefId
|
|
\ matchgroup=rakuRxP5Escape
|
|
\ start="<"
|
|
\ end=">"
|
|
\ contained
|
|
syn match rakuRxP5WriteRef display contained "\\g\%(\d\|{\)\@=" nextgroup=rakuRxP5WriteRefId
|
|
syn match rakuRxP5WriteRefId display contained "\d\+"
|
|
syn region rakuRxP5WriteRefId
|
|
\ matchgroup=rakuRxP5Escape
|
|
\ start="{"
|
|
\ end="}"
|
|
\ contained
|
|
syn match rakuRxP5Prop display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=rakuRxP5PropId
|
|
syn match rakuRxP5PropId display contained "\a"
|
|
syn region rakuRxP5PropId
|
|
\ matchgroup=rakuRxP5Escape
|
|
\ start="{"
|
|
\ end="}"
|
|
\ contained
|
|
syn match rakuRxP5Meta display contained "[(|).]"
|
|
syn match rakuRxP5ParenMod display contained "(\@1<=?\@=" nextgroup=rakuRxP5Mod,rakuRxP5ModName,rakuRxP5Code
|
|
syn match rakuRxP5Mod display contained "?\%(<\?=\|<\?!\|[#:|]\)"
|
|
syn match rakuRxP5Mod display contained "?-\?[impsx]\+"
|
|
syn match rakuRxP5Mod display contained "?\%([-+]\?\d\+\|R\)"
|
|
syn match rakuRxP5Mod display contained "?(DEFINE)"
|
|
syn match rakuRxP5Mod display contained "?\%(&\|P[>=]\)" nextgroup=rakuRxP5ModDef
|
|
syn match rakuRxP5ModDef display contained "\h\w*"
|
|
syn region rakuRxP5ModName
|
|
\ matchgroup=rakuStringSpecial
|
|
\ start="?'"
|
|
\ end="'"
|
|
\ contained
|
|
syn region rakuRxP5ModName
|
|
\ matchgroup=rakuStringSpecial
|
|
\ start="?P\?<"
|
|
\ end=">"
|
|
\ contained
|
|
syn region rakuRxP5Code
|
|
\ matchgroup=rakuStringSpecial
|
|
\ start="??\?{"
|
|
\ end="})\@="
|
|
\ contained
|
|
\ contains=TOP
|
|
syn match rakuRxP5EscMeta display contained "\\[?*.{}()[\]|\^$]"
|
|
syn match rakuRxP5Count display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=rakuRxP5CountId
|
|
syn region rakuRxP5CountId
|
|
\ matchgroup=rakuRxP5Escape
|
|
\ start="{"
|
|
\ end="}"
|
|
\ contained
|
|
syn match rakuRxP5Verb display contained "(\@1<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)"
|
|
syn region rakuRxP5QuoteMeta
|
|
\ matchgroup=rakuRxP5Escape
|
|
\ start="\\Q"
|
|
\ end="\\E"
|
|
\ contained
|
|
\ contains=@rakuVariables,rakuEscBackSlash
|
|
syn region rakuRxP5CharClass
|
|
\ matchgroup=rakuStringSpecial
|
|
\ start="\[\^\?"
|
|
\ skip="\\]"
|
|
\ end="]"
|
|
\ contained
|
|
\ contains=@rakuRegexP5Class
|
|
syn region rakuRxP5Posix
|
|
\ matchgroup=rakuRxP5Escape
|
|
\ start="\[:"
|
|
\ end=":]"
|
|
\ contained
|
|
syn match rakuRxP5Range display contained "-"
|
|
|
|
" m:P5//
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=/"
|
|
\ skip="\\/"
|
|
\ end="/"
|
|
\ contains=@rakuRegexP5,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum
|
|
|
|
" m:P5!!
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=!"
|
|
\ skip="\\!"
|
|
\ end="!"
|
|
\ contains=@rakuRegexP5,rakuVariable,rakuVarSlash,rakuVarMatch,rakuVarNum
|
|
|
|
" m:P5$$, m:P5||, etc
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=\z([\"'`|,$]\)"
|
|
\ skip="\\\z1"
|
|
\ end="\z1"
|
|
\ contains=@rakuRegexP5,@rakuVariables
|
|
|
|
" m:P5 ()
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s\+\)\@<=()\@!"
|
|
\ skip="\\)"
|
|
\ end=")"
|
|
\ contains=@rakuRegexP5,@rakuVariables
|
|
|
|
" m:P5[]
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=[]\@!"
|
|
\ skip="\\]"
|
|
\ end="]"
|
|
\ contains=@rakuRegexP5,@rakuVariables
|
|
|
|
" m:P5{}
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<={}\@!"
|
|
\ skip="\\}"
|
|
\ end="}"
|
|
\ contains=@rakuRegexP5,rakuVariables
|
|
|
|
" m:P5<>
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=<>\@!"
|
|
\ skip="\\>"
|
|
\ end=">"
|
|
\ contains=@rakuRegexP5,rakuVariables
|
|
|
|
" m:P5«»
|
|
syn region rakuMatch
|
|
\ matchgroup=rakuQuote
|
|
\ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=«»\@!"
|
|
\ skip="\\»"
|
|
\ end="»"
|
|
\ contains=@rakuRegexP5,rakuVariables
|
|
|
|
endif
|
|
|
|
" Comments
|
|
|
|
syn match rakuAttention display "\<\%(ACHTUNG\|ATTN\|ATTENTION\|FIXME\|NB\|TODO\|TBD\|WTF\|XXX\|NOTE\)" contained
|
|
|
|
" normal end-of-line comment
|
|
syn match rakuComment display "#.*" contains=rakuAttention
|
|
|
|
" Multiline comments. Arbitrary numbers of opening brackets are allowed,
|
|
" but we only define regions for 1 to 3
|
|
syn region rakuBracketComment
|
|
\ start="#[`|=]("
|
|
\ skip="([^)]*)"
|
|
\ end=")"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ start="#[`|=]\["
|
|
\ skip="\[[^\]]*]"
|
|
\ end="]"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ start="#[`|=]{"
|
|
\ skip="{[^}]*}"
|
|
\ end="}"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ start="#[`|=]<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ start="#[`|=]«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
|
|
" Comments with double and triple delimiters
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=](("
|
|
\ skip="((\%([^)\|))\@!]\)*))"
|
|
\ end="))"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]((("
|
|
\ skip="(((\%([^)]\|)\%())\)\@!\)*)))"
|
|
\ end=")))"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]\[\["
|
|
\ skip="\[\[\%([^\]]\|]]\@!\)*]]"
|
|
\ end="]]"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]\[\[\["
|
|
\ skip="\[\[\[\%([^\]]\|]\%(]]\)\@!\)*]]]"
|
|
\ end="]]]"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]{{"
|
|
\ skip="{{\%([^}]\|}}\@!\)*}}"
|
|
\ end="}}"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]{{{"
|
|
\ skip="{{{\%([^}]\|}\%(}}\)\@!\)*}}}"
|
|
\ end="}}}"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]<<"
|
|
\ skip="<<\%([^>]\|>>\@!\)*>>"
|
|
\ end=">>"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]<<<"
|
|
\ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>"
|
|
\ end=">>>"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]««"
|
|
\ skip="««\%([^»]\|»»\@!\)*»»"
|
|
\ end="»»"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
syn region rakuBracketComment
|
|
\ matchgroup=rakuBracketComment
|
|
\ start="#[`|=]«««"
|
|
\ skip="«««\%([^»]\|»\%(»»\)\@!\)*»»»"
|
|
\ end="»»»"
|
|
\ contains=rakuAttention,rakuBracketComment
|
|
|
|
syn match rakuShebang display "\%^#!.*"
|
|
|
|
" => autoquoting
|
|
syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\%(p5\)\@2<![RSXZ]\@1<!=>"
|
|
syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\s\+=>"
|
|
syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)p5\ze=>"
|
|
|
|
" Pod
|
|
|
|
" Abbreviated blocks (implicit code forbidden)
|
|
syn region rakuPodAbbrRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^\s*\zs=\ze\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contains=rakuPodAbbrNoCodeType
|
|
\ keepend
|
|
|
|
syn region rakuPodAbbrNoCodeType
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=rakuPodName,rakuPodAbbrNoCode
|
|
|
|
syn match rakuPodName contained ".\+" contains=@rakuPodFormat
|
|
syn match rakuPodComment contained ".\+"
|
|
|
|
syn region rakuPodAbbrNoCode
|
|
\ start="^"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=@rakuPodFormat
|
|
|
|
" Abbreviated blocks (everything is code)
|
|
syn region rakuPodAbbrRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^\s*\zs=\zecode\>"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contains=rakuPodAbbrCodeType
|
|
\ keepend
|
|
|
|
syn region rakuPodAbbrCodeType
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=rakuPodName,rakuPodAbbrCode
|
|
|
|
syn region rakuPodAbbrCode
|
|
\ start="^"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
|
|
" Abbreviated blocks (everything is a comment)
|
|
syn region rakuPodAbbrRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^=\zecomment\>"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contains=rakuPodAbbrCommentType
|
|
\ keepend
|
|
|
|
syn region rakuPodAbbrCommentType
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=rakuPodComment,rakuPodAbbrNoCode
|
|
|
|
" Abbreviated blocks (implicit code allowed)
|
|
syn region rakuPodAbbrRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contains=rakuPodAbbrType
|
|
\ keepend
|
|
|
|
syn region rakuPodAbbrType
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=rakuPodName,rakuPodAbbr
|
|
|
|
syn region rakuPodAbbr
|
|
\ start="^"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=@rakuPodFormat,rakuPodImplicitCode
|
|
|
|
" Abbreviated block to end-of-file
|
|
syn region rakuPodAbbrRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^=\zeEND\>"
|
|
\ end="\%$"
|
|
\ contains=rakuPodAbbrEOFType
|
|
\ keepend
|
|
|
|
syn region rakuPodAbbrEOFType
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="\%$"
|
|
\ contained
|
|
\ contains=rakuPodName,rakuPodAbbrEOF
|
|
|
|
syn region rakuPodAbbrEOF
|
|
\ start="^"
|
|
\ end="\%$"
|
|
\ contained
|
|
\ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
|
|
|
|
" Directives
|
|
syn region rakuPodDirectRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^=\%(config\|use\)\>"
|
|
\ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
|
|
\ contains=rakuPodDirectArgRegion
|
|
\ keepend
|
|
|
|
syn region rakuPodDirectArgRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\S\+"
|
|
\ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
|
|
\ contained
|
|
\ contains=rakuPodDirectConfigRegion
|
|
|
|
syn region rakuPodDirectConfigRegion
|
|
\ start=""
|
|
\ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
|
|
\ contained
|
|
\ contains=@rakuPodConfig
|
|
|
|
" =encoding is a special directive
|
|
syn region rakuPodDirectRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^=encoding\>"
|
|
\ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
|
|
\ contains=rakuPodEncodingArgRegion
|
|
\ keepend
|
|
|
|
syn region rakuPodEncodingArgRegion
|
|
\ matchgroup=rakuPodName
|
|
\ start="\S\+"
|
|
\ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
|
|
\ contained
|
|
|
|
" Paragraph blocks (implicit code forbidden)
|
|
syn region rakuPodParaRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^\s*\zs=for\>"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contains=rakuPodParaNoCodeTypeRegion
|
|
\ keepend extend
|
|
|
|
syn region rakuPodParaNoCodeTypeRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=rakuPodParaNoCode,rakuPodParaConfigRegion
|
|
|
|
syn region rakuPodParaConfigRegion
|
|
\ start=""
|
|
\ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\@1<!\)"
|
|
\ contained
|
|
\ contains=@rakuPodConfig
|
|
|
|
syn region rakuPodParaNoCode
|
|
\ start="^[^=]"
|
|
\ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=@rakuPodFormat
|
|
|
|
" Paragraph blocks (everything is code)
|
|
syn region rakuPodParaRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^\s*\zs=for\>\ze\s*code\>"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contains=rakuPodParaCodeTypeRegion
|
|
\ keepend extend
|
|
|
|
syn region rakuPodParaCodeTypeRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=rakuPodParaCode,rakuPodParaConfigRegion
|
|
|
|
syn region rakuPodParaCode
|
|
\ start="^[^=]"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
|
|
" Paragraph blocks (implicit code allowed)
|
|
syn region rakuPodParaRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^\s*\zs=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
|
|
\ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contains=rakuPodParaTypeRegion
|
|
\ keepend extend
|
|
|
|
syn region rakuPodParaTypeRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=rakuPodPara,rakuPodParaConfigRegion
|
|
|
|
syn region rakuPodPara
|
|
\ start="^[^=]"
|
|
\ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
|
|
\ contained
|
|
\ contains=@rakuPodFormat,rakuPodImplicitCode
|
|
|
|
" Paragraph block to end-of-file
|
|
syn region rakuPodParaRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^=for\>\ze\s\+END\>"
|
|
\ end="\%$"
|
|
\ contains=rakuPodParaEOFTypeRegion
|
|
\ keepend extend
|
|
|
|
syn region rakuPodParaEOFTypeRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="\%$"
|
|
\ contained
|
|
\ contains=rakuPodParaEOF,rakuPodParaConfigRegion
|
|
|
|
syn region rakuPodParaEOF
|
|
\ start="^[^=]"
|
|
\ end="\%$"
|
|
\ contained
|
|
\ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
|
|
|
|
" Delimited blocks (implicit code forbidden)
|
|
syn region rakuPodDelimRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^\z(\s*\)\zs=begin\>"
|
|
\ end="^\z1\zs=end\>"
|
|
\ contains=rakuPodDelimNoCodeTypeRegion
|
|
\ keepend extend skipwhite
|
|
\ nextgroup=rakuPodType
|
|
|
|
syn region rakuPodDelimNoCodeTypeRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\s*\zs\ze=end\>"
|
|
\ contained
|
|
\ contains=rakuPodDelimNoCode,rakuPodDelimConfigRegion
|
|
|
|
syn region rakuPodDelimConfigRegion
|
|
\ start=""
|
|
\ end="^\s*\zs\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
|
|
\ contained
|
|
\ contains=@rakuPodConfig
|
|
|
|
syn region rakuPodDelimNoCode
|
|
\ start="^"
|
|
\ end="^\s*\zs\ze=end\>"
|
|
\ contained
|
|
\ contains=@rakuPodNestedBlocks,@rakuPodFormat
|
|
|
|
" Delimited blocks (everything is code)
|
|
syn region rakuPodDelimRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^\z(\s*\)\zs=begin\>\ze\s*code\>"
|
|
\ end="^\z1\zs=end\>"
|
|
\ contains=rakuPodDelimCodeTypeRegion
|
|
\ keepend extend skipwhite
|
|
\ nextgroup=rakuPodType
|
|
|
|
syn region rakuPodDelimCodeTypeRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\s*\zs\ze=end\>"
|
|
\ contained
|
|
\ contains=rakuPodDelimCode,rakuPodDelimConfigRegion
|
|
|
|
syn region rakuPodDelimCode
|
|
\ start="^"
|
|
\ end="^\s*\zs\ze=end\>"
|
|
\ contained
|
|
\ contains=@rakuPodNestedBlocks
|
|
|
|
" Delimited blocks (implicit code allowed)
|
|
syn region rakuPodDelimRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^\z(\s*\)\zs=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
|
|
\ end="^\z1\zs=end\>"
|
|
\ contains=rakuPodDelimTypeRegion
|
|
\ keepend extend skipwhite
|
|
\ nextgroup=rakuPodType
|
|
|
|
syn region rakuPodDelimTypeRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="^\s*\zs\ze=end\>"
|
|
\ contained
|
|
\ contains=rakuPodDelim,rakuPodDelimConfigRegion
|
|
|
|
syn region rakuPodDelim
|
|
\ start="^"
|
|
\ end="^\s*\zs\ze=end\>"
|
|
\ contained
|
|
\ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
|
|
|
|
" Delimited block to end-of-file
|
|
syn region rakuPodDelimRegion
|
|
\ matchgroup=rakuPodPrefix
|
|
\ start="^=begin\>\ze\s\+END\>"
|
|
\ end="\%$"
|
|
\ extend
|
|
\ contains=rakuPodDelimEOFTypeRegion
|
|
|
|
syn region rakuPodDelimEOFTypeRegion
|
|
\ matchgroup=rakuPodType
|
|
\ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
\ end="\%$"
|
|
\ contained
|
|
\ contains=rakuPodDelimEOF,rakuPodDelimConfigRegion
|
|
|
|
syn region rakuPodDelimEOF
|
|
\ start="^"
|
|
\ end="\%$"
|
|
\ contained
|
|
\ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
|
|
|
|
syn cluster rakuPodConfig
|
|
\ add=rakuPodConfigOperator
|
|
\ add=rakuPodExtraConfig
|
|
\ add=rakuStringAuto
|
|
\ add=rakuPodAutoQuote
|
|
\ add=rakuStringSQ
|
|
|
|
syn region rakuPodParens
|
|
\ start="("
|
|
\ end=")"
|
|
\ contained
|
|
\ contains=rakuNumber,rakuStringSQ
|
|
|
|
syn match rakuPodAutoQuote display contained "=>"
|
|
syn match rakuPodConfigOperator display contained ":!\?" nextgroup=rakuPodConfigOption
|
|
syn match rakuPodConfigOption display contained "[^[:space:](<]\+" nextgroup=rakuPodParens,rakuStringAngle
|
|
syn match rakuPodExtraConfig display contained "^="
|
|
syn match rakuPodVerticalBar display contained "|"
|
|
syn match rakuPodColon display contained ":"
|
|
syn match rakuPodSemicolon display contained ";"
|
|
syn match rakuPodComma display contained ","
|
|
syn match rakuPodImplicitCode display contained "^\s.*"
|
|
syn match rakuPodType display contained "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
|
|
|
|
" These may appear inside delimited blocks
|
|
syn cluster rakuPodNestedBlocks
|
|
\ add=rakuPodAbbrRegion
|
|
\ add=rakuPodDirectRegion
|
|
\ add=rakuPodParaRegion
|
|
\ add=rakuPodDelimRegion
|
|
|
|
" Pod formatting codes
|
|
|
|
syn cluster rakuPodFormat
|
|
\ add=rakuPodFormatOne
|
|
\ add=rakuPodFormatTwo
|
|
\ add=rakuPodFormatThree
|
|
\ add=rakuPodFormatFrench
|
|
|
|
" Balanced angles found inside formatting codes. Ensures proper nesting.
|
|
|
|
syn region rakuPodFormatAnglesOne
|
|
\ matchgroup=rakuPodFormat
|
|
\ start="<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ transparent contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne
|
|
|
|
syn region rakuPodFormatAnglesTwo
|
|
\ matchgroup=rakuPodFormat
|
|
\ start="<<"
|
|
\ skip="<<[^>]*>>"
|
|
\ end=">>"
|
|
\ transparent contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo
|
|
|
|
syn region rakuPodFormatAnglesThree
|
|
\ matchgroup=rakuPodFormat
|
|
\ start="<<<"
|
|
\ skip="<<<[^>]*>>>"
|
|
\ end=">>>"
|
|
\ transparent contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree
|
|
|
|
syn region rakuPodFormatAnglesFrench
|
|
\ matchgroup=rakuPodFormat
|
|
\ start="«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ transparent contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree
|
|
|
|
" All formatting codes
|
|
|
|
syn region rakuPodFormatOne
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="\u<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne
|
|
|
|
syn region rakuPodFormatTwo
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="\u<<"
|
|
\ skip="<<[^>]*>>"
|
|
\ end=">>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo
|
|
|
|
syn region rakuPodFormatThree
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="\u<<<"
|
|
\ skip="<<<[^>]*>>>"
|
|
\ end=">>>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree
|
|
|
|
syn region rakuPodFormatFrench
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="\u«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree
|
|
|
|
" C<> and V<> don't allow nested formatting formatting codes
|
|
|
|
syn region rakuPodFormatOne
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="[CV]<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesOne
|
|
|
|
syn region rakuPodFormatTwo
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="[CV]<<"
|
|
\ skip="<<[^>]*>>"
|
|
\ end=">>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesTwo
|
|
|
|
syn region rakuPodFormatThree
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="[CV]<<<"
|
|
\ skip="<<<[^>]*>>>"
|
|
\ end=">>>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesThree
|
|
|
|
syn region rakuPodFormatFrench
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="[CV]«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesFrench
|
|
|
|
" L<> can have a "|" separator
|
|
|
|
syn region rakuPodFormatOne
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="L<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar
|
|
|
|
syn region rakuPodFormatTwo
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="L<<"
|
|
\ skip="<<[^>]*>>"
|
|
\ end=">>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar
|
|
|
|
syn region rakuPodFormatThree
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="L<<<"
|
|
\ skip="<<<[^>]*>>>"
|
|
\ end=">>>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar
|
|
|
|
syn region rakuPodFormatFrench
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="L«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar
|
|
|
|
" E<> can have a ";" separator
|
|
|
|
syn region rakuPodFormatOne
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="E<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodSemiColon
|
|
|
|
syn region rakuPodFormatTwo
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="E<<"
|
|
\ skip="<<[^>]*>>"
|
|
\ end=">>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodSemiColon
|
|
|
|
syn region rakuPodFormatThree
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="E<<<"
|
|
\ skip="<<<[^>]*>>>"
|
|
\ end=">>>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon
|
|
|
|
syn region rakuPodFormatFrench
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="E«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon
|
|
|
|
" M<> can have a ":" separator
|
|
|
|
syn region rakuPodFormatOne
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="M<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodColon
|
|
|
|
syn region rakuPodFormatTwo
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="M<<"
|
|
\ skip="<<[^>]*>>"
|
|
\ end=">>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodColon
|
|
|
|
syn region rakuPodFormatThree
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="M<<<"
|
|
\ skip="<<<[^>]*>>>"
|
|
\ end=">>>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon
|
|
|
|
syn region rakuPodFormatFrench
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="M«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon
|
|
|
|
" D<> can have "|" and ";" separators
|
|
|
|
syn region rakuPodFormatOne
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="D<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon
|
|
|
|
syn region rakuPodFormatTwo
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="D<<"
|
|
\ skip="<<[^>]*>>"
|
|
\ end=">>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAngleTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon
|
|
|
|
syn region rakuPodFormatThree
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="D<<<"
|
|
\ skip="<<<[^>]*>>>"
|
|
\ end=">>>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon
|
|
|
|
syn region rakuPodFormatFrench
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="D«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon
|
|
|
|
" X<> can have "|", "," and ";" separators
|
|
|
|
syn region rakuPodFormatOne
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="X<"
|
|
\ skip="<[^>]*>"
|
|
\ end=">"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
|
|
|
|
syn region rakuPodFormatTwo
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="X<<"
|
|
\ skip="<<[^>]*>>"
|
|
\ end=">>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
|
|
|
|
syn region rakuPodFormatThree
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="X<<<"
|
|
\ skip="<<<[^>]*>>>"
|
|
\ end=">>>"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
|
|
|
|
syn region rakuPodFormatFrench
|
|
\ matchgroup=rakuPodFormatCode
|
|
\ start="X«"
|
|
\ skip="«[^»]*»"
|
|
\ end="»"
|
|
\ contained
|
|
\ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
|
|
|
|
" Define the default highlighting.
|
|
" For version 5.7 and earlier: only when not done already
|
|
" For version 5.8 and later: only when an item doesn't have highlighting yet
|
|
if version >= 508 || !exists("did_raku_syntax_inits")
|
|
if version < 508
|
|
let did_raku_syntax_inits = 1
|
|
command -nargs=+ HiLink hi link <args>
|
|
else
|
|
command -nargs=+ HiLink hi def link <args>
|
|
endif
|
|
|
|
HiLink rakuEscOctOld rakuError
|
|
HiLink rakuPackageTwigil rakuTwigil
|
|
HiLink rakuStringAngle rakuString
|
|
HiLink rakuStringAngleFixed rakuString
|
|
HiLink rakuStringFrench rakuString
|
|
HiLink rakuStringAngles rakuString
|
|
HiLink rakuStringSQ rakuString
|
|
HiLink rakuStringDQ rakuString
|
|
HiLink rakuStringQ rakuString
|
|
HiLink rakuStringQ_q rakuString
|
|
HiLink rakuStringQ_qww rakuString
|
|
HiLink rakuStringQ_qq rakuString
|
|
HiLink rakuStringQ_to rakuString
|
|
HiLink rakuStringQ_qto rakuString
|
|
HiLink rakuStringQ_qqto rakuString
|
|
HiLink rakuRxStringSQ rakuString
|
|
HiLink rakuRxStringDQ rakuString
|
|
HiLink rakuReplacement rakuString
|
|
HiLink rakuReplCurly rakuString
|
|
HiLink rakuReplAngle rakuString
|
|
HiLink rakuReplFrench rakuString
|
|
HiLink rakuReplBracket rakuString
|
|
HiLink rakuReplParen rakuString
|
|
HiLink rakuTransliteration rakuString
|
|
HiLink rakuTransRepl rakuString
|
|
HiLink rakuTransReplCurly rakuString
|
|
HiLink rakuTransReplAngle rakuString
|
|
HiLink rakuTransReplFrench rakuString
|
|
HiLink rakuTransReplBracket rakuString
|
|
HiLink rakuTransReplParen rakuString
|
|
HiLink rakuStringAuto rakuString
|
|
HiLink rakuKey rakuString
|
|
HiLink rakuMatch rakuString
|
|
HiLink rakuSubstitution rakuString
|
|
HiLink rakuMatchBare rakuString
|
|
HiLink rakuRegexBlock rakuString
|
|
HiLink rakuRxP5CharClass rakuString
|
|
HiLink rakuRxP5QuoteMeta rakuString
|
|
HiLink rakuRxCharClass rakuString
|
|
HiLink rakuRxQuoteWords rakuString
|
|
HiLink rakuReduceOp rakuOperator
|
|
HiLink rakuSetOp rakuOperator
|
|
HiLink rakuRSXZOp rakuOperator
|
|
HiLink rakuHyperOp rakuOperator
|
|
HiLink rakuPostHyperOp rakuOperator
|
|
HiLink rakuQuoteQ rakuQuote
|
|
HiLink rakuQuoteQ_q rakuQuote
|
|
HiLink rakuQuoteQ_qww rakuQuote
|
|
HiLink rakuQuoteQ_qq rakuQuote
|
|
HiLink rakuQuoteQ_to rakuQuote
|
|
HiLink rakuQuoteQ_qto rakuQuote
|
|
HiLink rakuQuoteQ_qqto rakuQuote
|
|
HiLink rakuQuoteQ_PIR rakuQuote
|
|
HiLink rakuMatchStart_m rakuQuote
|
|
HiLink rakuMatchStart_s rakuQuote
|
|
HiLink rakuMatchStart_tr rakuQuote
|
|
HiLink rakuBareSigil rakuVariable
|
|
HiLink rakuRxRange rakuStringSpecial
|
|
HiLink rakuRxAnchor rakuStringSpecial
|
|
HiLink rakuRxBoundary rakuStringSpecial
|
|
HiLink rakuRxP5Anchor rakuStringSpecial
|
|
HiLink rakuCodePoint rakuStringSpecial
|
|
HiLink rakuRxMeta rakuStringSpecial
|
|
HiLink rakuRxP5Range rakuStringSpecial
|
|
HiLink rakuRxP5CPId rakuStringSpecial
|
|
HiLink rakuRxP5Posix rakuStringSpecial
|
|
HiLink rakuRxP5Mod rakuStringSpecial
|
|
HiLink rakuRxP5HexSeq rakuStringSpecial
|
|
HiLink rakuRxP5OctSeq rakuStringSpecial
|
|
HiLink rakuRxP5WriteRefId rakuStringSpecial
|
|
HiLink rakuHexSequence rakuStringSpecial
|
|
HiLink rakuOctSequence rakuStringSpecial
|
|
HiLink rakuRxP5Named rakuStringSpecial
|
|
HiLink rakuRxP5PropId rakuStringSpecial
|
|
HiLink rakuRxP5Quantifier rakuStringSpecial
|
|
HiLink rakuRxP5CountId rakuStringSpecial
|
|
HiLink rakuRxP5Verb rakuStringSpecial
|
|
HiLink rakuRxAssertGroup rakuStringSpecial2
|
|
HiLink rakuEscape rakuStringSpecial2
|
|
HiLink rakuEscNull rakuStringSpecial2
|
|
HiLink rakuEscHash rakuStringSpecial2
|
|
HiLink rakuEscQQ rakuStringSpecial2
|
|
HiLink rakuEscQuote rakuStringSpecial2
|
|
HiLink rakuEscDoubleQuote rakuStringSpecial2
|
|
HiLink rakuEscBackTick rakuStringSpecial2
|
|
HiLink rakuEscForwardSlash rakuStringSpecial2
|
|
HiLink rakuEscVerticalBar rakuStringSpecial2
|
|
HiLink rakuEscExclamation rakuStringSpecial2
|
|
HiLink rakuEscDollar rakuStringSpecial2
|
|
HiLink rakuEscOpenCurly rakuStringSpecial2
|
|
HiLink rakuEscCloseCurly rakuStringSpecial2
|
|
HiLink rakuEscCloseBracket rakuStringSpecial2
|
|
HiLink rakuEscCloseAngle rakuStringSpecial2
|
|
HiLink rakuEscCloseFrench rakuStringSpecial2
|
|
HiLink rakuEscBackSlash rakuStringSpecial2
|
|
HiLink rakuEscCodePoint rakuStringSpecial2
|
|
HiLink rakuEscOct rakuStringSpecial2
|
|
HiLink rakuEscHex rakuStringSpecial2
|
|
HiLink rakuRxEscape rakuStringSpecial2
|
|
HiLink rakuRxCapture rakuStringSpecial2
|
|
HiLink rakuRxAlternation rakuStringSpecial2
|
|
HiLink rakuRxP5 rakuStringSpecial2
|
|
HiLink rakuRxP5ReadRef rakuStringSpecial2
|
|
HiLink rakuRxP5Oct rakuStringSpecial2
|
|
HiLink rakuRxP5Hex rakuStringSpecial2
|
|
HiLink rakuRxP5EscMeta rakuStringSpecial2
|
|
HiLink rakuRxP5Meta rakuStringSpecial2
|
|
HiLink rakuRxP5Escape rakuStringSpecial2
|
|
HiLink rakuRxP5CodePoint rakuStringSpecial2
|
|
HiLink rakuRxP5WriteRef rakuStringSpecial2
|
|
HiLink rakuRxP5Prop rakuStringSpecial2
|
|
|
|
HiLink rakuProperty Tag
|
|
HiLink rakuAttention Todo
|
|
HiLink rakuType Type
|
|
HiLink rakuError Error
|
|
HiLink rakuBlockLabel Label
|
|
HiLink rakuNormal Normal
|
|
HiLink rakuIdentifier Normal
|
|
HiLink rakuPackage Normal
|
|
HiLink rakuPackageScope Normal
|
|
HiLink rakuNumber Number
|
|
HiLink rakuOctNumber Number
|
|
HiLink rakuBinNumber Number
|
|
HiLink rakuHexNumber Number
|
|
HiLink rakuDecNumber Number
|
|
HiLink rakuString String
|
|
HiLink rakuRepeat Repeat
|
|
HiLink rakuPragma Keyword
|
|
HiLink rakuPreDeclare Keyword
|
|
HiLink rakuDeclare Keyword
|
|
HiLink rakuDeclareRegex Keyword
|
|
HiLink rakuVarStorage Special
|
|
HiLink rakuFlowControl Special
|
|
HiLink rakuOctBase Special
|
|
HiLink rakuBinBase Special
|
|
HiLink rakuHexBase Special
|
|
HiLink rakuDecBase Special
|
|
HiLink rakuTwigil Special
|
|
HiLink rakuStringSpecial2 Special
|
|
HiLink rakuVersion Special
|
|
HiLink rakuComment Comment
|
|
HiLink rakuBracketComment Comment
|
|
HiLink rakuInclude Include
|
|
HiLink rakuShebang PreProc
|
|
HiLink rakuClosureTrait PreProc
|
|
HiLink rakuOperator Operator
|
|
HiLink rakuContext Operator
|
|
HiLink rakuQuote Delimiter
|
|
HiLink rakuTypeConstraint PreCondit
|
|
HiLink rakuException Exception
|
|
HiLink rakuVariable Identifier
|
|
HiLink rakuVarSlash Identifier
|
|
HiLink rakuVarNum Identifier
|
|
HiLink rakuVarExclam Identifier
|
|
HiLink rakuVarMatch Identifier
|
|
HiLink rakuVarName Identifier
|
|
HiLink rakuMatchVar Identifier
|
|
HiLink rakuRxP5ReadRefId Identifier
|
|
HiLink rakuRxP5ModDef Identifier
|
|
HiLink rakuRxP5ModName Identifier
|
|
HiLink rakuConditional Conditional
|
|
HiLink rakuStringSpecial SpecialChar
|
|
|
|
HiLink rakuPodAbbr rakuPod
|
|
HiLink rakuPodAbbrEOF rakuPod
|
|
HiLink rakuPodAbbrNoCode rakuPod
|
|
HiLink rakuPodAbbrCode rakuPodCode
|
|
HiLink rakuPodPara rakuPod
|
|
HiLink rakuPodParaEOF rakuPod
|
|
HiLink rakuPodParaNoCode rakuPod
|
|
HiLink rakuPodParaCode rakuPodCode
|
|
HiLink rakuPodDelim rakuPod
|
|
HiLink rakuPodDelimEOF rakuPod
|
|
HiLink rakuPodDelimNoCode rakuPod
|
|
HiLink rakuPodDelimCode rakuPodCode
|
|
HiLink rakuPodImplicitCode rakuPodCode
|
|
HiLink rakuPodExtraConfig rakuPodPrefix
|
|
HiLink rakuPodVerticalBar rakuPodFormatCode
|
|
HiLink rakuPodColon rakuPodFormatCode
|
|
HiLink rakuPodSemicolon rakuPodFormatCode
|
|
HiLink rakuPodComma rakuPodFormatCode
|
|
HiLink rakuPodFormatOne rakuPodFormat
|
|
HiLink rakuPodFormatTwo rakuPodFormat
|
|
HiLink rakuPodFormatThree rakuPodFormat
|
|
HiLink rakuPodFormatFrench rakuPodFormat
|
|
|
|
HiLink rakuPodType Type
|
|
HiLink rakuPodConfigOption String
|
|
HiLink rakuPodCode PreProc
|
|
HiLink rakuPod Comment
|
|
HiLink rakuPodComment Comment
|
|
HiLink rakuPodAutoQuote Operator
|
|
HiLink rakuPodConfigOperator Operator
|
|
HiLink rakuPodPrefix Statement
|
|
HiLink rakuPodName Identifier
|
|
HiLink rakuPodFormatCode SpecialChar
|
|
HiLink rakuPodFormat SpecialComment
|
|
|
|
delcommand HiLink
|
|
endif
|
|
|
|
if exists("raku_fold") || exists("raku_extended_all")
|
|
setl foldmethod=syntax
|
|
syn region rakuBlockFold
|
|
\ start="^\z(\s*\)\%(my\|our\|augment\|multi\|proto\|only\)\?\s*\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\s\+\)\?\<\%(CATCH\|try\|ENTER\|LEAVE\|CHECK\|INIT\|BEGIN\|END\|KEEP\|UNDO\|PRE\|POST\|module\|package\|enum\|subset\|class\|sub\%(method\)\?\|multi\|method\|slang\|grammar\|regex\|token\|rule\)\>[^{]\+\%({\s*\%(#.*\)\?\)\?$"
|
|
\ end="^\z1}"
|
|
\ transparent fold keepend extend
|
|
endif
|
|
|
|
let b:current_syntax = "raku"
|
|
|
|
let &cpo = s:keepcpo
|
|
unlet s:keepcpo
|
|
|
|
" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
|