" Vim syntax file " Language: Luau " Maintainer: Lopy (@lopi-py) " Last Change: 2026 Jun 17 " quit when a syntax file was already loaded if exists("b:current_syntax") finish endif let s:cpo_save = &cpo set cpo&vim syn case match syn sync minlines=300 " comments syn keyword luauTodo contained TODO FIXME syn match luauDirective contained "--!\%(strict\|nonstrict\|nocheck\|nolint\%(Global\)\=\|native\|optimize\)\>.*" " strings syn match luauSpecial contained #\\[[:digit:]]\{1,3}\|\\x[[:xdigit:]]\{2}\|\\u{[[:xdigit:]]\+}\|\\z\s*\|\\\n\|\\[^xu[:digit:]\r\n]# syn region luauString2 matchgroup=luauStringDelimiter start="\[\z(=*\)\[" end="\]\z1\]" contains=@Spell syn region luauString matchgroup=luauStringDelimiter start=+'+ end=+'+ skip=+\\\\\|\\'+ contains=luauSpecial,@Spell syn region luauString matchgroup=luauStringDelimiter start=+"+ end=+"+ skip=+\\\\\|\\"+ contains=luauSpecial,@Spell syn region luauInterpString matchgroup=luauStringDelimiter start=+`+ end=+`+ skip=+\\`+ contains=luauSpecial,luauInterp,@Spell syn region luauInterp contained transparent matchgroup=luauInterpDelimiter start=+\\\@" syn match luauNumber "\<0_*[bB][01_]*[01][01_]*\>" syn match luauNumber "\<\d[[:digit:]_]*\%(\.[[:digit:]_]*\)\=\%([eE][-+]\=[[:digit:]_]*\d[[:digit:]_]*\)\=\>" syn match luauNumber "\.\d[[:digit:]_]*\%([eE][-+]\=[[:digit:]_]*\d[[:digit:]_]*\)\=\>" " keywords syn keyword luauStatement return local break end syn keyword luauStatement do nextgroup=luauStatement skipwhite syn keyword luauStatement contained continue syn match luauStatement "^\s*\zscontinue\>\ze\s*\%(;\|end\>\|else\>\|elseif\>\|until\>\|--.*\|$\)" syn match luauStatement ";\s*\zscontinue\>\ze\s*\%(;\|end\>\|else\>\|elseif\>\|until\>\|--.*\|$\)" syn keyword luauFunction function nextgroup=luauFunctionName,luauGenericParams skipwhite syn match luauStatement "^\s*\%(@\%(\h\w*\|\[[^]]*\]\)\s*\)*\zsconst\>\ze\s\+\%(function\>\|\h\)" syn match luauStatement "^\s*\%(@\%(\h\w*\|\[[^]]*\]\)\s*\)*\zsdeclare\>\ze\s\+\%(function\>\|class\>\s\+\h\|extern\s\+type\>\|\h\w*\s*:\)" nextgroup=luauStatement,luauDeclareName,luauFunction skipwhite syn match luauStatement contained "\\ze\s\+\h" nextgroup=luauTypedef skipwhite syn match luauDeclareName contained "\h\w*\ze\s*:" nextgroup=luauTypeColon skipwhite syn match luauStatement "\\ze\s\+type\>" syn match luauStatement contained "\\ze\s\+type\>" syn match luauStatement "\\ze\s\+\h" nextgroup=luauTypeName skipwhite syn match luauStatement "\\ze\s*\%(--.*\)\=$" syn match luauModifier "\\ze\s\+\%(function\|\h\)" syn match luauTypeKeyword "\\ze\s\+\h" nextgroup=luauTypeFunction,luauTypedef skipwhite syn keyword luauTypeFunction contained function nextgroup=luauFunctionName skipwhite syn match luauFunctionName contained transparent "\h\w*\%([.:]\h\w*\)*" nextgroup=luauGenericParams skipwhite syn keyword luauCond if elseif syn keyword luauCond then else nextgroup=luauStatement skipwhite syn keyword luauRepeat while for until in syn keyword luauRepeat repeat nextgroup=luauStatement skipwhite syn keyword luauOperator and or not " operators and punctuation syn match luauSymbolOperator "[#+*/%^=<>~?-]\|\.\{3}\|\.\.=\=" syn match luauSymbolOperator "->" nextgroup=luauSymbolOperator,luauConstant,luauTableType,luauTypePack,luauTypeName skipwhite syn match luauSymbolOperator "[|&]" nextgroup=luauConstant,luauTableType,luauTypePack,luauTypeName skipwhite syn match luauSymbolOperator "::" " tables syn region luauTableBlock transparent matchgroup=luauTable start="{" end="}" contains=TOP,luauStatement syn match luauComment "--.*$" contains=luauTodo,luauDirective,@Spell syn region luauComment matchgroup=luauCommentDelimiter start="--\[\z(=*\)\[" end="\]\z1\]" contains=luauTodo,@Spell " the first line may start with #! syn match luauComment "\%^#!.*" " attributes syn match luauAttribute "@\h\w*" syn region luauAttributeBlock matchgroup=luauAttributeDelimiter start="@\[" end="\]" contains=luauAttributeName,luauAttributeTable,luauString,luauString2,luauInterpString,luauNumber,luauConstant syn region luauAttributeTable contained transparent matchgroup=luauTable start="{" end="}" contains=luauAttributeTable,luauString,luauString2,luauInterpString,luauNumber,luauConstant,luauSymbolOperator syn keyword luauAttributeName contained checked native deprecated " constants and types syn keyword luauConstant nil true false syn match luauConstant "\.\.\." syn keyword luauSelf self syn match luauSelf contained "(\s*\zsself\>\ze\s*:" syn cluster luauTypeCommon contains=luauGenericParams,luauString,luauString2,luauInterpString,luauNumber,luauConstant,luauSymbolOperator syn cluster luauTypeExpr contains=luauFunctionTypeParams,luauTableType,luauTypeParam,luauType,luauTypeKeyword,@luauTypeCommon syn region luauGenericParams contained transparent matchgroup=luauSymbolOperator start="<" end=">" contains=@luauTypeExpr syn region luauTypedefGenericParams contained transparent matchgroup=luauSymbolOperator start="<" end=">" contains=@luauTypeExpr nextgroup=luauTypeAliasAssign skipwhite syn region luauExplicitTypeArgs transparent matchgroup=luauSymbolOperator start="<<" end=">>" contains=@luauTypeExpr syn match luauTypeParam contained "\h\w*\%(\.\.\.\)\=" syn match luauTypedef "\h\w*" contained nextgroup=luauTypedefGenericParams,luauTypeAliasAssign skipwhite syn match luauTypeAliasAssign contained "=" nextgroup=luauSymbolOperator,luauConstant,luauTableType,luauTypeName skipwhite syn region luauTableType contained transparent matchgroup=luauTable start="{" end="}" contains=luauFunctionTypeParams,luauTableType,luauSelf,luauTypeIndexer,luauTableElementType,luauTypeColon,luauTypeKeyword,@luauTypeCommon syn match luauTypeIndexer "^\s*\[\s*" nextgroup=luauType skipwhite syn match luauTypeIndexer contained transparent "\[\s*" nextgroup=luauType skipwhite syn match luauType contained "\h\w*\%(\.\h\w*\)*\ze\s*\]\s*:" nextgroup=luauGenericParams skipwhite syn match luauTableElementType contained "\h\w*\%(\.\h\w*\)*\ze\s*[\|$\)" nextgroup=luauGenericParams skipwhite syn region luauFunctionTypeParams transparent start="(\ze\%([^()]*\))\s*->" end=")\ze\s*->" contains=luauFunctionTypeParam,luauTypeColon,luauSelf,@luauTypeCommon syn match luauFunctionTypeParam contained "\h\w*\%(\.\h\w*\)*\%(\.\.\.\)\=\ze\s*?\=\s*[,)|&]" nextgroup=luauGenericParams skipwhite syn match luauFunctionReturnStart transparent ")\s*:\s*" nextgroup=luauSymbolOperator,luauFunctionTypeParams,luauConstant,luauTableType,luauTypePack,luauTypeName skipwhite syn region luauTypePack contained transparent start="(\%([^()]*)\s*->\)\@!" end=")" contains=luauFunctionTypeParams,luauTableType,luauTypeName,@luauTypeCommon syn match luauTypeName contained "\h\w*\%(\.\h\w*\)*\%(\.\.\.\)\=" nextgroup=luauGenericParams skipwhite syn match luauTypeKeyword "\<\%(read\|write\)\>\ze\s*\%(\[\|\h\+\s*:\)" nextgroup=luauTypeIndexer skipwhite " metamethods syn keyword luauMetaMethod __index __newindex __mode __namecall __call __iter __len syn keyword luauMetaMethod __eq __add __sub __mul __div __idiv __mod __pow __unm syn keyword luauMetaMethod __lt __le __concat __type __metatable __tostring " methods syn match luauMethodColon transparent ":\ze\s*\h\w*\s*\%(<<.\{-}>>\s*\|<[^>]*>\s*\)\=\%((\|{\|'\|\"\|\[\)" nextgroup=luauFunc skipwhite syn match luauFunc contained "\h\w*\ze\s*\%(<<.\{-}>>\s*\|<[^>]*>\s*\)\=\%((\|{\|'\|\"\|\[\)" " global functions and values syn keyword luauFunc assert error gcinfo getfenv getmetatable syn keyword luauFunc ipairs loadstring newproxy next pairs pcall print syn keyword luauFunc rawequal rawget rawlen rawset require select setfenv syn keyword luauFunc setmetatable tonumber tostring unpack xpcall syn keyword luauGlobal _G syn keyword luauBuiltinConstant _VERSION syn match luauFunc "\\ze\s*\%(<<.\{-}>>\s*\)\=(" syn match luauFunc "\\ze\s*\%(<<.\{-}>>\s*\)\=(" " standard library members syn match luauFunc /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauBuiltinConstant /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauFunc /\/ syn match luauBuiltinConstant /\/ syn match luauFunc /\/ syn match luauBuiltinConstant /\/ syn match luauFunc /\/ " define the default highlighting hi def link luauStatement Statement hi def link luauRepeat Repeat hi def link luauString String hi def link luauString2 String hi def link luauInterpString String hi def link luauStringDelimiter luauString hi def link luauInterpDelimiter Special hi def link luauNumber Number hi def link luauOperator Operator hi def link luauSymbolOperator luauOperator hi def link luauConstant Constant hi def link luauCond Conditional hi def link luauFunction Function hi def link luauMetaMethod Function hi def link luauTable Structure hi def link luauComment Comment hi def link luauCommentDelimiter luauComment hi def link luauDirective PreProc hi def link luauTodo Todo hi def link luauSpecial SpecialChar hi def link luauFunc Identifier hi def link luauGlobal Identifier hi def link luauBuiltinConstant Constant hi def link luauSelf Identifier hi def link luauModifier StorageClass hi def link luauType Type hi def link luauTypeAfterColon luauType hi def link luauTableElementType luauType hi def link luauTypeAliasAssign luauSymbolOperator hi def link luauFunctionTypeParam luauType hi def link luauTypeName luauType hi def link luauTypedef Typedef hi def link luauTypeParam Type hi def link luauTypeKeyword Keyword hi def link luauTypeFunction luauFunction hi def link luauDeclareName Identifier hi def link luauAttribute PreProc hi def link luauAttributeName PreProc hi def link luauAttributeDelimiter PreProc let b:current_syntax = "luau" let &cpo = s:cpo_save unlet s:cpo_save " vim: nowrap sw=2 sts=2 ts=8 noet: