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