" Vim syntax file the OpenGL Shading Language " Language: GLSL " Author: Nathan Cournia " Date: June 4, 2004 " File Types: .frag .vert .glsl .fp .vp " Version: 1.00.01 " Notes: Adapted from c.vim - Bram Moolenaar " Adapted from cg.vim - Kevin Bjorke " For version 5.x: Clear all syntax items " For version 6.x: Quit when a syntax file was already loaded if version < 600 syntax clear elseif exists("b:current_syntax") finish endif " a bunch of useful keywords syn keyword glslStatement break return continue discard syn keyword glslConditional if else syn keyword glslRepeat while for do syn keyword glslTodo contained TODO FIXME XXX " glslCommentGroup allows adding matches for special things in comments syn cluster glslCommentGroup contains=glslTodo "catch errors caused by wrong parenthesis and brackets syn cluster glslParenGroup contains=glslParenError,glslIncluded,glslSpecial,glslCommentSkip,glslCommentString,glslComment2String,@glslCommentGroup,glslCommentStartError,glslUserCont,glslUserLabel,glslBitField,glslCommentSkip,glslOctalZero,glslCppOut,glslCppOut2,glslCppSkip,glslFormat,glslNumber,glslFloat,glslOctal,glslOctalError,glslNumbersCom if exists("c_no_bracket_error") syn region glslParen transparent start='(' end=')' contains=ALLBUT,@glslParenGroup,glslCppParen,glslCppString " glslCppParen: same as glslParen but ends at end-of-line; used in glslDefine syn region glslCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@glslParenGroup,glslParen,glslString syn match glslParenError display ")" syn match glslErrInParen display contained "[{}]" else syn region glslParen transparent start='(' end=')' contains=ALLBUT,@glslParenGroup,glslCppParen,glslErrInBracket,glslCppBracket,glslCppString " glslCppParen: same as glslParen but ends at end-of-line; used in glslDefine syn region glslCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@glslParenGroup,glslErrInBracket,glslParen,glslBracket,glslString syn match glslParenError display "[\])]" syn match glslErrInParen display contained "[\]{}]" syn region glslBracket transparent start='\[' end=']' contains=ALLBUT,@glslParenGroup,glslErrInParen,glslCppParen,glslCppBracket,glslCppString " glslCppBracket: same as glslParen but ends at end-of-line; used in glslDefine syn region glslCppBracket transparent start='\[' skip='\\$' excludenl end=']' end='$' contained contains=ALLBUT,@glslParenGroup,glslErrInParen,glslParen,glslBracket,glslString syn match glslErrInBracket display contained "[);{}]" endif "integer number, or floating point number without a dot and with "f". syn case ignore syn match glslNumbers display transparent "\<\d\|\.\d" contains=glslNumber,glslFloat,glslOctalError,glslOctal " Same, but without octal error (for comments) syn match glslNumbersCom display contained transparent "\<\d\|\.\d" contains=glslNumber,glslFloat,glslOctal syn match glslNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>" "hex number syn match glslNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>" " Flag the first zero of an octal number as something special syn match glslOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=glslOctalZero syn match glslOctalZero display contained "\<0" syn match glslFloat display contained "\d\+f" "floating point number, with dot, optional exponent syn match glslFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=" "floating point number, starting with a dot, optional exponent syn match glslFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>" "floating point number, without dot, with exponent syn match glslFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>" " flag an octal number with wrong digits syn match glslOctalError display contained "0\o*[89]\d*" syn case match if exists("c_comment_strings") " A comment can contain glslString, glslCharacter and glslNumber. " But a "*/" inside a glslString in a glslComment DOES end the comment! So we " need to use a special type of glslString: glslCommentString, which also ends on " "*/", and sees a "*" at the start of the line as glslomment again. " Unfortunately this doesn't very well work for // type of comments :-( syntax match glslCommentSkip contained "^\s*\*\($\|\s\+\)" syntax region glslCommentString contained start=+L\=\\\@" skip="\\$" end="$" end="//"me=s-1 contains=glslComment,glslCppString,glslCharacter,glslCppParen,glslParenError,glslNumbers,glslCommentError,glslSpaceError syn match glslPreCondit display "^\s*#\s*\(else\|endif\)\>" syn region glslCppOut start="^\s*#\s*if\s\+0\+\>" end=".\|$" contains=glslCppOut2 syn region glslCppOut2 contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=glslSpaceError,glslCppSkip syn region glslCppSkip contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=glslSpaceError,glslCppSkip "syn match glslLineSkip "\\$" syn cluster glslPreProglslGroup contains=glslPreCondit,glslIncluded,glslInclude,glslDefine,glslErrInParen,glslErrInBracket,glslUserLabel,glslSpecial,glslOctalZero,glslCppOut,glslCppOut2,glslCppSkip,glslFormat,glslNumber,glslFloat,glslOctal,glslOctalError,glslNumbersCom,glslString,glslCommentSkip,glslCommentString,glslComment2String,@glslCommentGroup,glslCommentStartError,glslParen,glslBracket,glslMulti syn region glslDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@glslPreProglslGroup syn region glslPreProc start="^\s*#\s*\(pragma\>\|line\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@glslPreProglslGroup " Highlight User Labels syn cluster glslMultiGroup contains=glslIncluded,glslSpecial,glslCommentSkip,glslCommentString,glslComment2String,@glslCommentGroup,glslCommentStartError,glslUserCont,glslUserLabel,glslBitField,glslOctalZero,glslCppOut,glslCppOut2,glslCppSkip,glslFormat,glslNumber,glslFloat,glslOctal,glslOctalError,glslNumbersCom,glslCppParen,glslCppBracket,glslCppString syn region glslMulti transparent start='?' skip='::' end=':' contains=ALLBUT,@glslMultiGroup " Avoid matching foo::bar() in C++ by requiring that the next char is not ':' syn cluster glslLabelGroup contains=glslUserLabel syn match glslUserCont display "^\s*\I\i*\s*:$" contains=@glslLabelGroup syn match glslUserCont display ";\s*\I\i*\s*:$" contains=@glslLabelGroup syn match glslUserCont display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@glslLabelGroup syn match glslUserCont display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@glslLabelGroup syn match glslUserLabel display "\I\i*" contained " Avoid recognizing most bitfields as labels syn match glslBitField display "^\s*\I\i*\s*:\s*[1-9]"me=e-1 syn match glslBitField display ";\s*\I\i*\s*:\s*[1-9]"me=e-1 " vertex attributes syn keyword glslState gl_Color gl_SecondaryColor gl_Normal gl_Vertex gl_FogCoord syn match glslState display "gl_MultiTexCoord\d\+" " vertex output variables syn keyword glslState gl_Position gl_PointSize gl_ClipVertex " varying variables syn keyword glslState gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord " fragment special input vars syn keyword glslState gl_FragColor gl_FrontFacing " fragment special output vars syn keyword glslState gl_FragDepth " uniforms syn keyword glslUniform gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_NormalMatrix gl_TextureMatrix syn keyword glslUniform gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial syn keyword glslUniform gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct syn keyword glslUniform gl_FrontLightProduct gl_BackLightProduct glTextureEnvColor syn keyword glslUniform gl_TextureEnvColor gl_Fog syn match glslUniform display "gl_EyePlane[STRQ]" syn match glslUniform display "gl_ObjectPlane[STRQ]" " uniform types syn keyword glslType gl_DepthRangeParameters gl_PointParameters gl_MaterialParameters syn keyword glslType gl_LightSourceParameters gl_LightModelParameters gl_LightModelProducts syn keyword glslType gl_LightProducts gl_FogParameters " constants syn keyword glslConstant gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs syn keyword glslConstant gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits syn keyword glslConstant gl_MaxFragmentUniformComponents gl_MaxCombinedTextureImageUnits " swizzling syn match glslSwizzle /\.[xyzw]\{1,4\}/ syn match glslSwizzle /\.[rgba]\{1,4\}/ syn match glslSwizzle /\.[stpq]\{1,4\}/ " built in functions syn keyword glslFunc radians degrees sin cos tan asin acos atan pow exp2 log2 sqrt inversesqrt syn keyword glslFunc abs sign floor ceil fract mod min max clamp mix step smoothstep syn keyword glslFunc length distance dot cross normalize ftransform faceforward reflect syn keyword glslFunc matrixcompmult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not syn keyword glslFunc texture1D texture1DProj texture1DLod texture1DProjLod syn keyword glslFunc texture2D texture2DProj texture2DLod texture2DProjLod syn keyword glslFunc texture3D texture3DProj texture3DLod texture3DProjLod syn keyword glslFunc textureCube textureCubeLod syn keyword glslFunc shadow1D shadow1DProj shadow1DLod shadow1DProjLod syn keyword glslFunc shadow2D shadow2DProj shadow2DLod shadow2DProjLod syn keyword glslFunc dFdx dFdy fwidth noise1 noise2 noise3 noise4 " highlight unsupported keywords syn keyword glslUnsupported asm class union enum typedef template goto switch default inline noinline syn keyword glslUnsupported volatile public static extern external long short double half fixed unsigned syn keyword glslUnsupported input output hvec2 hvec3 hvec4 dvec2 dvec3 dvec4 fvec2 fvec3 fvec4 syn keyword glslUnsupported sampler2DRect sampler3DRect sizeof cast namespace using "wtf? "let b:c_minlines = 50 " #if 0 constructs can be long "exec "syn sync ccomment glslComment minlines=" . b:c_minlines " Define the default highlighting. " For version 5.7 and earlier: only when not done already " For version 5.8 and later: only when an item doesn't have highlighting yet if version >= 508 || !exists("did_glsl_syn_inits") if version < 508 let did_glsl_syn_inits = 1 command -nargs=+ HiLink hi link else command -nargs=+ HiLink hi def link endif HiLink glslFormat glslSpecial HiLink glslCppString glslString HiLink glslCommentL glslComment HiLink glslCommentStart glslComment HiLink glslLabel Label HiLink glslUserLabel Label HiLink glslConditional Conditional HiLink glslRepeat Repeat HiLink glslCharacter Character HiLink glslSpecialCharacter glslSpecial HiLink glslNumber Number HiLink glslOctal Number HiLink glslOctalZero PreProc " link this to Error if you want HiLink glslFloat Float HiLink glslOctalError glslError HiLink glslParenError glslError HiLink glslErrInParen glslError HiLink glslErrInBracket glslError HiLink glslCommentError glslError HiLink glslCommentStartError glslError HiLink glslSpaceError glslError HiLink glslSpecialError glslError HiLink glslOperator Operator HiLink glslStructure Structure HiLink glslStorageClass StorageClass HiLink glslInclude Include HiLink glslPreProc PreProc HiLink glslDefine Macro HiLink glslIncluded glslString HiLink glslError Error HiLink glslStatement Statement HiLink glslPreCondit PreCondit HiLink glslType Type HiLink glslConstant Constant HiLink glslCommentString glslString HiLink glslComment2String glslString HiLink glslCommentSkip glslComment HiLink glslString String HiLink glslComment Comment HiLink glslSpecial SpecialChar HiLink glslSwizzle SpecialChar HiLink glslTodo Todo HiLink glslCppSkip glslCppOut HiLink glslCppOut2 glslCppOut HiLink glslCppOut Comment HiLink glslUniform glslType HiLink glslState glslType HiLink glslFunc glslStatement HiLink glslUnsupported glslError delcommand HiLink endif let b:current_syntax = "glsl" " vim: ts=8