xref: /vim-8.2.3635/runtime/syntax/julia.vim (revision 6aa57295)
1*6aa57295SBram Moolenaar" Vim syntax file
2*6aa57295SBram Moolenaar" Language:	julia
3*6aa57295SBram Moolenaar" Maintainer:	Carlo Baldassi <[email protected]>
4*6aa57295SBram Moolenaar" Homepage:	https://github.com/JuliaEditorSupport/julia-vim
5*6aa57295SBram Moolenaar" Last Change:	2021 Aug 04
6*6aa57295SBram Moolenaar
7*6aa57295SBram Moolenaarif version < 600
8*6aa57295SBram Moolenaar  syntax clear
9*6aa57295SBram Moolenaarelseif exists("b:current_syntax")
10*6aa57295SBram Moolenaar  finish
11*6aa57295SBram Moolenaarendif
12*6aa57295SBram Moolenaar
13*6aa57295SBram Moolenaarlet s:cpo_save = &cpo
14*6aa57295SBram Moolenaarset cpo&vim
15*6aa57295SBram Moolenaar
16*6aa57295SBram Moolenaarif version < 704
17*6aa57295SBram Moolenaar  " this is used to disable regex syntax like `\@3<='
18*6aa57295SBram Moolenaar  " on older vim versions
19*6aa57295SBram Moolenaar  function! s:d(x)
20*6aa57295SBram Moolenaar    return ''
21*6aa57295SBram Moolenaar  endfunction
22*6aa57295SBram Moolenaarelse
23*6aa57295SBram Moolenaar  function! s:d(x)
24*6aa57295SBram Moolenaar    return string(a:x)
25*6aa57295SBram Moolenaar  endfunction
26*6aa57295SBram Moolenaarendif
27*6aa57295SBram Moolenaar
28*6aa57295SBram Moolenaarscriptencoding utf-8
29*6aa57295SBram Moolenaar
30*6aa57295SBram Moolenaarlet s:julia_spellcheck_strings = get(g:, "julia_spellcheck_strings", 0)
31*6aa57295SBram Moolenaarlet s:julia_spellcheck_docstrings = get(g:, "julia_spellcheck_docstrings", 1)
32*6aa57295SBram Moolenaarlet s:julia_spellcheck_comments = get(g:, "julia_spellcheck_comments", 1)
33*6aa57295SBram Moolenaar
34*6aa57295SBram Moolenaarlet s:julia_highlight_operators = get(g:, "julia_highlight_operators", 1)
35*6aa57295SBram Moolenaar
36*6aa57295SBram Moolenaar" List of characters, up to \UFF, which cannot be used in identifiers.
37*6aa57295SBram Moolenaar" (It includes operator characters; we don't consider them identifiers.)
38*6aa57295SBram Moolenaar" This is used mostly in lookbehinds with `\@<=`, e.g. when we need to check
39*6aa57295SBram Moolenaar" that that we're not in the middle of an identifier.
40*6aa57295SBram Moolenaar" It doesn't include a few characters (spaces and all closing parentheses)
41*6aa57295SBram Moolenaar" because those may or may not be valid in the lookbehind on a case-by-case
42*6aa57295SBram Moolenaar" basis.
43*6aa57295SBram Moolenaarlet s:nonid_chars = '\U00-\U08' . '\U0A-\U1F'
44*6aa57295SBram Moolenaar      \             . '\U21-\U28' . '\U2A-\U2F' . '\U3A-\U40' . '\U5B-\U5E' . '\U60' . '\U7B\U7C'
45*6aa57295SBram Moolenaar      \             . '\U7E-\UA1' . '\UA7\UA8' . '\UAB-\UAD' . '\UAF\UB1\UB4' . '\UB6-\UB8' . '\UBB\UBF' . '\UD7\UF7'
46*6aa57295SBram Moolenaar
47*6aa57295SBram Moolenaar" The complete list
48*6aa57295SBram Moolenaarlet s:nonidS_chars = '[:space:])\U5D}' . s:nonid_chars
49*6aa57295SBram Moolenaar
50*6aa57295SBram Moolenaar
51*6aa57295SBram Moolenaar" List of all valid operator chars up to \UFF (NOTE: they must all be included
52*6aa57295SBram Moolenaar" in s:nonidS_chars, so that if we include that, then this is redundant)
53*6aa57295SBram Moolenaar" It does not include '!' since it can be used in an identifier.
54*6aa57295SBram Moolenaar" The list contains the following characters: '%&*+-/<=>\\^|~¬±×÷'
55*6aa57295SBram Moolenaarlet s:op_chars = '\U25\U26\U2A\U2B\U2D\U2F\U3C-\U3E\U5C\U5E\U7C\U7E\UAC\UB1\UD7\UF7'
56*6aa57295SBram Moolenaar
57*6aa57295SBram Moolenaar" List of all valid operator chars above \UFF
58*6aa57295SBram Moolenaar" Written with ranges for performance reasons
59*6aa57295SBram Moolenaar" The list contains the following characters: '…⁝⅋←↑→↓↔↚↛↜↝↞↠↢↣↤↦↩↪↫↬↮↶↷↺↻↼↽⇀⇁⇄⇆⇇⇉⇋⇌⇍⇎⇏⇐⇒⇔⇚⇛⇜⇝⇠⇢⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿∈∉∊∋∌∍∓∔∗∘∙√∛∜∝∤∥∦∧∨∩∪∷∸∺∻∽∾≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊞⊟⊠⊡⊢⊣⊩⊬⊮⊰⊱⊲⊳⊴⊵⊶⊷⊻⊼⊽⋄⋅⋆⋇⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌿▷⟂⟈⟉⟑⟒⟕⟖⟗⟰⟱⟵⟶⟷⟹⟺⟻⟼⟽⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕⤖⤗⤘⤝⤞⤟⤠⥄⥅⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩⥪⥫⥬⥭⥮⥯⥰⦷⦸⦼⦾⦿⧀⧁⧡⧣⧤⧥⧴⧶⧷⧺⧻⨇⨈⨝⨟⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨰⨱⨲⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⩀⩁⩂⩃⩄⩅⩊⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖⩗⩘⩚⩛⩜⩝⩞⩟⩠⩡⩢⩣⩦⩧⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫛⫷⫸⫹⫺⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭇⭈⭉⭊⭋⭌←↑→↓'
60*6aa57295SBram Moolenaarlet s:op_chars_wc = '\U2026\U205D\U214B\U2190-\U2194\U219A-\U219E\U21A0\U21A2-\U21A4\U21A6\U21A9-\U21AC\U21AE\U21B6\U21B7\U21BA-\U21BD\U21C0\U21C1\U21C4\U21C6\U21C7\U21C9\U21CB-\U21D0\U21D2\U21D4\U21DA-\U21DD\U21E0\U21E2\U21F4-\U21FF\U2208-\U220D\U2213\U2214\U2217-\U221D\U2224-\U222A\U2237\U2238\U223A\U223B\U223D\U223E\U2240-\U228B\U228D-\U229C\U229E-\U22A3\U22A9\U22AC\U22AE\U22B0-\U22B7\U22BB-\U22BD\U22C4-\U22C7\U22C9-\U22D3\U22D5-\U22FF\U233F\U25B7\U27C2\U27C8\U27C9\U27D1\U27D2\U27D5-\U27D7\U27F0\U27F1\U27F5-\U27F7\U27F9-\U27FF\U2900-\U2918\U291D-\U2920\U2944-\U2970\U29B7\U29B8\U29BC\U29BE-\U29C1\U29E1\U29E3-\U29E5\U29F4\U29F6\U29F7\U29FA\U29FB\U2A07\U2A08\U2A1D\U2A1F\U2A22-\U2A2E\U2A30-\U2A3D\U2A40-\U2A45\U2A4A-\U2A58\U2A5A-\U2A63\U2A66\U2A67\U2A6A-\U2AD9\U2ADB\U2AF7-\U2AFA\U2B30-\U2B44\U2B47-\U2B4C\UFFE9-\UFFEC'
61*6aa57295SBram Moolenaar
62*6aa57295SBram Moolenaar" Full operators regex
63*6aa57295SBram Moolenaarlet s:operators = '\%(' . '\.\%([-+*/^÷%|&⊻]\|//\|\\\|>>\|>>>\?\)\?=' .
64*6aa57295SBram Moolenaar      \           '\|'  . '[:<>]=\|||\|&&\||>\|<|\|[<>:]:\|<<\|>>>\?\|//\|[-=]>\|\.\.\.\?' .
65*6aa57295SBram Moolenaar      \           '\|'  . '\.\?[!' . s:op_chars . s:op_chars_wc . ']' .
66*6aa57295SBram Moolenaar      \           '\)'
67*6aa57295SBram Moolenaar
68*6aa57295SBram Moolenaar
69*6aa57295SBram Moolenaar" Characters that can be used to start an identifier. Above \UBF we don't
70*6aa57295SBram Moolenaar" bother checking. (If a UTF8 operator is used, it will take precedence anyway.)
71*6aa57295SBram Moolenaarlet s:id_charsH = '\%([A-Za-z_\UA2-\UA6\UA9\UAA\UAE\UB0\UB5\UBA]\|[^\U00-\UBF]\)'
72*6aa57295SBram Moolenaar" Characters that can appear in an identifier, starting in 2nd position. Above
73*6aa57295SBram Moolenaar" \UBF we check for operators since we need to stop the identifier if one
74*6aa57295SBram Moolenaar" appears. We don't check for invalid characters though.
75*6aa57295SBram Moolenaarlet s:id_charsW = '\%([0-9A-Za-z_!\UA2-\UA6\UA9\UAA\UAE-\UB0\UB2-\UB5\UB8-\UBA\UBC-\UBE]\|[^\U00-\UBF]\@=[^' . s:op_chars_wc . ']\)'
76*6aa57295SBram Moolenaar
77*6aa57295SBram Moolenaar" A valid julia identifier, more or less
78*6aa57295SBram Moolenaarlet s:idregex = '\%(' . s:id_charsH . s:id_charsW . '*\)'
79*6aa57295SBram Moolenaar
80*6aa57295SBram Moolenaar
81*6aa57295SBram Moolenaar
82*6aa57295SBram Moolenaarsyn case match
83*6aa57295SBram Moolenaar
84*6aa57295SBram Moolenaarsyntax cluster juliaExpressions		contains=@juliaParItems,@juliaStringItems,@juliaKeywordItems,@juliaBlocksItems,@juliaTypesItems,@juliaConstItems,@juliaMacroItems,@juliaSymbolItems,@juliaOperatorItems,@juliaNumberItems,@juliaCommentItems,@juliaErrorItems,@juliaSyntaxRegions
85*6aa57295SBram Moolenaarsyntax cluster juliaExprsPrintf		contains=@juliaExpressions,@juliaPrintfItems
86*6aa57295SBram Moolenaarsyntax cluster juliaExprsNodot		contains=@juliaParItems,@juliaStringItems,@juliaMacroItems,@juliaSymbolItems,@juliaOperatorItems,@juliaCommentItems,juliaIdSymbol
87*6aa57295SBram Moolenaar
88*6aa57295SBram Moolenaarsyntax cluster juliaParItems		contains=juliaParBlock,juliaSqBraIdxBlock,juliaSqBraBlock,juliaCurBraBlock,juliaQuotedParBlock,juliaQuotedQMarkPar
89*6aa57295SBram Moolenaarsyntax cluster juliaKeywordItems	contains=juliaKeyword,juliaWhereKeyword,juliaImportLine,juliaInfixKeyword,juliaRepKeyword
90*6aa57295SBram Moolenaarsyntax cluster juliaBlocksItems		contains=juliaConditionalBlock,juliaWhileBlock,juliaForBlock,juliaBeginBlock,juliaFunctionBlock,juliaMacroBlock,juliaQuoteBlock,juliaTypeBlock,juliaImmutableBlock,juliaExceptionBlock,juliaLetBlock,juliaDoBlock,juliaModuleBlock,juliaStructBlock,juliaMutableStructBlock,juliaAbstractBlock,juliaPrimitiveBlock
91*6aa57295SBram Moolenaarsyntax cluster juliaTypesItems		contains=juliaBaseTypeBasic,juliaBaseTypeNum,juliaBaseTypeC,juliaBaseTypeError,juliaBaseTypeIter,juliaBaseTypeString,juliaBaseTypeArray,juliaBaseTypeDict,juliaBaseTypeSet,juliaBaseTypeIO,juliaBaseTypeProcess,juliaBaseTypeRange,juliaBaseTypeRegex,juliaBaseTypeFact,juliaBaseTypeFact,juliaBaseTypeSort,juliaBaseTypeRound,juliaBaseTypeSpecial,juliaBaseTypeRandom,juliaBaseTypeDisplay,juliaBaseTypeTime,juliaBaseTypeOther
92*6aa57295SBram Moolenaar
93*6aa57295SBram Moolenaarsyntax cluster juliaConstItems  	contains=juliaConstNum,juliaConstBool,juliaConstEnv,juliaConstMMap,juliaConstC,juliaConstGeneric,juliaConstIO,juliaPossibleEuler
94*6aa57295SBram Moolenaar
95*6aa57295SBram Moolenaarsyntax cluster juliaMacroItems		contains=juliaPossibleMacro,juliaDollarVar,juliaDollarPar,juliaDollarSqBra
96*6aa57295SBram Moolenaarsyntax cluster juliaSymbolItems		contains=juliaPossibleSymbol
97*6aa57295SBram Moolenaarsyntax cluster juliaNumberItems		contains=juliaNumbers
98*6aa57295SBram Moolenaarsyntax cluster juliaStringItems		contains=juliaChar,juliaString,juliabString,juliasString,juliaShellString,juliaDocString,juliaRegEx
99*6aa57295SBram Moolenaarsyntax cluster juliaPrintfItems		contains=juliaPrintfParBlock,juliaPrintfString
100*6aa57295SBram Moolenaarsyntax cluster juliaOperatorItems	contains=juliaOperator,juliaRangeOperator,juliaCTransOperator,juliaTernaryRegion,juliaColon,juliaSemicolon,juliaComma
101*6aa57295SBram Moolenaarsyntax cluster juliaCommentItems	contains=juliaCommentL,juliaCommentM
102*6aa57295SBram Moolenaarsyntax cluster juliaErrorItems		contains=juliaErrorPar,juliaErrorEnd,juliaErrorElse,juliaErrorCatch,juliaErrorFinally
103*6aa57295SBram Moolenaar
104*6aa57295SBram Moolenaarsyntax cluster juliaSyntaxRegions	contains=juliaIdSymbol,juliaTypeOperatorR2,juliaTypeOperatorR3,juliaWhereR,juliaDotted
105*6aa57295SBram Moolenaar
106*6aa57295SBram Moolenaarsyntax cluster juliaSpellcheckStrings		contains=@spell
107*6aa57295SBram Moolenaarsyntax cluster juliaSpellcheckDocStrings	contains=@spell
108*6aa57295SBram Moolenaarsyntax cluster juliaSpellcheckComments		contains=@spell
109*6aa57295SBram Moolenaar
110*6aa57295SBram Moolenaarif !s:julia_spellcheck_docstrings
111*6aa57295SBram Moolenaar  syntax cluster juliaSpellcheckDocStrings	remove=@spell
112*6aa57295SBram Moolenaarendif
113*6aa57295SBram Moolenaarif !s:julia_spellcheck_strings
114*6aa57295SBram Moolenaar  syntax cluster juliaSpellcheckStrings		remove=@spell
115*6aa57295SBram Moolenaarendif
116*6aa57295SBram Moolenaarif !s:julia_spellcheck_comments
117*6aa57295SBram Moolenaar  syntax cluster juliaSpellcheckComments	remove=@spell
118*6aa57295SBram Moolenaarendif
119*6aa57295SBram Moolenaar
120*6aa57295SBram Moolenaarsyntax match   juliaSemicolon		display ";"
121*6aa57295SBram Moolenaarsyntax match   juliaComma		display ","
122*6aa57295SBram Moolenaarsyntax match   juliaColon		display ":"
123*6aa57295SBram Moolenaar
124*6aa57295SBram Moolenaar" A dot can introduce a sort of 'environment' such that words after it are not
125*6aa57295SBram Moolenaar" recognized as keywords. This has low precedence so that it can be overridden
126*6aa57295SBram Moolenaar" by operators
127*6aa57295SBram Moolenaarsyntax match   juliaDotted		transparent "\.\s*[^])}.]" contains=@juliaExprsNodot
128*6aa57295SBram Moolenaarsyntax match   juliaDottedT		contained transparent "\.\s*[^])}.]" contains=@juliaExprsNodot,juliaType
129*6aa57295SBram Moolenaar
130*6aa57295SBram Moolenaarsyntax match   juliaErrorPar		display "[])}]"
131*6aa57295SBram Moolenaarsyntax match   juliaErrorEnd		display "\<end\>"
132*6aa57295SBram Moolenaarsyntax match   juliaErrorElse		display "\<\%(else\|elseif\)\>"
133*6aa57295SBram Moolenaarsyntax match   juliaErrorCatch		display "\<catch\>"
134*6aa57295SBram Moolenaarsyntax match   juliaErrorFinally	display "\<finally\>"
135*6aa57295SBram Moolenaarsyntax match   juliaErrorSemicol	display contained ";"
136*6aa57295SBram Moolenaar
137*6aa57295SBram Moolenaarsyntax region  juliaParBlock		matchgroup=juliaParDelim start="(" end=")" contains=@juliaExpressions,juliaComprehensionFor
138*6aa57295SBram Moolenaarsyntax region  juliaParBlockInRange	matchgroup=juliaParDelim contained start="(" end=")" contains=@juliaExpressions,juliaParBlockInRange,juliaRangeKeyword,juliaComprehensionFor
139*6aa57295SBram Moolenaarsyntax region  juliaSqBraIdxBlock	matchgroup=juliaParDelim start="\[" end="\]" contains=@juliaExpressions,juliaParBlockInRange,juliaRangeKeyword,juliaComprehensionFor,juliaSymbolS,juliaQuotedParBlockS,juliaQuotedQMarkParS
140*6aa57295SBram Moolenaarexec 'syntax region  juliaSqBraBlock	matchgroup=juliaParDelim start="\%(^\|\s\|' . s:operators . '\)\@'.s:d(3).'<=\[" end="\]" contains=@juliaExpressions,juliaComprehensionFor,juliaSymbolS,juliaQuotedParBlockS,juliaQuotedQMarkParS'
141*6aa57295SBram Moolenaarsyntax region  juliaCurBraBlock		matchgroup=juliaParDelim start="{" end="}" contains=juliaType,juliaDottedT,@juliaExpressions
142*6aa57295SBram Moolenaar
143*6aa57295SBram Moolenaarexec 'syntax match   juliaType		contained "\%(' . s:idregex . '\.\)*\zs' . s:idregex . '"'
144*6aa57295SBram Moolenaar
145*6aa57295SBram Moolenaar" This is a generic identifier followed by some symbol, either a type
146*6aa57295SBram Moolenaar" operator (<: or >:), or an open parenthesis, or an open curly bracket.
147*6aa57295SBram Moolenaar" It's used to recognize one of the contained regions looking for identifiers
148*6aa57295SBram Moolenaar" only once. Once recognized, those regions no longer need to use the
149*6aa57295SBram Moolenaar" expensive s:idregex.
150*6aa57295SBram Moolenaarexec 'syntax match   juliaIdSymbol	transparent "' . s:idregex . '\%(\s*[<>]:\|\.\?(\|{\|\"\)\@=" contains=juliaFunctionCall,juliaParamType,juliaStringPrefixed,juliaTypeOperatorR1'
151*6aa57295SBram Moolenaar
152*6aa57295SBram Moolenaarsyntax match  juliaFunctionCall		contained "[^{([:space:]<>\"]\+(\@=" nextgroup=juliaParBlock
153*6aa57295SBram Moolenaar
154*6aa57295SBram Moolenaarexec 'syntax match   juliaFunctionDef	contained transparent "\%(\<\%(function\|macro\)\)\@'.s:d(8).'<=\s\+\zs' . s:idregex . '\%(\.' . s:idregex . '\)*\ze\s*\%((\|\send\>\|$\)" contains=juliaFunctionName'
155*6aa57295SBram Moolenaarexec 'syntax match   juliaFunctionName	contained "\%(\<\%(function\|macro\)\s\+\)\@'.s:d(20).'<=\%(' . s:idregex . '\.\)*\zs' . s:idregex . '"'
156*6aa57295SBram Moolenaar
157*6aa57295SBram Moolenaarexec 'syntax match   juliaStructR	contained transparent "\%(\<\%(\%(mutable\s\+\)\?struct\|\%(abstract\|primitive\)\s\+type\)\s\+\)\@'.s:d(20).'<=\%(' . s:idregex . '\.\)*' . s:idregex . '\>\(\s*(\)\@!" contains=juliaType'
158*6aa57295SBram Moolenaar
159*6aa57295SBram Moolenaarsyntax match   juliaKeyword		display "\<\%(return\|local\|global\|const\)\>"
160*6aa57295SBram Moolenaarsyntax match   juliaInfixKeyword	display "\%(=\s*\)\@<!\<\%(in\|isa\)\>\S\@!\%(\s*=\)\@!"
161*6aa57295SBram Moolenaar
162*6aa57295SBram Moolenaar" The import/export/using keywords introduce a sort of special parsing
163*6aa57295SBram Moolenaar" environment with its own rules
164*6aa57295SBram Moolenaarexec 'syntax region  juliaImportLine		matchgroup=juliaKeyword excludenl start="\<\%(import\|using\|export\)\>" skip="\%(\%(\<\%(import\|using\|export\)\>\)\|^\)\@'.s:d(6).'<=$" end="$" end="\%([])}]\)\@=" contains=@juliaExpressions,juliaAsKeyword,@juliaContinuationItems,juliaMacroName'
165*6aa57295SBram Moolenaarsyntax match   juliaAsKeyword		display contained "\<as\>"
166*6aa57295SBram Moolenaar
167*6aa57295SBram Moolenaarsyntax match   juliaRepKeyword		display "\<\%(break\|continue\)\>"
168*6aa57295SBram Moolenaarsyntax region  juliaConditionalBlock	matchgroup=juliaConditional start="\<if\>" end="\<end\>" contains=@juliaExpressions,juliaConditionalEIBlock,juliaConditionalEBlock fold
169*6aa57295SBram Moolenaarsyntax region  juliaConditionalEIBlock	matchgroup=juliaConditional transparent contained start="\<elseif\>" end="\<\%(end\|else\|elseif\)\>"me=s-1 contains=@juliaExpressions,juliaConditionalEIBlock,juliaConditionalEBlock
170*6aa57295SBram Moolenaarsyntax region  juliaConditionalEBlock	matchgroup=juliaConditional transparent contained start="\<else\>" end="\<end\>"me=s-1 contains=@juliaExpressions
171*6aa57295SBram Moolenaarsyntax region  juliaWhileBlock		matchgroup=juliaRepeat start="\<while\>" end="\<end\>" contains=@juliaExpressions fold
172*6aa57295SBram Moolenaarsyntax region  juliaForBlock		matchgroup=juliaRepeat start="\<for\>" end="\<end\>" contains=@juliaExpressions,juliaOuter fold
173*6aa57295SBram Moolenaarsyntax region  juliaBeginBlock		matchgroup=juliaBlKeyword start="\<begin\>" end="\<end\>" contains=@juliaExpressions fold
174*6aa57295SBram Moolenaarsyntax region  juliaFunctionBlock	matchgroup=juliaBlKeyword start="\<function\>" end="\<end\>" contains=@juliaExpressions,juliaFunctionDef fold
175*6aa57295SBram Moolenaarsyntax region  juliaMacroBlock		matchgroup=juliaBlKeyword start="\<macro\>" end="\<end\>" contains=@juliaExpressions,juliaFunctionDef fold
176*6aa57295SBram Moolenaarsyntax region  juliaQuoteBlock		matchgroup=juliaBlKeyword start="\<quote\>" end="\<end\>" contains=@juliaExpressions fold
177*6aa57295SBram Moolenaarsyntax region  juliaStructBlock		matchgroup=juliaBlKeyword start="\<struct\>" end="\<end\>" contains=@juliaExpressions,juliaStructR fold
178*6aa57295SBram Moolenaarsyntax region  juliaMutableStructBlock	matchgroup=juliaBlKeyword start="\<mutable\s\+struct\>" end="\<end\>" contains=@juliaExpressions,juliaStructR fold
179*6aa57295SBram Moolenaarsyntax region  juliaLetBlock		matchgroup=juliaBlKeyword start="\<let\>" end="\<end\>" contains=@juliaExpressions fold
180*6aa57295SBram Moolenaarsyntax region  juliaDoBlock		matchgroup=juliaBlKeyword start="\<do\>" end="\<end\>" contains=@juliaExpressions fold
181*6aa57295SBram Moolenaarsyntax region  juliaModuleBlock		matchgroup=juliaBlKeyword start="\<\%(bare\)\?module\>" end="\<end\>" contains=@juliaExpressions fold
182*6aa57295SBram Moolenaarsyntax region  juliaExceptionBlock	matchgroup=juliaException start="\<try\>" end="\<end\>" contains=@juliaExpressions,juliaCatchBlock,juliaFinallyBlock fold
183*6aa57295SBram Moolenaarsyntax region  juliaCatchBlock		matchgroup=juliaException transparent contained start="\<catch\>" end="\<end\>"me=s-1 contains=@juliaExpressions,juliaFinallyBlock
184*6aa57295SBram Moolenaarsyntax region  juliaFinallyBlock	matchgroup=juliaException transparent contained start="\<finally\>" end="\<end\>"me=s-1 contains=@juliaExpressions
185*6aa57295SBram Moolenaarsyntax region  juliaAbstractBlock	matchgroup=juliaBlKeyword start="\<abstract\s\+type\>" end="\<end\>" fold contains=@juliaExpressions,juliaStructR
186*6aa57295SBram Moolenaarsyntax region  juliaPrimitiveBlock	matchgroup=juliaBlKeyword start="\<primitive\s\+type\>" end="\<end\>" fold contains=@juliaExpressions,juliaStructR
187*6aa57295SBram Moolenaar
188*6aa57295SBram Moolenaarexec 'syntax region  juliaComprehensionFor	matchgroup=juliaComprehensionFor transparent contained start="\%([^[:space:],;:({[]\_s*\)\@'.s:d(80).'<=\<for\>" end="\ze[]);]" contains=@juliaExpressions,juliaComprehensionIf,juliaComprehensionFor'
189*6aa57295SBram Moolenaarsyntax match   juliaComprehensionIf	contained "\<if\>"
190*6aa57295SBram Moolenaar
191*6aa57295SBram Moolenaarexec 'syntax match   juliaOuter		contained "\<outer\ze\s\+' . s:idregex . '\>"'
192*6aa57295SBram Moolenaar
193*6aa57295SBram Moolenaarsyntax match   juliaRangeKeyword	contained "\<\%(begin\|end\)\>"
194*6aa57295SBram Moolenaar
195*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeBasic	display "\<\%(\%(N\|Named\)\?Tuple\|Symbol\|Function\|Union\%(All\)\?\|Type\%(Name\|Var\)\?\|Any\|ANY\|Vararg\|Ptr\|Exception\|Module\|Expr\|DataType\|\%(LineNumber\|Quote\)Node\|\%(Weak\|Global\)\?Ref\|Method\|Pair\|Val\|Nothing\|Some\|Missing\)\>"
196*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeNum		display "\<\%(U\?Int\%(8\|16\|32\|64\|128\)\?\|Float\%(16\|32\|64\)\|Complex\|Bool\|Char\|Number\|Signed\|Unsigned\|Integer\|AbstractFloat\|Real\|Rational\|\%(Abstract\)\?Irrational\|Enum\|BigInt\|BigFloat\|MathConst\|ComplexF\%(16\|32\|64\)\)\>"
197*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeC		display "\<\%(FileOffset\|C\%(u\?\%(char\|short\|int\|long\(long\)\?\|w\?string\)\|float\|double\|\%(ptrdiff\|s\?size\|wchar\|off\|u\?intmax\)_t\|void\)\)\>"
198*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeError	display "\<\%(\%(Bounds\|Divide\|Domain\|\%(Stack\)\?Overflow\|EOF\|Undef\%(Ref\|Var\)\|System\|Type\|Parse\|Argument\|Key\|Load\|Method\|Inexact\|OutOfMemory\|Init\|Assertion\|ReadOnlyMemory\|StringIndex\)Error\|\%(Interrupt\|Error\|ProcessExited\|Captured\|Composite\|InvalidState\|Missing\|\%(Process\|Task\)Failed\)Exception\|DimensionMismatch\|SegmentationFault\)\>"
199*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeIter	display "\<\%(EachLine\|Enumerate\|Cartesian\%(Index\|Range\)\|LinSpace\|CartesianIndices\)\>"
200*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeString	display "\<\%(DirectIndex\|Sub\|Rep\|Rev\|Abstract\|Substitution\)\?String\>"
201*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeArray	display "\<\%(\%(Sub\)\?Array\|\%(Abstract\|Dense\|Strided\)\?\%(Array\|Matrix\|Vec\%(tor\|OrMat\)\)\|SparseMatrixCSC\|\%(AbstractSparse\|Bit\|Shared\)\%(Array\|Vector\|Matrix\)\|\%\(D\|Bid\|\%(Sym\)\?Trid\)iagonal\|Hermitian\|Symmetric\|UniformScaling\|\%(Lower\|Upper\)Triangular\|\%(Sparse\|Row\)Vector\|VecElement\|Conj\%(Array\|Matrix\|Vector\)\|Index\%(Cartesian\|Linear\|Style\)\|PermutedDimsArray\|Broadcasted\|Adjoint\|Transpose\|LinearIndices\)\>"
202*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeDict	display "\<\%(WeakKey\|Id\|Abstract\)\?Dict\>"
203*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeSet		display "\<\%(\%(Abstract\|Bit\)\?Set\)\>"
204*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeIO		display "\<\%(IO\%(Stream\|Buffer\|Context\)\?\|RawFD\|StatStruct\|FileMonitor\|PollingFileWatcher\|Timer\|Base64\%(Decode\|Encode\)Pipe\|\%(UDP\|TCP\)Socket\|\%(Abstract\)\?Channel\|BufferStream\|ReentrantLock\|GenericIOBuffer\)\>"
205*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeProcess	display "\<\%(Pipe\|Cmd\|PipeBuffer\)\>"
206*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeRange	display "\<\%(Dims\|RangeIndex\|\%(Abstract\|Lin\|Ordinal\|Step\|\%(Abstract\)\?Unit\)Range\|Colon\|ExponentialBackOff\|StepRangeLen\)\>"
207*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeRegex	display "\<Regex\%(Match\)\?\>"
208*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeFact	display "\<\%(Factorization\|BunchKaufman\|\%(Cholesky\|QR\)\%(Pivoted\)\?\|\%(Generalized\)\?\%(Eigen\|SVD\|Schur\)\|Hessenberg\|LDLt\|LQ\|LU\)\>"
209*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeSort	display "\<\%(Insertion\|\(Partial\)\?Quick\|Merge\)Sort\>"
210*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeRound	display "\<Round\%(ingMode\|FromZero\|Down\|Nearest\%(Ties\%(Away\|Up\)\)\?\|ToZero\|Up\)\>"
211*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeSpecial	display "\<\%(LocalProcess\|ClusterManager\)\>"
212*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeRandom	display "\<\%(AbstractRNG\|MersenneTwister\|RandomDevice\)\>"
213*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeDisplay	display "\<\%(Text\(Display\)\?\|\%(Abstract\)\?Display\|MIME\|HTML\)\>"
214*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeTime	display "\<\%(Date\%(Time\)\?\|DateFormat\)\>"
215*6aa57295SBram Moolenaarsyntax match   juliaBaseTypeOther	display "\<\%(RemoteRef\|Task\|Condition\|VersionNumber\|IPv[46]\|SerializationState\|WorkerConfig\|Future\|RemoteChannel\|IPAddr\|Stack\%(Trace\|Frame\)\|\(Caching\|Worker\)Pool\|AbstractSerializer\)\>"
216*6aa57295SBram Moolenaar
217*6aa57295SBram Moolenaarsyntax match   juliaConstNum		display "\%(\<\%(\%(NaN\|Inf\)\%(16\|32\|64\)\?\|pi\|π\)\>\)"
218*6aa57295SBram Moolenaar" Note: recognition of ℯ, which Vim does not consider a valid identifier, is
219*6aa57295SBram Moolenaar" complicated. We detect possible uses by just looking for the character (for
220*6aa57295SBram Moolenaar" performance) and then check that it's actually used by its own.
221*6aa57295SBram Moolenaar" (This also tries to detect preceding number constants; it does so in a crude
222*6aa57295SBram Moolenaar" way.)
223*6aa57295SBram Moolenaarsyntax match   juliaPossibleEuler	"ℯ" contains=juliaEuler
224*6aa57295SBram Moolenaarexec 'syntax match   juliaEuler		contained "\%(\%(^\|[' . s:nonidS_chars . s:op_chars_wc . ']\)\%(.\?[0-9][.0-9eEf_]*\d\)\?\)\@'.s:d(80).'<=ℯ\ze[' . s:nonidS_chars . s:op_chars_wc . ']"'
225*6aa57295SBram Moolenaarsyntax match   juliaConstBool		display "\<\%(true\|false\)\>"
226*6aa57295SBram Moolenaarsyntax match   juliaConstEnv		display "\<\%(ARGS\|ENV\|ENDIAN_BOM\|LOAD_PATH\|VERSION\|PROGRAM_FILE\|DEPOT_PATH\)\>"
227*6aa57295SBram Moolenaarsyntax match   juliaConstIO		display "\<\%(std\%(out\|in\|err\)\|devnull\)\>"
228*6aa57295SBram Moolenaarsyntax match   juliaConstC		display "\<\%(C_NULL\)\>"
229*6aa57295SBram Moolenaarsyntax match   juliaConstGeneric	display "\<\%(nothing\|Main\|undef\|missing\)\>"
230*6aa57295SBram Moolenaar
231*6aa57295SBram Moolenaarsyntax match   juliaParamType		contained "[^{([:space:]<>\"]\+\ze{" nextgroup=juliaCurBraBlock
232*6aa57295SBram Moolenaar
233*6aa57295SBram Moolenaarsyntax match   juliaPossibleMacro	transparent "@" contains=juliaMacroCall,juliaMacroCallP,juliaPrintfMacro,juliaDocMacro,juliaDocMacroPre
234*6aa57295SBram Moolenaar
235*6aa57295SBram Moolenaarexec 'syntax match   juliaMacro		contained "@' . s:idregex . '\%(\.' . s:idregex . '\)*"'
236*6aa57295SBram Moolenaarsyntax match   juliaMacro		contained "@[!.~$%^*/\\|<>+-]\ze[^0-9]"
237*6aa57295SBram Moolenaarexec 'syntax region  juliaMacroCall	contained transparent start="\(@' . s:idregex . '\%(\.' . s:idregex . '\)*\)\@=\1\%([^(]\|$\)" end="\ze\%([])};#]\|$\|\<for\>\|\<end\>\)" contains=@juliaExpressions,juliaMacro,juliaSymbolS,juliaQuotedParBlockS'
238*6aa57295SBram Moolenaarexec 'syntax region  juliaMacroCall	contained transparent start="\(@.\)\@=\1\%([^(]\|$\)" end="\ze\%([])};#]\|$\|\<for\>\|\<end\>\)" contains=@juliaExpressions,juliaMacro,juliaSymbolS,juliaQuotedParBlockS'
239*6aa57295SBram Moolenaarexec 'syntax region  juliaMacroCallP	contained transparent start="@' . s:idregex . '\%(\.' . s:idregex . '\)*(" end=")\@'.s:d(1).'<=" contains=juliaMacro,juliaParBlock'
240*6aa57295SBram Moolenaarexec 'syntax region  juliaMacroCallP	contained transparent start="@.(" end=")\@'.s:d(1).'<=" contains=juliaMacro,juliaParBlock'
241*6aa57295SBram Moolenaar
242*6aa57295SBram Moolenaarexec 'syntax match   juliaNumbers	transparent "\%(^\|[' . s:nonidS_chars . s:op_chars_wc . ']\)\@'.s:d(1).'<=\d\|\.\d\|im\>" contains=juliaNumber,juliaFloat,juliaComplexUnit'
243*6aa57295SBram Moolenaar
244*6aa57295SBram Moolenaar"integer regexes
245*6aa57295SBram Moolenaarlet s:dec_regex = '\d\%(_\?\d\)*\%(\>\|im\>\|\ze\D\)'
246*6aa57295SBram Moolenaarlet s:hex_regex = '0x\x\%(_\?\x\)*\%(\>\|im\>\|\ze\X\)'
247*6aa57295SBram Moolenaarlet s:bin_regex = '0b[01]\%(_\?[01]\)*\%(\>\|im\>\|\ze[^01]\)'
248*6aa57295SBram Moolenaarlet s:oct_regex = '0o\o\%(_\?\o\)*\%(\>\|im\>\|\ze\O\)'
249*6aa57295SBram Moolenaar
250*6aa57295SBram Moolenaarlet s:int_regex = '\%(' . s:hex_regex .
251*6aa57295SBram Moolenaar      \           '\|'  . s:bin_regex .
252*6aa57295SBram Moolenaar      \           '\|'  . s:oct_regex .
253*6aa57295SBram Moolenaar      \           '\|'  . s:dec_regex .
254*6aa57295SBram Moolenaar      \           '\)'
255*6aa57295SBram Moolenaar
256*6aa57295SBram Moolenaar"floating point regexes
257*6aa57295SBram Moolenaar"  starting with a dot, optional exponent
258*6aa57295SBram Moolenaarlet s:float_regex1 = '\.\d\%(_\?\d\)*\%([eEf][-+]\?\d\+\)\?\%(\>\|im\>\|\ze\D\)'
259*6aa57295SBram Moolenaar"  with dot, optional exponent
260*6aa57295SBram Moolenaarlet s:float_regex2 = '\d\%(_\?\d\)*\.\%(\d\%(_\?\d\)*\)\?\%([eEf][-+]\?\d\+\)\?\%(\>\|im\>\|\ze\D\)'
261*6aa57295SBram Moolenaar"  without dot, with exponent
262*6aa57295SBram Moolenaarlet s:float_regex3 = '\d\%(_\?\d\)*[eEf][-+]\?\d\+\%(\>\|im\>\|\ze\D\)'
263*6aa57295SBram Moolenaar
264*6aa57295SBram Moolenaar"hex floating point numbers
265*6aa57295SBram Moolenaar"  starting with a dot
266*6aa57295SBram Moolenaarlet s:hexfloat_regex1 = '0x\.\%\(\x\%(_\?\x\)*\)\?[pP][-+]\?\d\+\%(\>\|im\>\|\ze\X\)'
267*6aa57295SBram Moolenaar"  starting with a digit
268*6aa57295SBram Moolenaarlet s:hexfloat_regex2 = '0x\x\%(_\?\x\)*\%\(\.\%\(\x\%(_\?\x\)*\)\?\)\?[pP][-+]\?\d\+\%(\>\|im\>\|\ze\X\)'
269*6aa57295SBram Moolenaar
270*6aa57295SBram Moolenaarlet s:float_regex = '\%(' . s:float_regex3 .
271*6aa57295SBram Moolenaar      \             '\|'  . s:float_regex2 .
272*6aa57295SBram Moolenaar      \             '\|'  . s:float_regex1 .
273*6aa57295SBram Moolenaar      \             '\|'  . s:hexfloat_regex2 .
274*6aa57295SBram Moolenaar      \             '\|'  . s:hexfloat_regex1 .
275*6aa57295SBram Moolenaar      \             '\)'
276*6aa57295SBram Moolenaar
277*6aa57295SBram Moolenaarexec 'syntax match   juliaNumber	contained "' . s:int_regex . '" contains=juliaComplexUnit'
278*6aa57295SBram Moolenaarexec 'syntax match   juliaFloat		contained "' . s:float_regex . '" contains=juliaComplexUnit'
279*6aa57295SBram Moolenaarsyntax match   juliaComplexUnit		display	contained "\<im\>"
280*6aa57295SBram Moolenaar
281*6aa57295SBram Moolenaarsyntax match   juliaRangeOperator	display ":"
282*6aa57295SBram Moolenaarexec 'syntax match   juliaOperator	"' . s:operators . '"'
283*6aa57295SBram Moolenaar
284*6aa57295SBram Moolenaarexec 'syntax region  juliaTernaryRegion	matchgroup=juliaTernaryOperator start="\s\zs?\ze\s" skip="\%(:\(:\|[^:[:space:]'."'".'"({[]\+\s*\ze:\)\|\%(?\s*\)\@'.s:d(6).'<=:(\)" end=":" contains=@juliaExpressions,juliaErrorSemicol'
285*6aa57295SBram Moolenaar
286*6aa57295SBram Moolenaarlet s:interp_dollar = '\([' . s:nonidS_chars . s:op_chars_wc . '!]\|^\)\@'.s:d(1).'<=\$'
287*6aa57295SBram Moolenaar
288*6aa57295SBram Moolenaarexec 'syntax match   juliaDollarVar	display contained "' . s:interp_dollar . s:idregex . '"'
289*6aa57295SBram Moolenaarexec 'syntax region  juliaDollarPar	matchgroup=juliaDollarVar contained start="' .s:interp_dollar . '(" end=")" contains=@juliaExpressions'
290*6aa57295SBram Moolenaarexec 'syntax region  juliaDollarSqBra	matchgroup=juliaDollarVar contained start="' .s:interp_dollar . '\[" end="\]" contains=@juliaExpressions,juliaComprehensionFor,juliaSymbolS,juliaQuotedParBlockS'
291*6aa57295SBram Moolenaar
292*6aa57295SBram Moolenaarsyntax match   juliaChar		"'\\\?.'" contains=juliaSpecialChar
293*6aa57295SBram Moolenaarsyntax match   juliaChar		display "'\\\o\{3\}'" contains=juliaOctalEscapeChar
294*6aa57295SBram Moolenaarsyntax match   juliaChar		display "'\\x\x\{2\}'" contains=juliaHexEscapeChar
295*6aa57295SBram Moolenaarsyntax match   juliaChar		display "'\\u\x\{1,4\}'" contains=juliaUniCharSmall
296*6aa57295SBram Moolenaarsyntax match   juliaChar		display "'\\U\x\{1,8\}'" contains=juliaUniCharLarge
297*6aa57295SBram Moolenaar
298*6aa57295SBram Moolenaarexec 'syntax match   juliaCTransOperator	"[[:space:]}' . s:nonid_chars . s:op_chars_wc . '!]\@'.s:d(1).'<!\.\?' . "'" . 'ᵀ\?"'
299*6aa57295SBram Moolenaar
300*6aa57295SBram Moolenaar" TODO: some of these might be specialized; the rest could be just left to the
301*6aa57295SBram Moolenaar"       generic juliaStringPrefixed fallback
302*6aa57295SBram Moolenaarsyntax region  juliaString		matchgroup=juliaStringDelim start=+\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaStringVars,@juliaSpecialChars,@juliaSpellcheckStrings
303*6aa57295SBram Moolenaarsyntax region  juliaStringPrefixed	contained matchgroup=juliaStringDelim start=+[^{([:space:]<>"]\+\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaSpecialCharsRaw
304*6aa57295SBram Moolenaarsyntax region  juliabString		matchgroup=juliaStringDelim start=+\<b\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaSpecialChars
305*6aa57295SBram Moolenaarsyntax region  juliasString		matchgroup=juliaStringDelim start=+\<s\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaSpecialChars
306*6aa57295SBram Moolenaar
307*6aa57295SBram Moolenaarsyntax region  juliaDocString		matchgroup=juliaDocStringDelim fold start=+^"""+ skip=+\%(\\\\\)*\\"+ end=+"""+ contains=@juliaStringVars,@juliaSpecialChars,@juliaSpellcheckDocStrings
308*6aa57295SBram Moolenaar
309*6aa57295SBram Moolenaarexec 'syntax region  juliaPrintfMacro		contained transparent start="@s\?printf(" end=")\@'.s:d(1).'<=" contains=juliaMacro,juliaPrintfParBlock'
310*6aa57295SBram Moolenaarsyntax region  juliaPrintfMacro		contained transparent start="@s\?printf\s\+" end="\ze\%([])};#]\|$\|\<for\>\)" contains=@juliaExprsPrintf,juliaMacro,juliaSymbolS,juliaQuotedParBlockS
311*6aa57295SBram Moolenaarsyntax region  juliaPrintfParBlock	contained matchgroup=juliaParDelim start="(" end=")" contains=@juliaExprsPrintf
312*6aa57295SBram Moolenaarsyntax region  juliaPrintfString	contained matchgroup=juliaStringDelim start=+"+ skip=+\%(\\\\\)*\\"+ end=+"+ contains=@juliaSpecialChars,@juliaPrintfChars
313*6aa57295SBram Moolenaar
314*6aa57295SBram Moolenaarexec 'syntax region  juliaDocMacroPre	contained transparent start=+@doc\s\+\%(' . s:idregex . '\%(\.' . s:idregex . '\)*\)\z("\%(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\(\z1\)\@'.s:d(3).'<=+ contains=juliaMacro,juliaDocStringMRaw'
315*6aa57295SBram Moolenaarexec 'syntax region  juliaDocMacro	contained transparent start=+@doc\s\+\z("\%(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\(\z1\)\@'.s:d(3).'<=+ contains=juliaMacro,juliaDocStringM'
316*6aa57295SBram Moolenaarsyntax region  juliaDocStringMRaw	contained fold matchgroup=juliaDocStringDelim fold start=+\z\("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaSpellcheckDocStrings
317*6aa57295SBram Moolenaarsyntax region  juliaDocStringM		contained fold matchgroup=juliaDocStringDelim fold start=+\z\("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaStringVars,@juliaSpecialChars,@juliaSpellcheckDocStrings
318*6aa57295SBram Moolenaar
319*6aa57295SBram Moolenaarsyntax region  juliaShellString		matchgroup=juliaStringDelim start=+`+ skip=+\%(\\\\\)*\\`+ end=+`+ contains=@juliaStringVars,juliaSpecialChar
320*6aa57295SBram Moolenaar
321*6aa57295SBram Moolenaarsyntax cluster juliaStringVars		contains=juliaStringVarsPar,juliaStringVarsSqBra,juliaStringVarsCurBra,juliaStringVarsPla
322*6aa57295SBram Moolenaarsyntax region  juliaStringVarsPar	contained matchgroup=juliaStringVarDelim start="$(" end=")" contains=@juliaExpressions
323*6aa57295SBram Moolenaarsyntax region  juliaStringVarsSqBra	contained matchgroup=juliaStringVarDelim start="$\[" end="\]" contains=@juliaExpressions,juliaComprehensionFor,juliaSymbolS,juliaQuotedParBlockS
324*6aa57295SBram Moolenaarsyntax region  juliaStringVarsCurBra	contained matchgroup=juliaStringVarDelim start="${" end="}" contains=@juliaExpressions
325*6aa57295SBram Moolenaarexec 'syntax match   juliaStringVarsPla	contained "\$' . s:idregex . '"'
326*6aa57295SBram Moolenaar
327*6aa57295SBram Moolenaar" TODO improve RegEx
328*6aa57295SBram Moolenaarsyntax region  juliaRegEx		matchgroup=juliaStringDelim start=+\<r\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1[imsx]*+
329*6aa57295SBram Moolenaar
330*6aa57295SBram Moolenaarsyntax cluster juliaSpecialChars	contains=juliaSpecialChar,juliaDoubleBackslash,juliaEscapedQuote,juliaOctalEscapeChar,juliaHexEscapeChar,juliaUniCharSmall,juliaUniCharLarge
331*6aa57295SBram Moolenaarsyntax match   juliaSpecialChar		display contained "\\."
332*6aa57295SBram Moolenaarsyntax match   juliaOctalEscapeChar	display contained "\\\o\{3\}"
333*6aa57295SBram Moolenaarsyntax match   juliaHexEscapeChar	display contained "\\x\x\{2\}"
334*6aa57295SBram Moolenaarsyntax match   juliaUniCharSmall	display contained "\\u\x\{1,4\}"
335*6aa57295SBram Moolenaarsyntax match   juliaUniCharLarge	display contained "\\U\x\{1,8\}"
336*6aa57295SBram Moolenaarsyntax cluster juliaSpecialCharsRaw	contains=juliaDoubleBackslash,juliaEscapedQuote
337*6aa57295SBram Moolenaarsyntax match   juliaDoubleBackslash	contained "\\\\"
338*6aa57295SBram Moolenaarsyntax match   juliaEscapedQuote	contained "\\\""
339*6aa57295SBram Moolenaar
340*6aa57295SBram Moolenaarsyntax cluster juliaPrintfChars		contains=juliaErrorPrintfFmt,juliaPrintfFmt
341*6aa57295SBram Moolenaarsyntax match   juliaErrorPrintfFmt	display contained "\\\?%."
342*6aa57295SBram Moolenaarsyntax match   juliaPrintfFmt		display contained "%\%(\d\+\$\)\=[-+' #0]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjqzt]\|ll\|hh\)\=[aAbdiuoxXDOUfFeEgGcCsSpn]"
343*6aa57295SBram Moolenaarsyntax match   juliaPrintfFmt		display contained "%%"
344*6aa57295SBram Moolenaarsyntax match   juliaPrintfFmt		display contained "\\%\%(\d\+\$\)\=[-+' #0]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjqzt]\|ll\|hh\)\=[aAbdiuoxXDOUfFeEgGcCsSpn]"hs=s+1
345*6aa57295SBram Moolenaarsyntax match   juliaPrintfFmt		display contained "\\%%"hs=s+1
346*6aa57295SBram Moolenaar
347*6aa57295SBram Moolenaar" this is used to restrict the search for Symbols to when colons appear at all
348*6aa57295SBram Moolenaar" (for performance reasons)
349*6aa57295SBram Moolenaarsyntax match   juliaPossibleSymbol	transparent ":\ze[^:]" contains=juliaSymbol,juliaQuotedParBlock,juliaQuotedQMarkPar,juliaColon
350*6aa57295SBram Moolenaar
351*6aa57295SBram Moolenaarlet s:quotable = '\%(' . s:idregex . '\|' . s:operators . '\|[?.]\|' . s:float_regex . '\|' . s:int_regex . '\)'
352*6aa57295SBram Moolenaarlet s:quoting_colon = '\%(\%(^\s*\|\s\{6,\}\|[' . s:nonid_chars . s:op_chars_wc . ']\s*\)\@'.s:d(6).'<=\|\%(\<\%(return\|if\|else\%(if\)\?\|while\|try\|begin\)\s\+\)\@'.s:d(9).'<=\)\zs:'
353*6aa57295SBram Moolenaarlet s:quoting_colonS = '\s\@'.s:d(1).'<=:'
354*6aa57295SBram Moolenaar
355*6aa57295SBram Moolenaar" note: juliaSymbolS only works within whitespace-sensitive contexts,
356*6aa57295SBram Moolenaar" such as in macro calls without parentheses, or within square brackets.
357*6aa57295SBram Moolenaar" It is used to override the recognition of expressions like `a :b` as
358*6aa57295SBram Moolenaar" ranges rather than symbols in those contexts.
359*6aa57295SBram Moolenaar" (Note that such `a :b` expressions only allows at most 5 spaces between
360*6aa57295SBram Moolenaar" the identifier and the colon anyway.)
361*6aa57295SBram Moolenaar
362*6aa57295SBram Moolenaarexec 'syntax match   juliaSymbol	contained "' . s:quoting_colon . s:quotable . '"'
363*6aa57295SBram Moolenaarexec 'syntax match   juliaSymbolS	contained "' . s:quoting_colonS . s:quotable . '"'
364*6aa57295SBram Moolenaar
365*6aa57295SBram Moolenaar" same as above for quoted expressions such as :(expr)
366*6aa57295SBram Moolenaarexec 'syntax region   juliaQuotedParBlock	matchgroup=juliaQParDelim start="' . s:quoting_colon . '(" end=")" contains=@juliaExpressions'
367*6aa57295SBram Moolenaarexec 'syntax match    juliaQuotedQMarkPar	"' . s:quoting_colon . '(\s*?\s*)" contains=juliaQuotedQMark'
368*6aa57295SBram Moolenaarexec 'syntax region   juliaQuotedParBlockS	matchgroup=juliaQParDelim contained start="' . s:quoting_colonS . '(" end=")" contains=@juliaExpressions'
369*6aa57295SBram Moolenaar
370*6aa57295SBram Moolenaar
371*6aa57295SBram Moolenaarsyntax match   juliaTypeOperatorR1	contained "[^{([:space:]<>\"]\+\%(\s*[<>]:\)\@="
372*6aa57295SBram Moolenaar
373*6aa57295SBram Moolenaar" force precedence over Symbols
374*6aa57295SBram Moolenaarsyntax match   juliaTypeOperator	contained "[<>:]:"
375*6aa57295SBram Moolenaarexec 'syntax match   juliaTypeOperatorR2	transparent "[<>:]:\s*\%(' . s:idregex . '\.\)*' . s:idregex . '" contains=juliaTypeOperator,juliaType,juliaDottedT,@juliaExpressions nextgroup=juliaTypeOperator'
376*6aa57295SBram Moolenaarsyntax match   juliaIsaKeyword		contained "\<isa\>"
377*6aa57295SBram Moolenaarexec 'syntax match   juliaTypeOperatorR3	transparent "\<isa\s\+\%(' . s:idregex . '\.\)*' . s:idregex . '" contains=juliaIsaKeyword,juliaType,juliaDottedT,@juliaExpressions nextgroup=juliaIsaKeyword'
378*6aa57295SBram Moolenaar
379*6aa57295SBram Moolenaarsyntax match   juliaWhereKeyword       	"\<where\>"
380*6aa57295SBram Moolenaarexec 'syntax match   juliaWhereR	transparent "\<where\s\+' . s:idregex . '" contains=juliaWhereKeyword,juliaType,juliaDottedT,juliaIdSymbol'
381*6aa57295SBram Moolenaar
382*6aa57295SBram Moolenaarsyntax region  juliaCommentL		matchgroup=juliaCommentDelim excludenl start="#\ze\%([^=]\|$\)" end="$" contains=juliaTodo,@juliaSpellcheckComments
383*6aa57295SBram Moolenaarsyntax region  juliaCommentM		matchgroup=juliaCommentDelim fold start="#=\ze\%([^#]\|$\)" end="=#" contains=juliaTodo,juliaCommentM,@juliaSpellcheckComments
384*6aa57295SBram Moolenaarsyntax keyword juliaTodo		contained TODO FIXME XXX
385*6aa57295SBram Moolenaar
386*6aa57295SBram Moolenaar" detect an end-of-line with only whitespace or comments before it
387*6aa57295SBram Moolenaarlet s:eol = '\s*\%(\%(\%(#=\%(=#\@!\|[^=]\|\n\)\{-}=#\)\s*\)\+\)\?\%(#=\@!.*\)\?\n'
388*6aa57295SBram Moolenaar
389*6aa57295SBram Moolenaar" a trailing comma, or colon, or an empty line in an import/using/export
390*6aa57295SBram Moolenaar" multi-line command. Used to recognize the as keyword, and for indentation
391*6aa57295SBram Moolenaar" (this needs to take precedence over normal commas and colons, and comments)
392*6aa57295SBram Moolenaarsyntax cluster juliaContinuationItems	contains=juliaContinuationComma,juliaContinuationColon,juliaContinuationNone
393*6aa57295SBram Moolenaarexec 'syntax region  juliaContinuationComma	matchgroup=juliaComma contained start=",\ze'.s:eol.'" end="\n\+\ze." contains=@juliaCommentItems'
394*6aa57295SBram Moolenaarexec 'syntax region  juliaContinuationColon	matchgroup=juliaColon contained start=":\ze'.s:eol.'" end="\n\+\ze." contains=@juliaCommentItems'
395*6aa57295SBram Moolenaarexec 'syntax region  juliaContinuationNone	matchgroup=NONE contained start="\%(\<\%(import\|using\|export\)\>\|^\)\@'.s:d(6).'<=\ze'.s:eol.'" end="\n\+\ze." contains=@juliaCommentItems,juliaAsKeyword'
396*6aa57295SBram Moolenaarexec 'syntax match   juliaMacroName		contained "@' . s:idregex . '\%(\.' . s:idregex . '\)*"'
397*6aa57295SBram Moolenaar
398*6aa57295SBram Moolenaar" the following are disabled by default, but
399*6aa57295SBram Moolenaar" can be enabled by entering e.g.
400*6aa57295SBram Moolenaar"   :hi link juliaParDelim Delimiter
401*6aa57295SBram Moolenaarhi def link juliaParDelim		juliaNone
402*6aa57295SBram Moolenaarhi def link juliaSemicolon		juliaNone
403*6aa57295SBram Moolenaarhi def link juliaComma			juliaNone
404*6aa57295SBram Moolenaarhi def link juliaFunctionCall		juliaNone
405*6aa57295SBram Moolenaar
406*6aa57295SBram Moolenaarhi def link juliaColon			juliaOperator
407*6aa57295SBram Moolenaar
408*6aa57295SBram Moolenaarhi def link juliaFunctionName		juliaFunction
409*6aa57295SBram Moolenaarhi def link juliaFunctionName1		juliaFunction
410*6aa57295SBram Moolenaarhi def link juliaMacroName		juliaMacro
411*6aa57295SBram Moolenaar
412*6aa57295SBram Moolenaar
413*6aa57295SBram Moolenaarhi def link juliaKeyword		Keyword
414*6aa57295SBram Moolenaarhi def link juliaWhereKeyword		Keyword
415*6aa57295SBram Moolenaarhi def link juliaInfixKeyword		Keyword
416*6aa57295SBram Moolenaarhi def link juliaIsaKeyword		Keyword
417*6aa57295SBram Moolenaarhi def link juliaAsKeyword		Keyword
418*6aa57295SBram Moolenaarhi def link juliaRepKeyword		Keyword
419*6aa57295SBram Moolenaarhi def link juliaBlKeyword		Keyword
420*6aa57295SBram Moolenaarhi def link juliaConditional		Conditional
421*6aa57295SBram Moolenaarhi def link juliaRepeat			Repeat
422*6aa57295SBram Moolenaarhi def link juliaException		Exception
423*6aa57295SBram Moolenaarhi def link juliaOuter			Keyword
424*6aa57295SBram Moolenaarhi def link juliaBaseTypeBasic		Type
425*6aa57295SBram Moolenaarhi def link juliaBaseTypeNum		Type
426*6aa57295SBram Moolenaarhi def link juliaBaseTypeC		Type
427*6aa57295SBram Moolenaarhi def link juliaBaseTypeError		Type
428*6aa57295SBram Moolenaarhi def link juliaBaseTypeIter		Type
429*6aa57295SBram Moolenaarhi def link juliaBaseTypeString		Type
430*6aa57295SBram Moolenaarhi def link juliaBaseTypeArray		Type
431*6aa57295SBram Moolenaarhi def link juliaBaseTypeDict		Type
432*6aa57295SBram Moolenaarhi def link juliaBaseTypeSet		Type
433*6aa57295SBram Moolenaarhi def link juliaBaseTypeIO		Type
434*6aa57295SBram Moolenaarhi def link juliaBaseTypeProcess	Type
435*6aa57295SBram Moolenaarhi def link juliaBaseTypeRange		Type
436*6aa57295SBram Moolenaarhi def link juliaBaseTypeRegex		Type
437*6aa57295SBram Moolenaarhi def link juliaBaseTypeFact		Type
438*6aa57295SBram Moolenaarhi def link juliaBaseTypeSort		Type
439*6aa57295SBram Moolenaarhi def link juliaBaseTypeRound		Type
440*6aa57295SBram Moolenaarhi def link juliaBaseTypeSpecial	Type
441*6aa57295SBram Moolenaarhi def link juliaBaseTypeRandom		Type
442*6aa57295SBram Moolenaarhi def link juliaBaseTypeDisplay	Type
443*6aa57295SBram Moolenaarhi def link juliaBaseTypeTime		Type
444*6aa57295SBram Moolenaarhi def link juliaBaseTypeOther		Type
445*6aa57295SBram Moolenaar
446*6aa57295SBram Moolenaarhi def link juliaType			Type
447*6aa57295SBram Moolenaarhi def link juliaParamType		Type
448*6aa57295SBram Moolenaarhi def link juliaTypeOperatorR1		Type
449*6aa57295SBram Moolenaar
450*6aa57295SBram Moolenaar" NOTE: deprecated constants are not highlighted as such. For once,
451*6aa57295SBram Moolenaar" one can still legitimately use them by importing Base.MathConstants.
452*6aa57295SBram Moolenaar" Plus, one-letter variables like `e` and `γ` can be used with other
453*6aa57295SBram Moolenaar" meanings.
454*6aa57295SBram Moolenaarhi def link juliaConstNum		Constant
455*6aa57295SBram Moolenaarhi def link juliaEuler			Constant
456*6aa57295SBram Moolenaar
457*6aa57295SBram Moolenaarhi def link juliaConstEnv		Constant
458*6aa57295SBram Moolenaarhi def link juliaConstC			Constant
459*6aa57295SBram Moolenaarhi def link juliaConstLimits		Constant
460*6aa57295SBram Moolenaarhi def link juliaConstGeneric		Constant
461*6aa57295SBram Moolenaarhi def link juliaRangeKeyword		Constant
462*6aa57295SBram Moolenaarhi def link juliaConstBool		Boolean
463*6aa57295SBram Moolenaarhi def link juliaConstIO		Boolean
464*6aa57295SBram Moolenaar
465*6aa57295SBram Moolenaarhi def link juliaComprehensionFor	Keyword
466*6aa57295SBram Moolenaarhi def link juliaComprehensionIf	Keyword
467*6aa57295SBram Moolenaar
468*6aa57295SBram Moolenaarhi def link juliaDollarVar		Identifier
469*6aa57295SBram Moolenaar
470*6aa57295SBram Moolenaarhi def link juliaFunction		Function
471*6aa57295SBram Moolenaarhi def link juliaMacro			Macro
472*6aa57295SBram Moolenaarhi def link juliaSymbol			Identifier
473*6aa57295SBram Moolenaarhi def link juliaSymbolS		Identifier
474*6aa57295SBram Moolenaarhi def link juliaQParDelim		Identifier
475*6aa57295SBram Moolenaarhi def link juliaQuotedQMarkPar		Identifier
476*6aa57295SBram Moolenaarhi def link juliaQuotedQMark		juliaOperatorHL
477*6aa57295SBram Moolenaar
478*6aa57295SBram Moolenaarhi def link juliaNumber			Number
479*6aa57295SBram Moolenaarhi def link juliaFloat			Float
480*6aa57295SBram Moolenaarhi def link juliaComplexUnit		Constant
481*6aa57295SBram Moolenaar
482*6aa57295SBram Moolenaarhi def link juliaChar			Character
483*6aa57295SBram Moolenaar
484*6aa57295SBram Moolenaarhi def link juliaString			String
485*6aa57295SBram Moolenaarhi def link juliaStringPrefixed		juliaString
486*6aa57295SBram Moolenaarhi def link juliabString		juliaString
487*6aa57295SBram Moolenaarhi def link juliasString		juliaString
488*6aa57295SBram Moolenaarhi def link juliavString		juliaString
489*6aa57295SBram Moolenaarhi def link juliarString		juliaString
490*6aa57295SBram Moolenaarhi def link juliaipString		juliaString
491*6aa57295SBram Moolenaarhi def link juliabigString		juliaString
492*6aa57295SBram Moolenaarhi def link juliaMIMEString		juliaString
493*6aa57295SBram Moolenaarhi def link juliarawString		juliaString
494*6aa57295SBram Moolenaarhi def link juliatestString		juliaString
495*6aa57295SBram Moolenaarhi def link juliahtmlString		juliaString
496*6aa57295SBram Moolenaarhi def link juliaint128String		juliaString
497*6aa57295SBram Moolenaarhi def link juliaPrintfString		juliaString
498*6aa57295SBram Moolenaarhi def link juliaShellString		juliaString
499*6aa57295SBram Moolenaarhi def link juliaDocString		juliaString
500*6aa57295SBram Moolenaarhi def link juliaDocStringM		juliaDocString
501*6aa57295SBram Moolenaarhi def link juliaDocStringMRaw		juliaDocString
502*6aa57295SBram Moolenaarhi def link juliaStringDelim		juliaString
503*6aa57295SBram Moolenaarhi def link juliaDocStringDelim		juliaDocString
504*6aa57295SBram Moolenaarhi def link juliaStringVarsPla		Identifier
505*6aa57295SBram Moolenaarhi def link juliaStringVarDelim		Identifier
506*6aa57295SBram Moolenaar
507*6aa57295SBram Moolenaarhi def link juliaRegEx			String
508*6aa57295SBram Moolenaar
509*6aa57295SBram Moolenaarhi def link juliaSpecialChar		SpecialChar
510*6aa57295SBram Moolenaarhi def link juliaOctalEscapeChar	SpecialChar
511*6aa57295SBram Moolenaarhi def link juliaHexEscapeChar		SpecialChar
512*6aa57295SBram Moolenaarhi def link juliaUniCharSmall		SpecialChar
513*6aa57295SBram Moolenaarhi def link juliaUniCharLarge		SpecialChar
514*6aa57295SBram Moolenaarhi def link juliaDoubleBackslash	SpecialChar
515*6aa57295SBram Moolenaarhi def link juliaEscapedQuote		SpecialChar
516*6aa57295SBram Moolenaar
517*6aa57295SBram Moolenaarhi def link juliaPrintfFmt		SpecialChar
518*6aa57295SBram Moolenaar
519*6aa57295SBram Moolenaarif s:julia_highlight_operators
520*6aa57295SBram Moolenaar  hi! def link juliaOperatorHL		Operator
521*6aa57295SBram Moolenaarelse
522*6aa57295SBram Moolenaar  hi! def link juliaOperatorHL		juliaNone
523*6aa57295SBram Moolenaarendif
524*6aa57295SBram Moolenaarhi def link juliaOperator		juliaOperatorHL
525*6aa57295SBram Moolenaarhi def link juliaRangeOperator		juliaOperatorHL
526*6aa57295SBram Moolenaarhi def link juliaCTransOperator		juliaOperatorHL
527*6aa57295SBram Moolenaarhi def link juliaTernaryOperator	juliaOperatorHL
528*6aa57295SBram Moolenaarhi def link juliaTypeOperator		juliaOperatorHL
529*6aa57295SBram Moolenaar
530*6aa57295SBram Moolenaarhi def link juliaCommentL		Comment
531*6aa57295SBram Moolenaarhi def link juliaCommentM		Comment
532*6aa57295SBram Moolenaarhi def link juliaCommentDelim		Comment
533*6aa57295SBram Moolenaarhi def link juliaTodo			Todo
534*6aa57295SBram Moolenaar
535*6aa57295SBram Moolenaarhi def link juliaErrorPar		juliaError
536*6aa57295SBram Moolenaarhi def link juliaErrorEnd		juliaError
537*6aa57295SBram Moolenaarhi def link juliaErrorElse		juliaError
538*6aa57295SBram Moolenaarhi def link juliaErrorCatch		juliaError
539*6aa57295SBram Moolenaarhi def link juliaErrorFinally		juliaError
540*6aa57295SBram Moolenaarhi def link juliaErrorSemicol		juliaError
541*6aa57295SBram Moolenaarhi def link juliaErrorPrintfFmt		juliaError
542*6aa57295SBram Moolenaar
543*6aa57295SBram Moolenaarhi def link juliaError			Error
544*6aa57295SBram Moolenaar
545*6aa57295SBram Moolenaarsyntax sync fromstart
546*6aa57295SBram Moolenaar
547*6aa57295SBram Moolenaarlet b:current_syntax = "julia"
548*6aa57295SBram Moolenaar
549*6aa57295SBram Moolenaarlet &cpo = s:cpo_save
550*6aa57295SBram Moolenaarunlet s:cpo_save
551