From 14dc82fc4e6c0c08078f97a24a6c1639c1cc5113 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Tue, 14 Apr 2020 13:17:26 +0200 Subject: Update --- syntax/crystal.vim | 151 ++++++++++++++++++++++++++++------------------------- 1 file changed, 81 insertions(+), 70 deletions(-) (limited to 'syntax/crystal.vim') diff --git a/syntax/crystal.vim b/syntax/crystal.vim index d48d15ce..e4b5403a 100644 --- a/syntax/crystal.vim +++ b/syntax/crystal.vim @@ -63,8 +63,9 @@ endfunction com! -nargs=* SynFold call s:run_syntax_fold() -" Not-Top Cluster -syn cluster crystalNotTop contains=@crystalExtendedStringSpecial,@crystalRegexpSpecial,@crystalDeclaration,crystalConditional,crystalExceptional,crystalMethodExceptional,crystalTodo,crystalLinkAttr +" Top and Not-Top Clusters +syn cluster crystalTop contains=TOP +syn cluster crystalNotTop contains=CONTAINED " Whitespace Errors if exists('g:crystal_space_errors') @@ -78,16 +79,16 @@ endif " Operators if exists('g:crystal_operators') - syn match crystalOperator "[~!^&|*/%+-]\|\%(class\s*\)\@\|<=\|\%(<\|\>\|>=\|=\@\|\*\*\|\.\.\.\|\.\.\|::" + syn match crystalOperator "[~!^&|*/%+-]\|<=>\|<=\|\%(<\|\<\%(class\|struct\)\s\+\u\w*\s*\)\@>\|>=\|=\@1\|\*\*\|\.\.\.\|\.\.\|::" syn match crystalOperator "->\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|&&\|||=\||=\|||\|%=\|+=\|!\~\|!=\|//" - syn region crystalBracketOperator matchgroup=crystalOperator start="\%(\w[?!]\=\|[]})]\)\@<=\[\s*" end="\s*]" contains=ALLBUT,@crystalNotTop + syn region crystalBracketOperator matchgroup=crystalOperator start="\%(\w[?!]\=\|[]})]\)\@2<=\[" end="]" contains=TOP endif " Expression Substitution and Backslash Notation syn match crystalStringEscape "\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}" contained display syn match crystalStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)" contained display -syn region crystalInterpolation matchgroup=crystalInterpolationDelim start="#{" end="}" contained contains=ALLBUT,@crystalNotTop +syn region crystalInterpolation matchgroup=crystalInterpolationDelim start="#{" end="}" contained contains=TOP syn match crystalInterpolation "#\%(\$\|@@\=\)\w\+" display contained contains=crystalInterpolationDelim,crystalInstanceVariable,crystalClassVariable,crystalGlobalVariable,crystalPredefinedVariable syn match crystalInterpolationDelim "#\ze\%(\$\|@@\=\)\w\+" display contained syn match crystalInterpolation "#\$\%(-\w\|\W\)" display contained contains=crystalInterpolationDelim,crystalPredefinedVariable,crystalInvalidVariable @@ -127,7 +128,7 @@ syn cluster crystalExtendedStringSpecial contains=@crystalStringSpecial,crystalN syn cluster crystalRegexpSpecial contains=crystalInterpolation,crystalNoInterpolation,crystalStringEscape,crystalRegexpSpecial,crystalRegexpEscape,crystalRegexpBrackets,crystalRegexpCharClass,crystalRegexpDot,crystalRegexpQuantifier,crystalRegexpAnchor,crystalRegexpParens,crystalRegexpComment " Numbers and ASCII Codes -syn match crystalASCIICode "\%(\w\|[]})\"'/]\)\@" display syn match crystalInteger "\<0o[0-7_]\+\%([ui]\%(8\|16\|32\|64\|128\)\)\=\>" display syn match crystalInteger "\<0b[01_]\+\%([ui]\%(8\|16\|32\|64\|128\)\)\=\>" display @@ -135,33 +136,33 @@ syn match crystalInteger "\<\d[[:digit:]_]*\%([ui]\%(8\|16\|32\|64\|128\)\|f\% syn match crystalFloat "\<\d[[:digit:]_]*\.\d[[:digit:]_]*\%(f\%(32\|64\)\)\=\>" contains=crystalInvalidInteger display syn match crystalFloat "\<\d[[:digit:]_]*\%(\.\d[[:digit:]_]*\)\=\%([eE][-+]\=[[:digit:]_]\+\)\%(f\%(32\|64\)\)\=\>" contains=crystalInvalidInteger display " Note: 042 is invalid but 0, 0_, 0_u8 and 0_1 are valid (#73) -syn match crystalInvalidInteger "\.\@" contained containedin=crystalFloat,crystalInteger display +syn match crystalInvalidInteger "\%(\.\|[eE][+-]\)\@2" contained containedin=crystalFloat,crystalInteger display " Identifiers syn match crystalLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent syn match crystalBlockArgument "&[_[:lower:]][_[:alnum:]]" contains=NONE display transparent -syn match crystalTypeName "\%(\%([.@$]\@\|::\)\@=" contained -syn match crystalClassName "\%(\%([.@$]\@\|::\)\@=" contained -syn match crystalModuleName "\%(\%([.@$]\@\|::\)\@=" contained -syn match crystalStructName "\%(\%([.@$]\@\|::\)\@=" contained -syn match crystalLibName "\%(\%([.@$]\@\|::\)\@=" contained -syn match crystalEnumName "\%(\%([.@$]\@\|::\)\@=" contained -syn match crystalConstant "\%(\%([.@$]\@\|::\)\@=" +syn match crystalTypeName "\%(\%([.@$]\@1\|::\)\@=" contained +syn match crystalClassName "\%(\%([.@$]\@1\|::\)\@=" contained +syn match crystalModuleName "\%(\%([.@$]\@1\|::\)\@=" contained +syn match crystalStructName "\%(\%([.@$]\@1\|::\)\@=" contained +syn match crystalLibName "\%(\%([.@$]\@1\|::\)\@=" contained +syn match crystalEnumName "\%(\%([.@$]\@1\|::\)\@=" contained +syn match crystalConstant "\%(\%([.@$]\@1\|::\)\@=" syn match crystalClassVariable "@@\%(\h\|%\|[^\x00-\x7F]\)\%(\w\|%\|[^\x00-\x7F]\)*" display syn match crystalInstanceVariable "@\%(\h\|%\|[^\x00-\x7F]\)\%(\w\|%\|[^\x00-\x7F]\)*" display syn match crystalGlobalVariable "$\%(\%(\h\|%\|[^\x00-\x7F]\)\%(\w\|%\|[^\x00-\x7F]\)*\|-.\)" -syn match crystalFreshVariable "\%(\h\|[^\x00-\x7F]\)\@\|<=\|<\|===\|[=!]=\|[=!]\~\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[][=?]\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" -syn match crystalSymbol "[]})\"':]\@_,;:!?/.'"@$*\&+0]\)" -syn match crystalSymbol "[]})\"':]\@\@!\)\=" +syn match crystalFreshVariable "\%(\h\|[^\x00-\x7F]\)\@1\|<=\|<\|===\|[=!]=\|[=!]\~\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[][=?]\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" +syn match crystalSymbol "[]})\"':]\@1_,;:!?/.'"@$*\&+0]\)" +syn match crystalSymbol "[]})\"':]\@1\@!\)\=" syn match crystalSymbol "\%([{(,]\_s*\)\@<=\l\w*[!?]\=::\@!"he=e-1 -syn match crystalSymbol "[]})\"':]\@\|{\)\s*\)\@<=|" end="|" oneline display contains=crystalBlockParameter @@ -173,18 +174,18 @@ syn match crystalPredefinedVariable "$_\>" display syn match crystalPredefinedVariable "$-[0FIKadilpvw]\>" display syn match crystalPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>" display syn match crystalPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display -syn match crystalPredefinedConstant "\%(\%(\.\@\%(\s*(\)\@!" -syn match crystalPredefinedConstant "\%(\%(\.\@\%(\s*(\)\@!" -syn match crystalPredefinedConstant "\%(\%(\.\@\%(\s*(\)\@!" -syn match crystalPredefinedConstant "\%(\%(\.\@\%(\s*(\)\@!" +syn match crystalPredefinedConstant "\%(\%(\.\@1\%(\s*(\)\@!" +syn match crystalPredefinedConstant "\%(\%(\.\@1\%(\s*(\)\@!" +syn match crystalPredefinedConstant "\%(\%(\.\@1\%(\s*(\)\@!" +syn match crystalPredefinedConstant "\%(\%(\.\@1\%(\s*(\)\@!" " Normal Regular Expression SynFold '/' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|ifdef\|when\|not\|then\|else\)\|[;\~=!|&(,[<>?:*+-]\)\s*\)\@<=/" end="/[imx]*" skip="\\\\\|\\/" contains=@crystalRegexpSpecial SynFold '/' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=/]\@!" end="/[imx]*" skip="\\\\\|\\/" contains=@crystalRegexpSpecial " Generalized Regular Expression -SynFold '%' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="%r{" end="}[imx]*" skip="\\\\\|\\}" contains=@crystalRegexpSpecial -SynFold '%' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="%r<" end=">[imx]*" skip="\\\\\|\\>" contains=@crystalRegexpSpecial,crystalNestedAngleBrackets,crystalDelimEscape +SynFold '%' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="%r{" end="}[imx]*" skip="\\\\\|\\}" contains=@crystalRegexpSpecial,crystalNestedRawCurlyBraces +SynFold '%' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="%r<" end=">[imx]*" skip="\\\\\|\\>" contains=@crystalRegexpSpecial,crystalNestedRawAngleBrackets SynFold '%' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="%r\[" end="\][imx]*" skip="\\\\\|\\\]" contains=@crystalRegexpSpecial SynFold '%' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="%r(" end=")[imx]*" skip="\\\\\|\\)" contains=@crystalRegexpSpecial SynFold '%' syn region crystalRegexp matchgroup=crystalRegexpDelimiter start="%r|" end="|[imx]*" skip="\\\\\|\\|" contains=@crystalRegexpSpecial @@ -228,10 +229,10 @@ SynFold '%' syn region crystalString matchgroup=crystalStringDelimiter start="%[ SynFold '%' syn region crystalString matchgroup=crystalStringDelimiter start="%[Qx]\=|" end="|" skip="\\\\\|\\|" contains=@crystalStringSpecial,crystalDelimEscape " Here Document -syn region crystalHeredocStart matchgroup=crystalStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=crystalAliasDeclaration,crystalAliasDeclaration2,crystalMethodDeclaration,crystalFunctionDeclaration +syn match crystalFunction "\%(\s\|^\)\@1<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=crystalAliasDeclaration,crystalAliasDeclaration2 +syn match crystalFunction "\%([[:space:].]\|^\)\@1<=\%(\[\][=?]\=\|\*\*\|[+-]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=crystalAliasDeclaration,crystalAliasDeclaration2,crystalMethodDeclaration,crystalFunctionDeclaration syn cluster crystalDeclaration contains=crystalAliasDeclaration,crystalAliasDeclaration2,crystalMethodDeclaration,crystalFunctionDeclaration,crystalModuleDeclaration,crystalClassDeclaration,crystalStructDeclaration,crystalLibDeclaration,crystalMacroDeclaration,crystalFunction,crystalBlockParameter,crystalTypeDeclaration,crystalEnumDeclaration @@ -285,28 +286,28 @@ if !exists('b:crystal_no_expensive') && !exists('g:crystal_no_expensive') syn match crystalMacro "\" nextgroup=crystalMacroDeclaration skipwhite skipnl syn match crystalEnum "\" nextgroup=crystalEnumDeclaration skipwhite skipnl - SynFold 'def' syn region crystalMethodBlock start="\<\%(def\|macro\)\>" matchgroup=crystalDefine end="\%(\<\%(def\|macro\)\_s\+\)\@" contains=ALLBUT,@crystalNotTop - SynFold 'class' syn region crystalBlock start="\" matchgroup=crystalClass end="\" contains=ALLBUT,@crystalNotTop - SynFold 'module' syn region crystalBlock start="\" matchgroup=crystalModule end="\" contains=ALLBUT,@crystalNotTop - SynFold 'struct' syn region crystalBlock start="\" matchgroup=crystalStruct end="\" contains=ALLBUT,@crystalNotTop - SynFold 'lib' syn region crystalBlock start="\" matchgroup=crystalLib end="\" contains=ALLBUT,@crystalNotTop - SynFold 'enum' syn region crystalBlock start="\" matchgroup=crystalEnum end="\" contains=ALLBUT,@crystalNotTop + SynFold 'def' syn region crystalMethodBlock start="\<\%(def\|macro\)\>" matchgroup=crystalDefine end="\%(\<\%(def\|macro\)\_s\+\)\@" contains=TOP + SynFold 'class' syn region crystalBlock start="\" matchgroup=crystalClass end="\" contains=TOP + SynFold 'module' syn region crystalBlock start="\" matchgroup=crystalModule end="\" contains=TOP + SynFold 'struct' syn region crystalBlock start="\" matchgroup=crystalStruct end="\" contains=TOP + SynFold 'lib' syn region crystalBlock start="\" matchgroup=crystalLib end="\" contains=TOP + SynFold 'enum' syn region crystalBlock start="\" matchgroup=crystalEnum end="\" contains=TOP " modifiers syn match crystalConditionalModifier "\<\%(if\|unless\|ifdef\)\>" display - syn match crystalRepeatModifier "\<\%(while\|until\)\>" display - SynFold 'do' syn region crystalDoBlock matchgroup=crystalControl start="\" end="\" contains=ALLBUT,@crystalNotTop + SynFold 'do' syn region crystalDoBlock matchgroup=crystalControl start="\" end="\" contains=TOP " curly bracket block or hash literal - SynFold '{' syn region crystalCurlyBlock matchgroup=crystalCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@crystalNotTop - SynFold '[' syn region crystalArrayLiteral matchgroup=crystalArrayDelimiter start="\%(\w\|[\]})]\)\@" end="\" contains=ALLBUT,@crystalNotTop - SynFold 'case' syn region crystalCaseExpression matchgroup=crystalConditional start="\" end="\" contains=ALLBUT,@crystalNotTop - SynFold 'select' syn region crystalSelectExpression matchgroup=crystalConditional start="\" end="\" contains=ALLBUT,@crystalNotTop - SynFold 'if' syn region crystalConditionalExpression matchgroup=crystalConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@" end="\%(\%(\%(\.\@" contains=ALLBUT,@crystalNotTop + SynFold 'begin' syn region crystalBlockExpression matchgroup=crystalControl start="\" end="\" contains=TOP + SynFold 'while' syn region crystalRepeatExpression matchgroup=crystalRepeat start="\<\%(while\|until\)\>" end="\" contains=TOP + SynFold 'case' syn region crystalCaseExpression matchgroup=crystalConditional start="\" end="\" contains=TOP + SynFold 'select' syn region crystalSelectExpression matchgroup=crystalConditional start="\" end="\" contains=TOP + SynFold 'if' syn region crystalConditionalExpression matchgroup=crystalConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@" end="\%(\%(\%(\.\@1" contains=TOP syn match crystalConditional "\<\%(then\|else\|when\)\>[?!]\@!" contained containedin=crystalCaseExpression syn match crystalConditional "\<\%(when\|else\)\>[?!]\@!" contained containedin=crystalSelectExpression @@ -336,10 +337,7 @@ else endif " Link attribute -syn region crystalLinkAttrRegion start="@\[" nextgroup=crystalLinkAttrRegionInner end="]" contains=crystalLinkAttr,crystalLinkAttrRegionInner transparent display oneline -syn region crystalLinkAttrRegionInner start="\%(@\[\)\@<=" end="]\@=" contained contains=ALLBUT,@crystalNotTop transparent display oneline -syn match crystalLinkAttr "@\[" contained containedin=crystalLinkAttrRegion display -syn match crystalLinkAttr "]" contained containedin=crystalLinkAttrRegion display +syn region crystalLinkAttr matchgroup=crystalLinkAttrDelim start="@\[" end="]" contains=TOP display oneline " Special Methods if !exists('g:crystal_no_special_methods') @@ -358,42 +356,56 @@ endif " Macro " Note: This definition must be put after crystalNestedCurlyBraces to give higher priority -syn region crystalMacroRegion matchgroup=crystalMacroDelim start="\\\={%" end="%}" oneline display contains=TOP,@crystalExpensive containedin=ALL -syn region crystalMacroRegion matchgroup=crystalMacroDelim start="\\\={{" end="}}" oneline display contains=TOP,@crystalExpensive containedin=ALL +syn region crystalMacroRegion matchgroup=crystalMacroDelim start="\\\={%" end="%}" oneline display contains=@crystalMacroGroup containedin=ALL +syn region crystalMacroRegion matchgroup=crystalMacroDelim start="\\\={{" end="}}" oneline display contains=@crystalMacroGroup containedin=ALL + +" Cluster for groups that can appear inside macro expressions +syn cluster crystalMacroGroup contains=@crystalTop " Cluster for Expensive Mode groups that can't appear inside macro " regions syn cluster crystalExpensive contains= - \ crystalMethodBlock,crystalBlock,crystalDoBlock,crystalBlockExpression,crystalCaseExpression, - \ crystalSelectExpression,crystalConditionalExpression + \ crystalMethodBlock,crystalBlock,crystalDoBlock,crystalBlockExpression,crystalRepeatExpression, + \ crystalCaseExpression,crystalSelectExpression,crystalConditionalExpression + +syn cluster crystalMacroGroup remove=@crystalExpensive " Some keywords will have to be redefined for them to be highlighted " properly -syn keyword crystalMacroKeyword contained containedin=crystalMacroRegion - \ if else elsif end for in begin do -syn cluster crystalNotTop add=crystalMacroKeyword +syn keyword crystalMacroKeyword contained + \ if else elsif end for in begin do case when while until loop + \ rescue ensure + +syn cluster crystalMacroGroup add=crystalMacroKeyword " Comments and Documentation syn match crystalSharpBang "\%^#!.*" display syn keyword crystalTodo FIXME NOTE TODO OPTIMIZE XXX todo contained -syn match crystalComment "#.*" contains=crystalSharpBang,crystalSpaceError,crystalTodo,@Spell + +if exists('g:main_syntax') && g:main_syntax ==# 'ecrystal' + " eCrystal tags can contain Crystal comments, so we need to modify the + " pattern for comments so that it does not consume delimiters + syn match crystalComment "#.*\ze\%($\|-\=%>\)" contains=crystalSharpBang,crystalSpaceError,crystalTodo,@Spell +else + syn match crystalComment "#.*" contains=crystalSharpBang,crystalSpaceError,crystalTodo,@Spell +endif SynFold '#' syn region crystalMultilineComment start="\%(\%(^\s*#.*\n\)\@" transparent contains=NONE -syn match crystalKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match crystalKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match crystalKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE syn match crystalKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]" transparent contains=NONE syn match crystalKeywordAsMethod "\<\%(if\|ifdef\|module\|undef\|unless\|until\|while\)[?!]" transparent contains=NONE -syn match crystalKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match crystalKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match crystalKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match crystalKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match crystalKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE +syn match crystalKeywordAsMethod "\%(\%(\.\@1" transparent contains=NONE hi def link crystalClass crystalDefine hi def link crystalModule crystalDefine @@ -407,7 +419,6 @@ hi def link crystalConditional Conditional hi def link crystalConditionalModifier crystalConditional hi def link crystalExceptional crystalConditional hi def link crystalRepeat Repeat -hi def link crystalRepeatModifier crystalRepeat hi def link crystalControl Statement hi def link crystalInclude Include hi def link crystalRecord Statement @@ -465,7 +476,7 @@ hi def link crystalRegexp crystalString hi def link crystalMacro PreProc hi def link crystalMacroDelim crystalMacro hi def link crystalMacroKeyword crystalKeyword -hi def link crystalLinkAttr crystalMacro +hi def link crystalLinkAttrDelim crystalMacro hi def link crystalError Error hi def link crystalInvalidVariable crystalError hi def link crystalSpaceError crystalError -- cgit v1.2.3