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